Как добавить значение «выбрать все» в параметризованный запрос в C # и MS SQL - PullRequest
2 голосов
/ 25 февраля 2010

У меня есть следующий код:

Как вы можете видеть, мне нужно передать параметр в Field2, но мне также нужно, чтобы этот параметр был в ablo для обработки опции "" все значения ", например, если я назначаю" foo "параметру, query будет возвращать каждую запись, где Field2 = "foo" ... но я также хочу иметь возможность передавать подстановочный знак или что-то такое, чтобы сообщить этому параметру, что все значения будут получены в результате.

MyDataset dataset = new MyDataset();
SqlConnection objConnection = new SqlConnection(_connectionstring);
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.Connection = objConnection;
objDataAdapter.SelectCommand.CommandText =
"SELECT Field1, Field2, Field3 FROM Table WHERE (Field2 = @Field2)";
objDataAdapter.SelectCommand.CommandType = CommandType.Text;
objDataAdapter.SelectCommand.Parameters.AddWithValue("@Field2", txtBoxField2.Text);
objDataAdapter.Fill(dataset.Table);
this.DataContext = dataset.Table.DefaultView;

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 25 февраля 2010

Один из способов сделать это - использовать обнуляемые параметры:

SELECT Field1, Field2, Field3 
FROM Table 
WHERE (@Field2 IS NULL OR Field2 = @Field2)

но вы должны знать, что это может привести к некорректно кэшированным планам запросов в некоторых случаях, когда имеется много параметров. Если вы используете SQL Server 2005+, это может быть уменьшено до большого смысла с помощью ОПТИМИЗАЦИЯ ДЛЯ .

Кроме того, убедитесь, что ваша статистика актуальна.

1 голос
/ 25 февраля 2010

Если вы создаете SQL-код в коде C #, просто поместите условие if в логику C #, чтобы не включать предложение WHERE в экземпляр, для которого вы хотите вернуть все записи. Это создаст другой оператор SQL, поэтому все будет в порядке с точки зрения производительности / выполнения.

Если вы собираетесь использовать sproc, вы можете попробовать этот подход:

IF (@Field2 = 'SomeWildcardValue')
    SELECT Field1, Field2, Field3 FROM SomeTable
ELSE
    SELECT Field1, Field2, Field3 FROM SomeTable WHERE Field2 = @Field2

Или даже оставьте их полностью раздельными, создайте один sproc для возврата ALL и один для возврата на основе поиска в Field2. Хотя, если у вас есть большее количество параметров, это может скоро смениться!

0 голосов
/ 25 февраля 2010

В общем, я бы использовал метод параметра Nullable в SP. Однако, основываясь на вашем коде, почему бы вам не создать командный текст SQL на основе того, что ввел пользователь? Например, добавьте предложение where в SQL, только если пользователь ввел что-то в текстовое поле, в противном случае просто выберите.

...