c# - 通过参数传递 "IS NULL"

标签 c# wpf sqlite

我有 5 个文本框:

<TextBox Name="txbFirstName" />
<TextBox Name="txbLastName" />
<TextBox Name="txbCity" />        
<TextBox Name="txbAddress" />
<TextBox Name="txbPhone" />

我想使用文本框输入生成简单的 SELECT 语句。为此,我使用了参数和 AddWithValue:

database.SetQuery("SELECT * FROM tblCustomer WHERE FirstName = @FirstName AND LastName = @LastName AND City = @City AND Address = @Address AND Phone = @Phone;");
database.sqlCommand.Parameters.AddWithValue("@FirstName", txbFirstName.Text);
database.sqlCommand.Parameters.AddWithValue("@LastName", txbLastName.Text);
database.sqlCommand.Parameters.AddWithValue("@City", txbCity.Text);
database.sqlCommand.Parameters.AddWithValue("@Address", txbAddress.Text);
database.sqlCommand.Parameters.AddWithValue("@Phone", txbPhone.Text);

现在这工作得很好,但我想做的是,如果文本框输入为空,则用 NULL 处理它。但据我所知,不能在查询中使用“= NULL”,而应该使用“IS NULL”,这意味着我不能这样写:

if (txbCity.Text == "")
    database.sqlCommand.Parameters.AddWithValue("@City", null);
else
    database.sqlCommand.Parameters.AddWithValue("@City", txbCity.Text);

是否可以通过代码将“IS NULL”传递给参数?因此,如果 txbCity 和 txbAddress 为空,例如:

  • 名字 = 约翰
  • 姓氏 = Doe
  • 城市 = ""
  • 地址 = ""
  • 电话 = 812-393-8144

我希望我的查询看起来像这样:

SELECT * FROM tblCustomer WHERE FirstName = "John" AND LastName = "Doe" AND City IS NULL AND Address IS NULL AND Phone = "812-393-8144";

最佳答案

基本上:没有。

除非您禁用了 ANSI NULL 语法(请不要那样做),否则您需要不同的 SQL 来测试 NULL。一个常见的技巧(易于编写,但效率不高)是作弊:

WHERE (FirstName = @FirstName OR (@FirstName IS NULL AND FirstName IS NULL))
AND (LastName = @LastName OR (@LastName IS NULL AND LastName IS NULL))
-- etc x5

(或您想对空值执行的任何测试)- 并使用类似的东西:

database.sqlCommand.Parameters.AddWithValue("@FirstName", txbFirstName.Text.DBNullIfEmpty());
database.sqlCommand.Parameters.AddWithValue("@LastName", txbLastName.Text.DBNullIfEmpty());
// etc x5

DBNullIfEmpty 看起来像这样:

internal static class MyExtensionMethods
{
    public static object DBNullIfEmpty(this string value)
    {
        if(string.IsNullOrWhiteSpace(value)) return DBNull.Value;
        return value;
    }
}

关于c# - 通过参数传递 "IS NULL",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55141221/

相关文章:

c# - 为什么 NHibernate 不从数据库中删除?

.net - 根据行值更改数据网格的行详细信息的数据模板

c# - 在 C#/XAML 应用程序中无法绑定(bind)到属于 WindowsFormsHost 子对象的属性的解决方法?

c# - Instrumenting an expression tree -- 如何得到每个子树的计算结果?

c# - 进程不会在表单关闭时终止

c# - 使整个 LinkLabel 区域可点击

java - Android:getWritableDatabase() 上的错误 NullPointerException

具有简单算术运算的 WPF DataBinding?

c# - 如何忽略 Entity Framework Core SQLite 数据库中的外键约束?

go - 在 Go 中将 Blob 转换为图像