将 List<string> 传递给 SQL 参数
Posted
技术标签:
【中文标题】将 List<string> 传递给 SQL 参数【英文标题】:Pass List<string> Into SQL Parameter 【发布时间】:2014-04-06 06:06:50 【问题描述】:程序是用 C# 编写的,我正在尝试将 List<string>
作为参数传递。
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<string>
并只对每个名称执行。
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<string>
非常大。我想尽量少执行。
谢谢!
【问题讨论】:
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 参数的主要内容,如果未能解决你的问题,请参考以下文章
C# 是通过引用还是作为副本将 List<T> 传递给方法? [复制]
如何在测试 WCF 服务时将值传递给 List<string> 属性?
哪个是基于数据库值在C#突出显示列表框中将字符串传递给List的更好方法