' 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使用字符串操作)?

' WHERE…IN @xs ',其中@xs参数为值列表:ADO.NET支持

您必须一次构建一个参数:

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():