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

    +105

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    str_sql = " select convert(varchar(6),e.id) as  equipment_id,e.name as name,1 as is_check  " +
                              "         ,(select count(t2.id) from equipment t2 where t2.parent_id=e.id) count_child" +
                              " from equipment e " +
                              " where isnull(e.parent_id,0)=" + e.Node.Value +
                              "       and id in (select cod from f_DisplayEqipmentContract_nodes_2(" + str_contract + "))";

    а вот так мы собираем sql запрос

    Запостил: madnezz, 02 Августа 2010

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

    • Ну хорошо, а как мы должны собирать SQL запрос?
      С собачкой (@)? То же самое. (Ну, правда, str_sql получится в несколько строк).
      Ответить
      • 1) да, с собачкой будет лучше, а то тут 8 объектов string
        2) нет защиты от sql-injection
        Ответить
        • >> с собачкой будет лучше, а то тут 8 объектов string
          Нет. Абсолютно одинаковый IL-код на выходе.
          Ответить
          • согласен - не подумал про оптимизацию.
            Ответить
      • написал муйню, и удалил
        Ответить
      • Про DbCommand и parameters слышали?:)
        Ответить
    • prepared statements & binding, что это?
      Ответить
    • Ни за что бы не подумал, что это С#
      Ответить
    • Единственное, что смутило, это where x in (select)
      Ответить
    • LINQ to SQL в помощь
      Ответить
      • Если для такого запроса хочется использовать LINQ to SQL -- то наверное стоит изучить азы SQL :)
        Ответить
        • а для строкового запроса азы значит не надо...
          Ответить
          • надо.

            просто желаение везде юзать linq2sql в 80% случаев связано с нежеланием аффтара изучать SQL, и со святой верой что linq2sql сгенерит самый лучший запрос.

            обычно это кончается тормозящими приложениями
            Ответить
            • любой инструмент в кривых руках на выходе даёт говно.
              Ответить
              • Вот я и попросил пример НЕ говна. Может быть Вы знаете хотя бы одно решение на linq2sql, которое было бы не говном, и которое Вы можете показать?
                Ответить
        • мм... а чем плох LINQ для таких запросов?
          Ответить
          • LINQ генерирует монструидальные запросы, создающие огромную нагрузку на сервер.
            Зато он позволяет оперировать более высокоуровневыми вещами, нежели сам SQL. И мапит результаты в объекты автоматически.

            В данном случае у нас есть запрос. Все, что нужно сделать, это переделать его на биндинг через ADO.NET (что бы избежать sql injection например) и заменить подзапросы на внутренние джойны.

            Позиция "с базой всегда работаем через linq2sql" кажется мне не верной. Слишком уж много я видел веб-приложений, ставящих сервера раком из за того, что один заход на сайт вызывает до тридцати запросов с поздзапросами.

            Linq2SQL плох еще тем, что провоцирует программиста не выделять этот код в DAO.
            Linq запросы кажутся программисту чем-то высокоуровневым, и потому их часто можно встретить в контроллере MVC.NET например.

            Это делает код нетестируемым.

            Кстати, а у Вас есть примеры хороших приложений, работающих на linq2sql?
            Ответить
            • Я программист asp.net, поэтому в проектах использую linq to sql, не вижу в этом ничего постыдного. Да, есть варианты, когда запросы становятся просто нереально долгими по времени, тогда они вручную переписываются на хранимки. К которым, кстати, тоже проще обращаться через linq.

              В простых случиях, запрос типа "var a = from u in da.Users order by u.name select a" будет что с linq, что без него выглядеть совершенно одинаково. Но создавать отдельную процедуру я не вижу смысла, как и писать открытый SQL-код в проекте.
              Ответить
              • Мне кажется, что в данном случае мы имеем вполне себе простой случай, нет?
                Тогда зачем усложнять его переделкой на linq, когда запрос уже готов?

                ситуация, когда часть запросов хранится ввиде linq, а другая часть ввиде хранимок -- ужасна.
                Ответить
                • Почему? Нет, я не издеваюсь, и не иронизирую. Хочу прочитать аргументированное мнение.
                  Ответить
                  • Почему плоха такая ситуация?

                    Попробую объяснить. В программировании есть такое понятие -- "cohesion". Смысл его в том, что определенного типа знания должны быть рядышком. Например если у Вас есть логика вычисления длины хвоста страуса -- то она должна быть в одном классе.
                    Если она тонко размазана по всему проекту, то это очень плохо. Во-первых ее тяжело протестировать. Во-вторых ее тяжело изменить.

                    Потому обычно шаблоны стараются держать в одном месте, логику -- в другом, доступ к БД -- в третьем.


                    В Вашем случае запросы частично лежат в хранимках, частично генерятся на лету, причем наверняка из разных мест (скажите честно -- у Вас есть интерфейс типа DAO?).

                    Это и кажется мне не очень красивым решениесм
                    Ответить
                    • так, а каково Ваше решение? что вы предлагаете взамен?
                      Ответить
                      • Сборка запросов и биндинг параметров. В этом случае программист имеет полный контроль над сгенеренными запросами.
                        Кроме того SQL код уж точно не выйдет за пределы DAO.

                        В идеальном варианте конечно хранимки на стороне бд, но это , увы, не всегда возможно.
                        Ответить
                        • ну, видимо это мое личное мнение. меня просто корежит от запросов в строках :)
                          Ответить
                          • Меня тоже, потому я стараюсь использовать хранимки.

                            Но представьте себе два совершенно одинаковых запроса, различающихся типом джойна (внешним и внутренним). Хранимки тут вызовут копипаст.

                            Кстати, как бы Вы порешали это в linq?
                            Ответить
                            • Напрашивается мнение что Микрософт наспамил кучу технологий поддержку которых потом прекращает! Что выбирать бедному кодиру?
                              Ответить
                              • То, что удобно под конкретный случай. Если только из технологий M$:
                                1) TypedDataSet
                                2) Linq2SQL
                                3) Entity Framework
                                Ответить
            • К тому же, практически каждый серьезный запрос я просматриваю профайлером, и подзапросов не допускаю.
              Ответить
              • ))тоесть Вы сначала пишете на linq, потом смотрите что он нагенерил профайлером, и переписываете запросы так, что бы там не было мусора, верно?

                тогда начерта Вам linq?
                Ответить
                • это напоминает бессмысленный спор :) я вижу в нем много преимуществ, linq позволяет быстро писать такие вещи. удобно. linq - не панацея, я не спорю. но очень облегчает разработку
                  Ответить
                  • Согласен. linq 2 sql замечательный инструмент (жаль, что создатели на него забили). Аргументы анонимуса какие-то высосанные из пальца и без примеров - хотелось бы увидеть пример монстроидального сгенереного запроса при небольшом linq запросе. про DAO - тоже глупость. linq-2-sql по-моему только облегчает реализацию, а не заменяет.
                    Ответить

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