在 c# 中使用参数化查询为 sql 中的 IN 运算符发送参数

Send parameters for IN operator in sql using parameterized queries in 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) ;

其中 id 将包括 (10,11,12)

Ids 是一个字符串。参数计数器将根据登录用户而变化。我将该字符串作为参数化查询传递。

但是当应用程序执行它时它只得到属于 id 10 的结果。

当我直接在 MySQL 上执行这段代码时,它显示了正确的结果。

那么这里有什么问题呢?有什么方法可以为 IN 运算符发送参数吗?

参数不能替代字符串操作。它取值 'as-is'.

也就是说,您的 SQL 应该是这样的:

WHERE emp.`corporate_id_fk` IN (@id1, @id2, @id3) ;

为您的 SQL 语句中的每个值添加一个单独的参数。

根据我过去的经验(并不广泛),在 SqlCommand.Parameters 中传递数据数组并没有真正按预期工作。

尽管我们可以通过多种方式做到这一点。

1) Table 值参数

看看下面的答案和里面的 link。

How to pass table value parameters to stored procedure from .net code

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

根据 ID 创建 XElement。使用相同的方法传递 XElement。然后查看下面的 link 示例,了解如何在 SQL.

中使用 XML

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