【问题标题】:Convert empty string into Null to save Null Values into SQL Server database将空字符串转换为 Null 以将 Null 值保存到 SQL Server 数据库中
【发布时间】:2014-04-25 01:42:44
【问题描述】:

我刚刚读出了非常好的答案,使用

将 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 并保存 null 但为什么不接受

oCourseRegistrationPaypal.UserTheoryTrainingDate4 = null;

来自我的 C# 代码?

有没有更好的方法来做到这一点?

【问题讨论】:

  • oCourseRegistrationPaypal 到底是什么?
  • 不要将DBNull.Value 转换为对象。直接保存。
  • @attila 它是我的自定义类型层的对象,我想在这个对象中存储 null,然后我把这个对象传递给我写下保存过程的数据访问层。

标签: c# sql-server sqlcommand


【解决方案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

【讨论】:

  • 当我尝试保存 oCourseRegistrationPaypal.UserTheoryTrainingDate2 = DBNull.Value;它给了我无法将 dbnull 转换为字符串的错误。
  • 因为 DBNull.Value 不是字符串。
  • 我不想使用 sql 参数等保存空值,但我只想在 oCourseRegistrationPaypal.UserTheoryTrainingDate2 中保存空值?这可能吗?
  • 是的,oCourseRegistrationPaypal.UserTheoryTrainingDate2 = null
  • 听起来您可能会将nullDBNull 混淆。后者用于将 null 指定为 SQL/db 参数。前者几乎在其他任何地方都用于表示 null。
【解决方案2】:

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

好消息是它猜对了大部分代码,即使它猜错了代码仍然可以正常工作。但是,在极少数情况下,这会导致您的代码崩溃并引发异常。一个更常见的问题是,这将导致您的数据库需要逐行转换,或者破坏索引的使用。它可以接受一个在测试中立即返回的查询,并使其在生产中运行几分钟。

与条件运算符检查结合使用时问题会更严重,因为它会强制您将双方都强制转换为Object。这消除了 ADO.Net 在猜测数据库类型时获得的最重要的提示。 ADO.Net 所看到的不是字符串、Datetime、Double 等,而是“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)。但希望它能给你正确的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2022-01-08
    • 2020-06-20
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多