一尘不染

具有in子句的C#参数化查询MySQL

mysql

我正在将几个已硬编码到应用程序中的查询转换为动态的参数化查询。我遇到一个特定的查询,该查询有一个in子句:

UPDATE TABLE_1 SET STATUS = 4 WHERE ID IN (1, 14, 145, 43);

第一个参数很简单,因为它只是一个普通参数:

MySqlCommand m = new MySqlCommand("UPDATE TABLE_1 SET STATUS = ? WHERE ID IN (?);");
m.Parameters.Add(new MySqlParameter("", 2));

但是,第二个参数是一个整数列表,表示需要更新的行的ID。如何为单个参数传递整数列表?或者,您将如何设置此查询,以使您不必每次调用时都完全构建它,并且可以防止SQL注入攻击?


阅读 984

收藏
2020-05-17

共1个答案

一尘不染

您可以基于(可能)可变数量的参数“动态”构建参数化查询,并对其进行迭代以将其传递。

因此,类似:

List foo; // assuming you have a List of items, in reality, it may be a List<int> or a List<myObject> with an id property, etc.

StringBuilder query = new StringBuilder( "UPDATE TABLE_1 SET STATUS = ? WHERE ID IN ( ?")
for( int i = 1; i++; i < foo.Count )
{   // Bit naive 
    query.Append( ", ?" );
}

query.Append( " );" );

MySqlCommand m = new MySqlCommand(query.ToString());
for( int i = 1; i++; i < foo.Count )
{
    m.Parameters.Add(new MySqlParameter(...));
}
2020-05-17