在参数化查询中处理可空值的正确方法?

时间:2011-12-20 03:07:13

标签: c# .net sql-server

假设我正在查询表,并且null可能是要查找的值之一。一个像这样设置的查询

command.CommandText = "select * from People where Saluation = @salutation";

if(salutation != null) command.Parameters.AddWithValue("@salutation", salutation);
else command.Parameters.AddWithValue("@salutation", DBNull.Value);
在称呼为空时,

不会返回任何结果。所以我倾向于这样做,但对我来说感觉很丑:

string whereClause;
if(!string.IsNullOrEmpty(salutation))
{
    whereClause = "Salutation = @salutation";
    command.Parameters.AddWithValue("@salutation", salutation);
}
else whereClause = "Salutation is null";

command.CommandText = "select * from People where " + whereClause;

有更正确的方法吗?

5 个答案:

答案 0 :(得分:3)

我可能会避免连接来构建你的where子句。您可以将sql更改为以下内容。可以为SQL注入攻击打开自己。

command.CommandText = "select * from People where (@salutation is null and salutation is null) or Saluation = @salutation";

答案 1 :(得分:1)

您可以添加一个额外的参数来指定是否要返回空值,并稍微修改您的查询。

使用您的示例:

command.CommandText = "select * from People where ((@IsNull_Salutation = 1 AND Salutation IS NULL) OR (Saluation = @Salutation))"; 

command.Parameters.AddWithValue("Salutation", salutation ?? (object)DBNull.Value); 
command.Parameters.AddWithValue("IsNull_Salutation", (salutation == null) ? 1 : 0); 

这使您可以完全参数化查询。如果您决定要停止返回空值,则只需将传入的值更改为IsNull_Salutation参数。

从内存中,这类似于SqlCommandBuilder类在其自动生成的插入/更新/删除查询中处理空值的方式。

答案 2 :(得分:0)

也许您可以使用COALESCE功能,将默认值设置为第二个参数。

答案 3 :(得分:0)

保持简单: 只需使用这样的WHERE子句

WHERE @field IS NULL OR field = @field

Sql Server足够聪明,可以根据@field参数的值使用正确的条件。 在这种情况下重要的是 - 在SELECT stmt中使用之前不要更改查询中的参数值。

答案 4 :(得分:-1)

command.CommandText = "select * from People where Saluation ";
command.CommandText += salutation != null ? ("= " + salutation) : "is NULL";