Передайте "IS NULL" через параметр - PullRequest
5 голосов
/ 13 марта 2019

У меня есть 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 были нулевыми, например:

  • Имя = Джон
  • Фамилия = Доу
  • Город = ""
  • Address = ""
  • Телефон = 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 ]

8 голосов
/ 13 марта 2019

В основном: нет.

Если вы не отключили синтаксис 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;
    }
}
0 голосов
/ 13 марта 2019

Вы можете создать метод расширения для 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");
0 голосов
/ 13 марта 2019

Значение параметра, соответствующего значению NULL в базе данных SQL Server, равно DBNull.Value.

Parameters.Add(“@NAME”, SqlDbType.<type>).Value = argument == null ? DBNull.Value : argument;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...