将 List<string> 传递给 SQL 参数

Posted

技术标签:

【中文标题】将 List<string> 传递给 SQL 参数【英文标题】:Pass List<string> Into SQL Parameter 【发布时间】:2014-04-06 06:06:50 【问题描述】:

程序是用 C# 编写的,我正在尝试将 List&lt;string&gt; 作为参数传递。

List<string> names = new List<string>"john", "brian", "robert";

在普通 SQL 中,查询将如下所示:

DELETE FROM Students
WHERE name = 'john' or name = 'brian' or name = 'robert'

在 C# 代码中运行 SQL 命令时,我知道正确的做法是使用参数,而不是将所有内容连接成一个巨大的字符串。

command.CommmandText = "DELETE FROM Students WHERE name = @name";
command.Parameters.Add(new mysqlParameter("@name", String.Format("'0'", String.Join("' or name = '", names)));
command.NonQuery();

上述方法无效。它没有抛出任何错误/异常,只是没有按照我想要的方式工作。

我应该怎么做?

我想过循环遍历List&lt;string&gt; 并只对每个名称执行。

foreach(string name in names)

    command.CommmandText = "DELETE FROM Students WHERE name = @name";
    command.Parameters.Add(new MySqlParameter("@name", name));
    command.NonQuery();
    command.Parameters.Clear();

但这需要很长时间,因为实际的List&lt;string&gt; 非常大。我想尽量少执行。

谢谢!

【问题讨论】:

command.CommmandText = "从学生中删除姓名(@name)"; 您不能在参数值中包含 SQL 命令。在这种情况下,您实际上是在将 name 与“john or name = brian or name = robert”进行比较 @RobertRozas 您不能将值列表放入一个参数中。 我知道,这只是一个注释,但正确的解决方案是使用 IN...并参数化每个值...或内爆数组并粘合以匹配 IN 格式 实际上您可以很容易地编写代码来将name = @n1 or name= @n2 or name = @n3 添加到查询中并创建所有参数。使用In 可以使代码更简洁,但重点是这里需要多个参数。 【参考方案1】:

您可以在IN 子句中参数化列表中的每个值:

List<string> names = new List<string>  "john", "brian", "robert" ;
string commandText = "DELETE FROM Students WHERE name IN (0)";
string[] paramNames = names.Select(
    (s, i) => "@tag" + i.ToString()
).ToArray();

string inClause = string.Join(",", paramNames);
using (var command = new SqlCommand(string.Format(commandText, inClause), con))

    for (int i = 0; i < paramNames.Length; i++)
    
        command.Parameters.AddWithValue(paramNames[i], names[i]);
    
    int deleted = command.ExecuteNonQuery();
 

类似于:

"... WHERE Name IN (@tag0,@tag1,@tag2)"

command.Parameters["@tag0"].Value = "john";
command.Parameters["@tag1"].Value = "brian";
command.Parameters["@tag2"].Value = "robert";

改编自:https://***.com/a/337792/284240

【讨论】:

解释清楚。非常感谢! 感谢这帮了大忙!

以上是关于将 List<string> 传递给 SQL 参数的主要内容,如果未能解决你的问题,请参考以下文章

将列表传递给 HQL 或 SQL 中的 IN 子句?

C# 是通过引用还是作为副本将 List<T> 传递给方法? [复制]

如何在测试 WCF 服务时将值传递给 List<string> 属性?

哪个是基于数据库值在C#突出显示列表框中将字符串传递给List的更好方法

如何将 C# List<string[]> 转换为 Javascript 数组?

为啥我不能将 List<List<Foo>> 传递给 IEnumerable<IEnumerable<Foo>>