我刚刚读出了使用
将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#代码?
有更好的方法吗?
答案 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)。但希望它能给你正确的想法。