Справка по параметризации SQL-запросов для C # с возможными значениями NULL - PullRequest
0 голосов
/ 04 июня 2010

Мне нужна помощь с параметризацией этого запроса.

SELECT * 
FROM greatTable 
WHERE field1 = @field1
AND field2 = @field2

Пользователь должен иметь возможность искать любое из 2 полей, а также пользователь должен иметь возможность искать, если field2 имеет нулевые значения.

var query = "theQuery";
var cm = new SqlCommand(cn, query);

cm.AddParameter("@field1", "352515");
cm.AddParameter("@field2", DBNull.Value);

// my DataTable here is having 0 records
var dt = GetTable(cm);

[ Редактировать ]

Какая лучшая альтернатива?

  1. Сохраняйте константу CommandText, чтобы план в Sql использовался повторно

    ГДЕ (field2 = @ field2 ИЛИ @ field2 НЕДЕЙСТВИТЕЛЕН)

  2. Динамическое изменение CommandText на основе значений, введенных пользователем.

    ГДЕ field2 НУЛЬ

Я не просто думаю в одной области, это может быть различным.

Ответы [ 3 ]

3 голосов
/ 04 июня 2010

Вы можете использовать AND (@field2 IS NULL OR field2 = @field2), чтобы запрос возвращал все строки без проверки field2 (чтобы позволить вам передавать DbNull из вашего кода. Полный запрос будет выглядеть примерно так:

SELECT * 
FROM greatTable 
WHERE field1 = @field1
AND (@field2 IS NULL OR field2 = @field2)

Обратите внимание, что при использовании этого метода может произойти снижение производительности из-за индексации. Посмотрите эту статью для подробностей.

0 голосов
/ 04 июня 2010

Хороший вопрос, но на практике у меня не было времени такой проблемы. Если я использую AddParameter, тогда я также создаю строку для запроса в том же фрагменте кода. Поэтому, если я знаю, что теперь мне нужно искать «@ field2», равное NULL, я решаю, построить ли

string query = "SELECT * " +
    "FROM greatTable " +
    "WHERE field1 = @field1";

или

string query = "SELECT * " +
    "FROM greatTable " +
    "WHERE field1 = @field1 AND field2 IS NULL";

и добавить только один параметр

cm.AddParameter("@field1", "352515");

Так что у меня нет времени на проблему, которую вы описываете.

ОБНОВЛЕНО : Каков наилучший (или единственный правильный) способ, которым пользовательский ввод НЕДЕЙСТВИТЕЛЕН, вы должны решить на основе контекста. В большинстве случаев «AND field2 IS NULL» не требуется, но я прочитал ваш вопрос так, что в вашем особом случае пользователь может явно выбрать не «» (пустая строка), а значение NULL.

0 голосов
/ 04 июня 2010

Грязный метод: isnull (field2,0) = isnull (@ param2,0)

имеет то, что никогда не будет в поле или параметре

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