Параметры в SqlCommand

Обсуждение возникших проблем, предложений и ошибок SDAC компонентов
Ответить
Andries
Сообщения: 2
Зарегистрирован: Вт 23 июл 2013 11:15

Параметры в SqlCommand

Сообщение Andries » Вт 23 июл 2013 11:30

Добрый день,
пытаюсь использовать SqlDataTable в dotConnect, возник вопрос: необходимо отфильтровать результирующую выборку людей по различным возможным критериям. Т.е. может быть по ID записи, а может быть по ФИО в зависимости от того, что введёт пользователь. Таким образом условие WHERE меняется динамически. Как это лучше сделать? Описать все возможные параметры и инициализировать необходимые не получается. Кроме того, не работает конструкция типа SELECT * FROM Table WHERE LastName LIKE '%@Param%'
Буду благодарен за пример кода.
Спасибо!

P.S. Мой примерный код следующего вида:

Код: Выделить всё

SqlCommand mySqlCommand1;
...
mySqlCommand1.CommandText = "SELECT * FROM People WHERE PeopleID = @PeopleID AND LastName LIKE '%@LastName%' AND FirstName LIKE '%@FirstName%'";
mySqlCommand1.Parameters.Add("@PeopleID", 20);
или
mySqlCommand1.Parameters.Add("@LastName", "иван");
mySqlCommand1.Parameters.Add("@FirstName", "андр");

Shalex
Devart Team
Сообщения: 19
Зарегистрирован: Пт 12 апр 2013 14:48

Re: Параметры в SqlCommand

Сообщение Shalex » Вт 23 июл 2013 17:57

В операторе LIKE все, что идет после одинарной кавычки, считается строкой. Поэтому запись '%@LastName%' трактуется как строка. Возможны два варианта решения данной задачи:

1. Использовать конкатенацию строк и вынести объявление параметра за строку:

Код: Выделить всё

mySqlCommand1.CommandText = "SELECT * FROM People WHERE PeopleID = @PeopleID AND LastName LIKE '%'+@LastName+'%' AND FirstName LIKE '%'+@FirstName+'%'";
mySqlCommand1.Parameters.Add("@PeopleID", 20);

mySqlCommand1.Parameters.Add("@LastName", "иван");
mySqlCommand1.Parameters.Add("@FirstName", "андр");
2. В значении параметра задать маски для оператора LIKE:

Код: Выделить всё

mySqlCommand1.CommandText = "SELECT * FROM People WHERE PeopleID = @PeopleID AND LastName LIKE @LastName AND FirstName LIKE @FirstName";
mySqlCommand1.Parameters.Add("@PeopleID", 20);

mySqlCommand1.Parameters.Add("@LastName", "%иван%");
mySqlCommand1.Parameters.Add("@FirstName", "%андр%");

Andries
Сообщения: 2
Зарегистрирован: Вт 23 июл 2013 11:15

Re: Параметры в SqlCommand

Сообщение Andries » Вс 28 июл 2013 11:06

Спасибо за ответ, с like всё понятно. У меня остался первый вопрос: как быть с динамическими параметрами в запросе? Т.е. нужно получить одинаковую выборку, но по разным критериям фильтра в зависимости от информации, которую введёт пользователь.
Может быть к примеру такой запрос:

Код: Выделить всё

SELECT * FROM People WHERE PersonID = 10
Или такой запрос:

Код: Выделить всё

SELECT * FROM People WHERE FirstName LIKE 'ив%'
Возможно ли такое реализовать? Если описать все возможные параметры, а инициализировать только необходимые возникает ошибка.
Спасибо!

Shalex
Devart Team
Сообщения: 19
Зарегистрирован: Пт 12 апр 2013 14:48

Re: Параметры в SqlCommand

Сообщение Shalex » Вт 30 июл 2013 17:18

Andries писал(а):Если описать все возможные параметры, а инициализировать только необходимые возникает ошибка.
Укажите конкретный SQL запрос, который, по Вашему мнению, неправильно обрабатывается провайдером. Напишите также, пожалуйста, полный текст получаемой ошибки.

Ответить