2

我有以下代码:

如您所见,我需要将参数传递给 Field2,但我还需要将该参数设为 ablo 以处理“所有值”选项,例如,如果我将“foo”分配给参数,则查询将返回Field2 =“foo”的每条记录......但我也希望能够传递通配符,或者告诉该参数给出所有值作为结果的东西。

MyDataset dataset = new MyDataset();
SqlConnection objConnection = new SqlConnection(_connectionstring);
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.Connection = objConnection;
objDataAdapter.SelectCommand.CommandText =
"SELECT Field1, Field2, Field3 FROM Table WHERE (Field2 = @Field2)";
objDataAdapter.SelectCommand.CommandType = CommandType.Text;
objDataAdapter.SelectCommand.Parameters.AddWithValue("@Field2", txtBoxField2.Text);
objDataAdapter.Fill(dataset.Table);
this.DataContext = dataset.Table.DefaultView;

先感谢您。

4

3 回答 3

3

一种方法是使用可为空的参数:

SELECT Field1, Field2, Field3 
FROM Table 
WHERE (@Field2 IS NULL OR Field2 = @Field2)

但是您需要注意,在某些参数很多的情况下,这可能会导致错误地缓存查询计划。如果您使用的是 SQL Server 2005+,则可以使用OPTIMIZE FOR将其减轻到很大程度。

此外,请确保您的统计数据是最新的。

于 2010-02-25T10:04:32.190 回答
1

如果您在 C# 代码中像这样构建 SQL,那么只需在 C# 逻辑中添加一个 if 条件,以便在要返回所有记录的实例中不包含 WHERE 子句。这将创建一个不同的 SQL 语句,因此对于性能/执行计划来说是可以的。

如果您要使用存储过程,您可以尝试这种方法:

IF (@Field2 = 'SomeWildcardValue')
    SELECT Field1, Field2, Field3 FROM SomeTable
ELSE
    SELECT Field1, Field2, Field3 FROM SomeTable WHERE Field2 = @Field2

甚至,将它们完全分开,创建一个存储过程以返回 ALL,并创建一个基于 Field2 搜索返回。虽然如果你有更多的参数,这很快就会安装起来!

于 2010-02-25T10:08:26.707 回答
0

In general I would use the nullable parameter method in an SP. Based on your code though, why don't you build the SQL commandtext based on what the user has entered? For example, only add a where clause to the SQL if the user has entered something into the text box, otherwise, just a simple select.

于 2010-02-25T11:33:58.530 回答