在ASP.NET参数化查询中插入“ NULL”或“ NOT NULL”

时间:2019-06-27 13:19:00

标签: c# asp.net tsql

我有一个asp DropDownList,用于过滤数据库结果。我的过滤器之一用于检查列是NULL还是NOT NULL:

<asp:DropDownList runat="server" id="activeFilter" CssClass="form-control"  AutoPostBack="false" >
  <asp:ListItem selected="True" value="">-- Filter By Active/Inactive </asp:ListItem>
  <asp:ListItem value="NOT NULL">Active</asp:ListItem>
  <asp:ListItem value="NULL">Inactive</asp:ListItem>
</asp:DropDownList>

然后我尝试将其插入参数化查询中,如下所示:

//called from another method

string query = ".... AND Status=@statusFilter ...."
SqlConnection conn = new SqlConnection(connString)
SqlCommand command = new SqlCommand(query, conn)
command.Parameters.AddWithValue("@statusFilter", statusFilter.SelectedValue);

//other stuff, make sql call

此过程适用于其他过滤器值,例如

"... AND Name=@nameFilter ..."

其中nameFilter可能是“ John”,“ Tim”,“ Amy”等,因此我假设这与NULL和NOT NULL实际上不应该是字符串有关。有什么简单的解决方案吗?我看到我可以添加DBNull.Value,但是NOT NULL呢?

任何帮助将不胜感激。

编辑: 抱歉,每个人在第一篇文章中都犯了一个错误-我复制了错误的查询字符串。我的查询字符串实际上是

"... AND Date_Completed IS @activeFilter ..." 

我知道我不能说Column = Null,所以我再次表示歉意。我现在将遍历所有建议并更新每个人。

编辑2: 好的,问题是您不能将NULL / NOT NULL视为参数。我希望可以将其用作参数,因为我有许多实用程序函数可以基于许多不同的过滤器来生成最终查询。最终,这不起作用,我需要更改我的方法,并使用If / Else块直接插入整个“ IS NULL”或“ IS NOT NULL”。

2 个答案:

答案 0 :(得分:1)

这不会像每个人在评论中所说的那样起作用。 您可以执行If来查看所选的值,并且在sql查询中可以使用IS NULL或IS NOT NULL。如下所示:

if (statusFilter.SelectedValue == "NULL"){
   string query = ".... AND Status IS NULL...."
}
else{
   string query = ".... AND Status IS NOT NULL...."
}

答案 1 :(得分:0)

在SQL中,您无法执行= null,也无法参数化is nullis not null

但是,这并不意味着它无法解决-这样的事情可以解决问题:

...AND (Status = @Status OR 
    (Status IS NULL OR @Active = 'NULL') OR 
    (Status IS NOT NULL AND @Active = 'NOT NULL') 
)...