C#参数化查询MySQL带有`in`子句

Eli*_*lie 6 c# mysql parameters

我正在将几个硬编码的查询转换为应用程序并立即构建到参数化查询.我遇到一个特定查询的问题,它有一个in子句:

UPDATE TABLE_1 SET STATUS = 4 WHERE ID IN (1, 14, 145, 43);
Run Code Online (Sandbox Code Playgroud)

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

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

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

And*_*kin 5

这在MySQL中是不可能的.您可以创建所需数量的参数并执行UPDATE ... IN(?,?,?,?).这可以防止注入攻击(但仍然需要您为每个参数计数重建查询).

其他方法是传递逗号分隔的字符串并解析它.


Row*_*haw 4

您可以基于(大概)可变数量的参数“即时”构建参数化查询,并迭代该查询以将它们传递进去。

所以,像这样:

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(...));
}
Run Code Online (Sandbox Code Playgroud)