繁体   English   中英

C# 和 SQL Server:如果字符串值为空,如何在命令参数中插入 DBNull.Value?

[英]C# & SQL Server : how to Insert DBNull.Value in command parameter if string value is empty?

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

我在 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)如果你可以修改数据库本身,你可以添加一个触发器来在INSERTUPDATE操作中用NULL替换空字符串。 如果有其他开发人员和/或应用程序更改数据库,这具有确保一致性的优势。

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

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

快速更新,我刚刚看到另一个线程并尝试了以下对我有用的代码,不确定它是否是下注方式,但看起来与我试图实现的非常相似:

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

我错过了 string.IsNullOrEmpty 部分。

只需从微软文档中查看

public System.Data.SqlClient.SqlParameter AddWithValue (string parameterName, object value);

DBNull 和 string 类都继承自 Object,因此您可以将它们强制转换并在第二个参数中传递对象类型。

如果字符串为空,将 DBNull.Value 添加到 SQL 服务器的一个简单建议如下

在您的代码中尝试以下操作(它有效):您还需要知道 ?? 操作员

string sql = "INSERT INTO [table] (columnName) VALUES (?);";
cmd.Parameters.AddWithValue("@columnName", (object)model.value ?? DBNull.Value);

尝试这个

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

你可以做这样的事情来覆盖空字符串和空值。

 String.IsNullOrWhiteSpace(paramvalue) ? DBNull.Value : paramvalue

尝试这个

string surname = string.Empty;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM