我已经搜索了几个小时,但找不到解决方案。
我正在向 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/