C# & SQL Server : how to Insert DBNull. 如果字符串值为空,命令参数中的值?

标签 c# sql-server null sql-insert

我已经搜索了几个小时,但找不到解决方案。

我正在向 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);
    }
}

最佳答案

1) 最简单的方案大家都已经提到了:

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

2) 如果您可以修改数据库本身,则可以添加触发器以在 INSERT 上用 NULL 替换空字符串>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

免责声明:我不是数据库触发器方面的专家。我改编自 answers on another SO question


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

免责声明:未经测试。我可能在某个地方搞砸了。

关于C# & SQL Server : how to Insert DBNull. 如果字符串值为空,命令参数中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55504761/

相关文章:

c# - 从基类访问应用于派生类中方法的属性

c# - 如何查看 lambda 表达式的 SQL 查询

c# - textarea asp-for 不显示属性

php - 注册页面: Writing 2 MySQL queries into 1 PHP variable

sql-server - 'N' 在这里表示什么?

c# - 在文本框中添加数字

c# - UnityEngine.GameObject 与 Generic.List<UnityEngine.GameObject>

sql-server - 在带有可选参数的存储过程中使用 UPDATE

c++ - 内存中是否有地址为 NULL(0) 的物理部分?

vb.net - Vb 函数返回 null