猿问

通过参数传递“IS NULL”

我有 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";



哆啦的时光机
浏览 92回答 3
3回答

牧羊人nacy

基本上:没有。除非您禁用了 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{&nbsp; &nbsp; public static object DBNullIfEmpty(this string value)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if(string.IsNullOrWhiteSpace(value)) return DBNull.Value;&nbsp; &nbsp; &nbsp; &nbsp; return value;&nbsp; &nbsp; }}

ITMISS

您可以为 AddWithValue() 创建一个扩展方法,并在实际值为 NULL 时传递一个额外的第三个参数作为您想要的值public static class SqlParameterCollectionExtensions {&nbsp; &nbsp; public static SqlParameter AddWithValue(this SqlParameterCollection target, string parameterName, object value, object nullValue) {&nbsp; &nbsp; &nbsp; &nbsp; if (value == null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return target.AddWithValue(parameterName, nullValue);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return target.AddWithValue(parameterName, value);&nbsp; &nbsp; }}后来这样称呼它database.sqlCommand.Parameters.AddWithValue("@City", txbCity.Text, "IS NULL");

繁星淼淼

SQL Server 数据库中的值对应的参数NULL值是DBNull.Value。Parameters.Add(“@NAME”,&nbsp;SqlDbType.<type>).Value&nbsp;=&nbsp;argument&nbsp;==&nbsp;null&nbsp;?&nbsp;DBNull.Value&nbsp;:&nbsp;argument;
随时随地看视频慕课网APP
我要回答