SqlCommand中有多个“OR”变量

时间:2013-06-18 06:54:29

标签: asp.net sqlcommand

数据库表包含以下字段:UserNameFavColour。基本上,它存储每个用户最喜欢的颜色。

我使用SqlCommand将信息存储在我的DataSet中,而不是使用连接。当我有一个变量(像这样)时很容易:

SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Colour WHERE FavColour = @favcol";
cmd.Parameters.AddWithValue("@favcol", colourVar);

现在,我有一个复选框选项,我可以在其中选择WHERE子句的颜色。说我这次选择了蓝色,粉色,橙色和紫色。我如何使用SqlCommand完成此操作? (注意:所选颜色的数量每次都会有所不同)

2 个答案:

答案 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())
);