我正在尝试创建一个带有WHERE … IN @xs子句的参数化ADO.NET查询,其中@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 namespace中的类型都不建议支持此方案。我必须恢复到动态SQL (即使用字符串操作手动组成最终的SQL CommandText )吗?
发布于 2013-06-08 22:10:19
如果您使用的是SQL Server2008或更高版本,另一种方法可能是使用“表值参数”。更多信息请点击此处:Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters
发布于 2013-06-08 16:23:30
您必须一次构建一个参数:
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)
);发布于 2013-06-08 16:20:44
正如您已经发现的:这是不受支持的。
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():https://stackoverflow.com/questions/16997496
复制相似问题