Отправить параметры для оператора 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.

https://msdn.microsoft.com/en-IN/library/ms187897.aspx

Другие вопросы по тегам