为了账号安全,请及时绑定邮箱和手机立即绑定

通过参数传递“IS NULL”

通过参数传递“IS NULL”

C#
哆啦的时光机 2022-10-23 15:52:15
我有 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 为空,例如:名字 = 约翰姓氏 = 母鹿城市 = ""地址 = ""电话 = 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";
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

基本上:没有。


除非您禁用了 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;

    }

}


查看完整回答
反对 回复 2022-10-23
?
ITMISS

TA贡献1871条经验 获得超8个赞

您可以为 AddWithValue() 创建一个扩展方法,并在实际值为 NULL 时传递一个额外的第三个参数作为您想要的值


public static class SqlParameterCollectionExtensions {

    public static SqlParameter AddWithValue(this SqlParameterCollection target, string parameterName, object value, object nullValue) {

        if (value == null) {

            return target.AddWithValue(parameterName, nullValue);

        }

        return target.AddWithValue(parameterName, value);

    }

}

后来这样称呼它


database.sqlCommand.Parameters.AddWithValue("@City", txbCity.Text, "IS NULL");


查看完整回答
反对 回复 2022-10-23
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

SQL Server 数据库中的值对应的参数NULL值是DBNull.Value

Parameters.Add(“@NAME”, SqlDbType.<type>).Value = argument == null ? DBNull.Value : argument;



查看完整回答
反对 回复 2022-10-23
  • 3 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信