数据库表包含以下字段:UserName
和FavColour
。基本上,它存储每个用户最喜欢的颜色。
我使用SqlCommand
将信息存储在我的DataSet
中,而不是使用连接。当我有一个变量(像这样)时很容易:
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Colour WHERE FavColour = @favcol";
cmd.Parameters.AddWithValue("@favcol", colourVar);
现在,我有一个复选框选项,我可以在其中选择WHERE子句的颜色。说我这次选择了蓝色,粉色,橙色和紫色。我如何使用SqlCommand完成此操作? (注意:所选颜色的数量每次都会有所不同)
答案 0 :(得分:1)
如果要将相同“类型”的多个参数传递给SQL Server,“最正确”的方法是使用{{3} }。
如果您不使用支持这些版本的SQL Server,则下一个最佳方法是传递XML文档并使用SQL Server中的XML函数将这些文件重新分解为table-valued parameters。
你能做到的最糟糕的方法是传递逗号分隔的字符串,然后在SQL中将其拆分。
我无法决定在C#中进行循环,只是在上面添加了必要的参数。对于诸如所示的简单查询,它可以作为最简单的选项。即代码看起来像:
SqlCommand cmd = new SqlCommand();
int i = 1;
var parms = new List<string>();
foreach(var colourVar = /* Obtain selected colours one at a time */)
{
var parmName = "@favcol" + i.ToString();
cmd.Parameters.AddWithValue(parmName, colourVar);
parms.Add(parmName);
}
cmd.CommandText = "SELECT * FROM Colour WHERE FavColour IN (" + string.Join(",",parms) + ")";
如果/当文字查询被存储过程替换时,这将无效,但对于少量可能的选择,它将起作用。
答案 1 :(得分:1)
一种简单有效的方法是构建您的查询。
SqlCommand cmd = new SqlCommand();
cmd.CommandText = String.Format(
"SELECT * FROM Colour WHERE FavColour IN ({0})"
, String.Join(",", MyColors.Select(c => String.Format("'{0}'", c.Replace("'", "''"))).ToArray())
);