1. C# / Говнокод #3378

    +122

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    SqlCommand SomeCommand = new SqlCommand(SelectString, ConnectionString);
    int result;
    if(SomeCommand.ExecuteScalar() == null)
        {
            result = 0;
         }
    else
         {
             result = (int)SomeCommand.ExecuteScalar();
          }

    Why bad ?! The method execute twice ...

    Запостил: O_O, 02 Июня 2010

    Комментарии (35) RSS

    • чем плохо то? да, автор прав. null != 0. null == {0} а это разные вещи. Да и еще аргумент в пользу этого кода- вдруг надо юзать значение, возвращаемое методом не 1 раз а больше? и что, еще несколько раз его вызывать? имхо нерационально по-моему.
      Ответить
      • > вдруг надо юзать значение, возвращаемое методом не 1 раз а больше?
        где такую траву берешь?
        Ответить
        • это я для общности такой пример привел. А ты ни разу так не делал ни с одним методом? Тебе много предстоит, даже завидую если честно.
          Ответить
          • Мне просто сложно представить пример процесса при котором
            1) В первый раз Select не вернул ни одной записи
            2) В следующей транзакции тот-же Select возвращал какое-то значение
            Ответить
            • А, пардон, мы друг друга не понимаем. Я имел в виду в общем случае. Да и поторопился я- не обратил внимание что за метод- мол просто что-то вызываем.
              Ответить
    • Странный какой-то кодер. Правильно вообще-то так:

      while ( SomeCommand.ExecuteScalar() == null );
      int result = (int) SomeCommand.ExecuteScalar();
      Ответить
      • Просремся вместе!
        Ответить
      • А цикл откуда появился ?
        Ответить
        • Как откуда? Это правильный дизайн и проектирование! Выполнять, пока не исполнится. И контрольный, на всякий случай.
          Ответить
          • Я к тому, что в исходном варианте циклов нет. А если уж и долбиться до результата, то хотя бы с некоторыми паузами, иначе весь процессор сожрешь. И конечно же надо знать почему ExecuteScalar() возвращает null. Может ресурс какой занят, а может ещё что. Без контекста трудно сказать.
            Ответить
            • Простите, а Вы серьезно сейчас это говорите?
              Ответить
              • Что именно Вас смутило?
                Ответить
                • Честно говоря, всё. Начиная с заботы о процессоре, и заканчивая "чем-то ещё".
                  Ответить
                  • То есть когда проц съеден одним потенциально бесконечным циклом Вас не пугает?
                    Ответить
                  • Про контекст и прочее прояснилось после прочтения http://msdn.microsoft.com/ru-ru/library/z4956bkc%28v=VS.90%29.aspx
                    Не думал просто, что это библиотечный класс. С шарпами дел не имел ;)
                    Ответить
                    • :)
                      Ответить
                      • Но вот с циклом вопрос остается открытым.
                        Ответить
                        • Я, пожалуй, тогда опять открою вопрос серьезности. Вам доступно понятие "ирония"? :) В переводе на промптовский бейсик я хотел только сказать следующее:
                          ВыполнятьСукаПокаНеИсполнишь(ЗапросКБазе );
                          СделатьНаВсякийСлучайКонтрольныйВызов();

                          ... Примерно так, ага.
                          Ответить
    • А так?
      SqlCommand SomeCommand = new SqlCommand(SelectString, ConnectionString);
      int result = 0;
      result = (int)SomeCommand.ExecuteScalar();
      Ответить
      • так хрєново, ще більший гавнокод ніж сам пост.
        Ексепшн може вилетіти
        Ответить
        • Speak russian, please.
          Ответить
          • Неужели украинский так непонятен? По-моему нормально читается :)
            Ответить
            • ну слова хрєново/гавнокод понятны, ведь это русизмы, по-украински должно быть хрiново/гiвнокод

              2 слова из 11 - русские. люблю украинский!
              Ответить
              • "говнокод", наверно, лучше перевести как "лайнокод".
                а вот у "хреново" точного соответствия нету.
                Ответить
              • "Так стоило ради одной жопы язык городить?" (q) из бородатого онегдода
                Ответить
    • ИМХО
      SqlCommand SomeCommand = new SqlCommand(SelectString, ConnectionString);
      int result;
      try{
      result = (int)SomeCommand.ExecuteScalar();
      }catch
      {result = 0;}
      или
      int result;
      if(int.tryParce(SomeCommand.ExecuteScala r(), result)
      {
      //погнали дальше
      }
      Ответить
      • жесть
        Ответить
        • В смысле если уверен что вернет int или null то

          SqlCommand SomeCommand = new SqlCommand(SelectString, ConnectionString);
          return (int)((int?)SomeCommand.ExecuteScalar() ?? 0);

          ну или как-то так ) (не отрывать руки!)
          Ответить
      • +1
        Ответить
    • Ну вы и нахуевертили кодеры мля. И вообще для тех кто в танке ExecuteScalar() null никогда не вернёт!!! см. DBNull.Value ггг.
      Ответить
      • А с какого куя ExecuteScalar вообще вернет неинтовое значение? Может меня щас обосрут,но в MSDN мне глядеть лень - вернет ведь любое число, кроме null. А если нихера rows affected вернет ноль. А если хотите делать проверку был ексепшн или нет - так заводите nullable int переменную (типа int? result = null), в которую в catch будете null пинать. А если результат неналовый вернется то полюбасу эксепшна не было, и кол-во строк примененных там и будет.
        Ответить
        • Тупанул я немного, попутал ExecuteScalar() и ExecuteNonQuery(). Вот я ламер... Но тут полюбасу грамотно было бы использовать Nullable инты
          Ответить

    Добавить комментарий