在 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
我正在使用 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