通过参数

时间:2019-03-13 11:50:10

标签: 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为空,例如:

  • 名字= John
  • 姓氏= 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";

3 个答案:

答案 0 :(得分:8)

基本上:没有。

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

(或您要对null执行的任何测试)-并使用类似的内容:

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;
    }
}

答案 1 :(得分:0)

您可以为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");

答案 2 :(得分:-1)

与SQL Server数据库中的NULL值相对应的参数的值为DBNull.Value

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