Отправить параметры для оператора IN в SQL, используя параметризованные запросы в C#
Я использую asp.net, C#, чтобы сделать мое приложение.
Там для опций базы данных я подаю в суд на параметризованные запросы.
Вот код
mySqlCommand = new MySqlCommand();
mySqlCommand.Parameters.AddWithValue("@ids", ids);
switch (privilegeType.ToString())
{
case "CorporateLead":
myQuery = @"SELECT
leavea.applied_leave_id_pk,
leavea.emp_id_fk,
leavea.emp_name AS NAME,
leavea.start_date,
leavea.end_date,
leavea.is_half_day,
..............
FROM
lea_applied_leave AS leavea
INNER JOIN emp_employee_master AS emp
ON emp.employee_master_id_pk = leavea.emp_id_fk
WHERE emp.`corporate_id_fk` IN (@ids) ;
Там идентификаторы будут включать (10,11,12)
Идентификаторы это строка. Счетчик параметров будет варьироваться в зависимости от имени пользователя. Я передаю эту строку как параметризованный запрос.
Но когда приложение выполнит это, оно получит только результат с идентификатором 10.
Когда я выполняю этот код непосредственно на MySQL, он показывает правильный результат.
Так что здесь не так? Есть ли способ отправить параметры для оператора IN?
2 ответа
Параметры не являются заменой строковых операций. Он принимает значение "как есть".
Тем не менее, ваш SQL должен читаться так:
WHERE emp.`corporate_id_fk` IN (@id1, @id2, @id3) ;
Добавьте отдельный параметр для каждого значения в вашем операторе SQL.
Из моего прошлого опыта (который не является обширным), передача массива данных в SqlCommand.Parameters на самом деле не работает, как ожидалось.
Хотя есть несколько способов, которыми мы можем сделать это.
1) Таблица значений параметров
Посмотрите на следующий ответ и ссылки в нем.
Как передать параметры табличного значения в хранимую процедуру из кода.net
2) Создайте запрос, используя построитель строк (или формат строки)
Получите @ID в формате, который мы можем напрямую поместить в строковый формат.
string Ids = @"'10', '11', '12'";
string myQuery = string.format(@"SELECT leavea.applied_leave_id_pk, leavea.emp_id_fk, leavea.emp_name AS NAME, leavea.start_date, leavea.end_date, leavea.is_half_day FROM lea_applied_leave AS leavea INNER JOIN emp_employee_master AS emp ON emp.employee_master_id_pk = leavea.emp_id_fk WHERE emp.`corporate_id_fk` IN {0}", Ids);
Такой подход позволяет разделить запрос и входные данные.
3) Передача входных данных в виде XML
Создайте XElement из идентификаторов. Используя тот же подход, вместо этого передайте XElement. А затем посмотрите на ссылку ниже для примеров того, как использовать XML в SQL.