C # & SQL Server: как вставить DBNull.Value в параметр команды, если строковое значение пусто? - PullRequest
1 голос
/ 04 апреля 2019

Я искал пару часов и не могу найти решение.

Я вставляю некоторые строки в SQL, однако в некоторых случаях используемый для этого метод может содержать пустые строки, т. Е. ""

Поэтому я хочу вместо этого вставить SQL-значение в SQL Server.

Сначала я проверяю свой метод, чтобы убедиться, что я могу вставить DBNull.Value вручную, используя следующую команду:

cmd.Parameters.AddWithValue("@surname", DBNull.Value);  // THIS WORKS OK

ОДНАКО, когда я пытаюсь выполнить следующее ниже, метод запускается без каких-либо исключений ошибки, НО столбец SQL Server не показывает нулевое значение, он просто пустой, в котором ничего нет:

cmd.Parameters.AddWithValue("@surname", (object)surname ?? DBNull.Value);

Мне просто нужно эффективное решение, не связанное с более распространенными расширениями классов и не пишущее много дополнительного кода. Каждый ответ, который я вижу на форумах, слишком сложен для такой простой задачи.

Есть идеи? Заранее спасибо ...

Вот полный метод:

public static void AddUserToUserTable(string username, 
        string forename, 
        string surname, 
        string emailAddress, 
        string password, 
        string accountActive, 
        string userGroup)
{
    string cmdText1 = "INSERT INTO Users (Username, Forename, Surname, EmailAddress, Password, AccountActive, UserGroup) VALUES (@username, @forename, @surname, @emailAddress, @password, @userGroup, @accountActive)";

    try
    {
        // The using statement will take care of the disposing of the reader and the command object.
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand cmd = new SqlCommand(cmdText1, connection);

            cmd.Parameters.AddWithValue("@username", username);
            cmd.Parameters.AddWithValue("@forename", forename);
            cmd.Parameters.AddWithValue("@surname", surname, null);
            cmd.Parameters.AddWithValue("@emailAddress", emailAddress);
            cmd.Parameters.AddWithValue("@password", password);
            cmd.Parameters.AddWithValue("@userGroup", accountActive);
            cmd.Parameters.AddWithValue("@accountActive", userGroup);

            connection.Open();
            cmd.ExecuteNonQuery();

            log.Info("NEW User [" + username + "] Created");
        }
    }
    catch (Exception ex)
    {
        log.Error(ex);
    }
}

Ответы [ 5 ]

1 голос
/ 04 апреля 2019

1) Самое простое решение, которое все уже упоминали:

cmd.Parameters.AddWithValue("@surname", 
    String.IsNullOrEmpty(surname) ? DBNull.Value : surname);

2) Если вы можете изменить саму базу данных, вы можете добавитьтриггер для замены пустых строк с NULL в операциях INSERT и UPDATE.Это дает преимущество в обеспечении согласованности, если есть другие разработчики и / или приложения, изменяющие базу данных.

CREATE TRIGGER User_ReplaceEmptyWithNull
    ON 
        Users 
    AFTER 
        INSERT, 
        UPDATE 
    AS
        UPDATE 
            Users
        SET 
            Users.Forename = IIF(inserted.Forename != '', inserted.Forename, NULL),
            Users.Surname = IIF(inserted.Surname != '', inserted.Surname, NULL)
        FROM 
            inserted INNER JOIN Users
                ON inserted.Username = Users.Username

Отказ от ответственности: я не эксперт по триггерам базы данных.Я адаптировал это из ответов на другой вопрос SO


3) Вы можете создать метод расширения для String объектов.

namespace YOUR_NAMESPACE
{
    public static class MyExtensions
    {
        public static object OrDBNull( this String value )
        {
            return String.IsNullOrEmpty(value) ? DBNull.Value : value;
        }
    }   
}

...

cmd.Parameters.AddWithValue("@surname", surname.OrDBNull());

4) Вы можете создать метод расширения для SqlParameterCollection объектов.

namespace YOUR_NAMESPACE
{
    public static class MyExtensions
    {
        public static void AddString( this SqlParameterCollection collection, string parameterName, string value )
        {
            collection.AddWithValue(parameterName, String.IsNullOrEmpty(value) ? DBNull.Value : value);
        }
    }   
}

...

cmd.Parameters.AddString("@surname", surname);

Отказ от ответственности: не проверено.Я наверное где-то напортачил.

0 голосов
/ 04 апреля 2019

попробуйте

string surname = string.Empty;

cmd.Parameters.AddWithValue("@surname", string.IsNullOrEmpty(surname) ? DBNull.Value :(object)surname);
0 голосов
/ 04 апреля 2019

быстрое обновление, я только что увидел другой поток и попробовал следующий код ниже, который работает для меня, не уверен, что это способ ставок, но выглядит довольно похоже на то, что я пытался достичь:

    cmd.Parameters.AddWithValue("@surname", string.IsNullOrEmpty(surname) ? (object)DBNull.Value : surname);

Мне не хватало строки. IsNullOrEmpty.

0 голосов
/ 04 апреля 2019

Вы можете сделать что-то подобное, чтобы покрыть как пустую строку, так и нулевые значения.

 String.IsNullOrWhiteSpace(paramvalue) ? DBNull.Value : paramvalue
0 голосов
/ 04 апреля 2019

Попробуйте это

              string.IsNullOrEmpty(surname)  ? DBNULL.Value : surname
...