0

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

我没有使用串联,而是SqlCommand将信息存储在我的DataSet. 当我有 1 个变量(像这样)时,这很容易:

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

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

4

2 回答 2

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())
);
于 2013-06-18T07:10:47.853 回答
1

如果要将相同“类型”的多个参数传递给 SQL Server,“最正确”的方法是使用表值参数

如果您使用的不是支持这些的 SQL Server 版本,则下一个最佳方法是传递 XML 文档并使用 SQL Server 中的 XML 函数将它们分解回row-set

最糟糕的方法是传递一个逗号分隔的字符串,然后必须在 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) + ")";

如果/当用存储过程替换文字查询时,这将不起作用,但对于少数可能的选择,它会起作用。

于 2013-06-18T06:58:16.993 回答