帮助使用可能的空值为C#参数化SQL查询

时间:2010-06-03 22:01:26

标签: c# sql ado.net

我需要帮助参数化此查询。

SELECT * 
FROM greatTable 
WHERE field1 = @field1
AND field2 = @field2

用户应该能够搜索2个字段中的任何一个,并且用户也应该能够搜索field2是否具有空值。

var query = "theQuery";
var cm = new SqlCommand(cn, query);

cm.AddParameter("@field1", "352515");
cm.AddParameter("@field2", DBNull.Value);

// my DataTable here is having 0 records
var dt = GetTable(cm);

[修改

最佳选择是什么?

  1. 保持CommandText不变,以便重用Sql中的计划

    WHERE(field2 = @ field2 OR @ field2 IS NULL)

  2. 根据用户引入的值动态更改CommandText。

    WHERE field2 IS NULL

  3. 我不只是在一个领域思考,它可能是各种各样的。

3 个答案:

答案 0 :(得分:3)

您可以使用AND (@field2 IS NULL OR field2 = @field2)使查询返回所有行而不检查field2(允许您从代码中传递DbNull)。 完整的查询将是这样的:

SELECT * 
FROM greatTable 
WHERE field1 = @field1
AND (@field2 IS NULL OR field2 = @field2)

请注意,使用此方法时,由于索引可能会导致性能下降。有关详细信息,请查看this article

答案 1 :(得分:0)

一种肮脏的方法: isnull(field2,0)= isnull(@ param2,0)

有一些永远不会出现在字段或param

中的东西

答案 2 :(得分:0)

一个很好的问题,但在实践中我没有时间这样的问题。如果我使用AddParameter,那么我也在相同的代码片段中构造查询的字符串。所以如果我知道,现在我应该搜索“@ field2”等于NULL我决定是否构造

string query = "SELECT * " +
    "FROM greatTable " +
    "WHERE field1 = @field1";

string query = "SELECT * " +
    "FROM greatTable " +
    "WHERE field1 = @field1 AND field2 IS NULL";

并只添加一个参数

cm.AddParameter("@field1", "352515");

所以我没时间描述你所描述的问题。

更新:用户输入的最佳(或唯一正确)方式是什么,您应根据上下文决定。在大多数情况下,不需要“AND field2 IS NULL”,但我读了你的问题,在你的特殊情况下,用户可以明确地选择不是“”(空字符串),而是一个NULL值。