将空字符串转换为Null以将Null值保存到SQL Server数据库中

时间:2014-04-25 01:42:44

标签: c# sql-server sqlcommand

我刚刚读出了使用

将null保存到数据库列中的非常好的答案
string.IsNullOrWhiteSpace(textbox.tex) ? (object)textbox.text: DBNull.Value;

或使用

cmd.Parameters.AddWithValue("foo",
    foo == null ? (object)DBNull.Value : (object)foo);

我也和其他人一起尝试过,但它并不适合我,因为我不是C#语言的专家,但我必须要将null保存到我的SQL Server数据库列中。

这是我的代码,我试图保存空值,但它发送空字符串,这不是我的要求。

oCourseRegistrationPaypal.UserTheoryTrainingDate4 = Convert.ToString(DBNull.Value);

所以当我写

oCourseRegistrationPaypal.UserTheoryTrainingDate4 = null; 

它给我一个错误,我的程序想要的参数没有提供,但我知道我已经提供了null。

写作时

oCourseRegistrationPaypal.UserTheoryTrainingDate4=Convert.ToString(DBNull.Value);

它将空字符串保存在我的数据库列中,但我需要null值。

当我在存储过程中手动保存空值时,它接受null并保存null但是为什么它不接受

oCourseRegistrationPaypal.UserTheoryTrainingDate4 = null;

来自我的C#代码?

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您将DBNull.Value转换为字符串,它会给您一个空字符串。

只需存储DBNull.Value

cmd.Parameters.AddWithValue("foo",
    foo == null ? DBNull.Value : foo);

或者:

cmd.Parameters.AddWithValue("foo",
    foo ?? DBNull.Value);

编辑:根据您对问题的修改,将foo替换为oCourseRegistrationPaypal.UserTheoryTrainingDate4。我上面粘贴的代码会将null替换为DBNull.Value

答案 1 :(得分:0)

您看到的AddWithValue()示例存在问题:它会强制ADO.Net在参数的数据库类型中猜测。通常它会猜对,但有时它会猜错。

好消息是,它猜测大部分都是好的,即使它猜错了代码仍然可以工作。但是,很少这会导致代码爆炸并抛出异常。一个更常见的问题是,这会导致数据库需要按行进行转换,或者破坏索引的使用。它可以在测试中立即返回查询,并使其在生产中运行几分钟。

与条件运算符检查结合使用时问题更严重,因为它会强制您将双方都投射到Object。这将删除ADO.Net在猜测数据库类型时获得的最重要提示。而不是字符串,Datetime,Double等,所有ADO.Net都可以看到“Object”作为.Net类型。这使得更有可能猜出错误的数据库类型。如果这是添加NULL的首选模式,那么整个应用程序的结果将是次优的。

相反,我喜欢这样做:

//explicit DB type, and don't worry about DBNull just yet
cmd.Parameters.Add("foo",  SqlDbType.Int).Value = foo;
cmd.Parameters.Add("bar", SqlDbType.NVarChar, 30).Value = bar;
//if you have more parameters, add them all this way

// after all parameters are added:
foreach(var p in cmd.Parameters.Where(p => p.Value == null))
{
    p.Value = DBNull.Value;
}

这里有一点需要注意:像int和DateTime这样的值类型永远不会匹配那个条件,所以我的实际代码要复杂得多(涉及Nullable<T> s)。但希望它能给你正确的想法。