我需要帮助参数化此查询。
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);
[修改
最佳选择是什么?
保持CommandText不变,以便重用Sql中的计划
WHERE(field2 = @ field2 OR @ field2 IS NULL)
根据用户引入的值动态更改CommandText。
WHERE field2 IS NULL
我不只是在一个领域思考,它可能是各种各样的。
答案 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值。