我已经搜索了几个小时,但找不到解决方案。
我正在将一些字符串插入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
和UPDATE
操作上将空字符串替换为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);
我错过了字符串。IsNull或Empty part。
只需从微软文档中检查
public System.Data.SqlClient.SqlParameter AddWithValue (string parameterName, object value);
DBNull 和字符串类都是从对象继承的,因此您可以强制转换它们并在第二个参数中传递对象类型。
如果字符串为空,将 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);