Каковы лучшие практики по форматированию встроенного SQL с использованием ADO.NET в C # - PullRequest
7 голосов
/ 05 июня 2009

Я знаю, что здесь было много вопросов о встроенных sql против хранимых процедур ... Я не хочу начинать еще один такой! Это о встроенном (или динамическом) sql.

Я также знаю, что этот вопрос стал более или менее спорным с Linq to SQL и его преемником Entity Framework.

Но ... предположим, что вы выбрали (или требуются от своего начальства) для работы с простым старым ADO.NET и встроенным (или динамическим) sql . Каковы же лучшие практики для этого и для форматирования SQL?

Теперь я делаю следующее: Мне нравится сначала создавать свои операторы SQL в хранимой процедуре. Это дает мне возможность окрашивать синтаксис в SQL Server Management Studio и возможность легко тестировать запрос, не выполняя его в коде через разрабатываемое мной приложение.

Так что, пока я внедряю / отлаживаю, мой код выглядит так:

    using (SqlConnection conn = new SqlConnection("myDbConnectionString"))
    {
        conn.Open();
        using (SqlCommand cmd = conn.CreateCommand())
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "myStoredProcName";
            // add parameters here
            using (SqlDataReader rd = cmd.ExecuteReader())
            {
                // read data and fill object graph
            }
        }
    }

После завершения этапа отладки и тестирования я изменяю приведенный выше код следующим образом:

    using (SqlConnection conn = new SqlConnection("myDbConnectionString"))
    {
        conn.Open();
        using (SqlCommand cmd = conn.CreateCommand())
        {
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = GetQuery();
            // add parameters here
            using (SqlDataReader rd = cmd.ExecuteReader())
            {
                // read data and fill object graph
            }
        }
    }

И я добавляю дополнительный приватный метод, например GetQuery(), в котором я копирую / вставляю весь блок хранимой процедуры следующим образом:

    private string GetQuery()
    {
        return @"
    SET NOCOUNT ON;
    SELECT col1, col2 from tableX where id = @id

    -- more sql here
        ";
    }

Преимущество такой работы заключается в том, что я могу легко возвращать код для повторного вызова хранимой процедуры, если позже мне придется отлаживать / обновлять код sql, и как только это будет сделано, я легко могу вернуть код sql с помощью функции копирования / вставки , без необходимости помещать кавычки вокруг каждой строки и тому подобное .

Полезно ли включать в запрос символы новой строки?
Есть ли другие вещи или уловки, о которых я не думал, которые могут сделать этот подход лучше?
Как вы, ребята, делаете такие вещи?
Или я единственный, кто все еще использует (должен использовать) встроенный sql?

Ответы [ 3 ]

8 голосов
/ 05 июня 2009

Встроенный (с буквальным синтаксисом @"..." или без него) подходит для коротких запросов ... но для чего-то большего, рассмотрите возможность использования tsql в качестве файла в проекте; либо в виде встроенных ресурсов / resx, либо в виде плоских файлов. Конечно, на этом этапе вы, вероятно, должны все равно сделать это хранимой процедурой; -p

Но наличие его в качестве отдельного файла приводит к тому же разделению, что делает его легким превращением в хранимую процедуру позже (возможно, просто добавив CREATE PROC и т. Д.).

Одна проблема со встроенным - это делает соблазн для кого-то объединять пользовательский ввод ... что явно плохо (вы правильно использовали параметры в примере).

2 голосов
/ 06 июня 2009

Я использовал файлы ресурсов .NET в прошлом. Они были удобны для хранения библиотеки всех запросов, используемых в конкретной библиотеке кода, особенно когда один и тот же запрос может использоваться в нескольких местах (да, я понимаю, что это также указывает на некоторую плохую конструкцию, но иногда вам нужно работать в рамках данного Вам).

0 голосов
/ 29 августа 2017

Помимо нетривиальных однострочных операторов SQL, я всегда использую преимущества многострочных и делаю их константными

    const string SelectMyTable = @"
SELECT column_one
     , column_two
     , column_three
  FROM my_table
";

Все это позволяет мне вырезать и вставить в диспетчер SQL для тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...