【发布时间】:2016-02-02 02:54:51
【问题描述】:
我正在尝试执行以下查询,但遇到异常。
using (SqlConnection con = new SqlConnection(UserDatabase.getConnectionString()))
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Order_Header where Status IN (@Values)"))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
try
{
cmd.Connection = con;
con.Open();
sda.SelectCommand = cmd;
// This is for test purposes
List<int> yourValues = new List<int>() { 1, 2, 3, 4, 5 };
//Get values for IN
string x = String.Join(",", yourValues.Select(s => String.Format("'{0}'", s)).ToArray());
// Add parameter
cmd.Parameters.AddWithValue("@Values", x);
DataTable dt = new DataTable();
sda.Fill(dt);
order_details.SetDataSource(dt);
SalesReport.ReportSource = order_details;
}
catch (Exception ex)
{
scriptMessage(ex.ToString);
}
finally
{
con.Close();
sda.Dispose();
con.Dispose();
}
}
}
}
在执行此查询时,我得到以下异常:
将 nvarchar 值 ''1','2','3','4','5'' 转换为数据类型 int 时转换失败。
为什么会这样?请帮忙
【问题讨论】:
-
String.Format("{0}", s)。无论如何,您应该将多个参数作为 TVP 传递,并且不要构建自定义 sql -
@lad2025 我也试过了。我得到了同样的例外。
-
除非@parameter 是表值参数,否则您不能执行
IN (@parameter)。您正在传递 1 个值,一个字符串,其中包含单个字符串值"'1', '2', '3', '4', '5'"。这行不通。 -
@LasseV.Karlsen 我还有其他方法吗?
-
糟糕的副本,因为它会生成一个表扫描。有更好的方法,使用表值参数,或者生成正确的 SQL。我现在找不到可以链接的好副本,其他人可能会有更好的运气。
标签: c# sql asp.net sql-server parameter-passing