' WHERE…IN @xs ',其中@xs参数为值列表:ADO.NET支持
本文关键字:@xs 列表 NET 支持 ADO 其中 WHERE IN 参数 | 更新日期: 2023-09-27 18:17:43
我试图创建一个参数化的ADO。NET查询一个WHERE … IN @xs
子句,其中@xs
是一个可能不连续的值的短列表,例如(2, 3, 5, 8, 13)
。这能做到吗?如果有,怎么做?
这行不通:
int[] xs = { 2, 3, 5, 8, 13 }; // I've also tried using a List<int> instead
var c = new System.Data.SqlClient.SqlCommand();
c.CommandText = "SELECT … FROM … WHERE … IN @xs";
c.Parameters.AddWithValue("@xs", xs); // throws ArgumentException due to `values`
System.Data.SqlDbType
enum和System.Data.SqlTypes
命名空间的类型都不支持此场景。我必须恢复到动态SQL(即手动组成最后的SQL CommandText
使用字符串操作)?
您必须一次构建一个参数:
int[] xs = { 2, 3, 5, 8, 13 };
var c = new SqlCommand();
var parameters = xs.Select((x, i) => string.Concat("@xs", i)).ToList();
for (var i = 0; i < xs.Count; i++)
{
c.Parameters.AddWithValue(parameters[i], xs[i]);
}
c.CommandText = string.Format(
"SELECT ... FROM ... WHERE ... IN ({0})",
string.Join(", ", parameters)
);
如果您使用的是SQL Server 2008或更高版本,另一种选择可能是使用"表值参数"。更多信息在这里:SQL Server 2008中的数组和列表使用表值参数
正如你已经发现的:这是不支持的。
int[] xs = { 2, 3, 5, 8, 13 };
var c = new System.Data.SqlClient.SqlCommand();
// this code assumes xs has always at least one item
var s = new StringBuilder("SELECT … FROM … WHERE … IN (@xs0");
c.Parameters.AddWithValue("@xs0", xs[0]);
for(int i = 1; i < xs.Length; i++)
{
s.AppendFormat(",@xs{0}", i);
c.Parameters.AddWithValue(String.Format("@xs{0}",i), xs[i]);
}
s.Append(")");
c.CommandText = s.ToString():