【问题标题】:ExecuteScalar returns null or DBNull (development or production server)ExecuteScalar 返回 null 或 DBNull(开发或生产服务器)
【发布时间】:2011-10-28 09:06:25
【问题描述】:

我正在尝试向 C# 中的现有 DataRow 添加一列。之后,该列将填充我数据库中的单个值。

DataRow dr 已存在,并且列“COLNAME”也存在。
comTBP 是我的SqlCommand

dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar());

如果我的数据库中有一个值并且 ExecuteScalar() 可以获得该值,这一切都可以正常工作。如果我在我的开发服务器(本地)上测试此代码,如果 ExecuteScalar() 返回 null 或 DBNull 并且我的新列的值为 0,它也可以工作。但是如果我将代码部署到生产服务器,就会出现问题。如果我做同样的事情,使用相同的数据库,它会抛出一个异常,并显示无法将 DBNull 转换为 Int32 的消息。
我的问题是为什么这个错误出现在生产服务器上而不是我的本地开发服务器上?

【问题讨论】:

  • 生产和开发数据很可能不同。

标签: c# dbnull asp.net-development-serv executescalar


【解决方案1】:

ExecuteScalar 对于来自 querynull 的空值返回 DBNull 对于没有结果。也许在您的开发服务器上它从未发生过(null 结果来自query)。

【讨论】:

    【解决方案2】:

    很明显,在生产中,您要么从命令执行返回一个NULL,要么在连接字符串或其他任何东西中有所不同;作为一般规则,在将ExecuteScalar 的结果直接转换/转换为另一种类型之前,您应该始终测试 DBNull。

    在此处查看 Rein 的答案(并投票给他)以了解他提出的不错的建议解决方案:

    Unable to cast object of type 'System.DBNull' to type 'System.String`

    【讨论】:

    • Convert.ToInt32 from null 结果为 0。
    • 那么要么他没有说出全部真相,要么你错了 ;-) 我过去也遇到过类似的问题,并通过在转换/转换之前始终检查 DBNULL 来解决
    • 我知道它在生产中返回 NULL。它在开发中也返回 NULL,因为它是同一个数据库。我的问题是为什么它在开发中返回 NULL 而在生产中返回 DBNull?在开发中,从 NULL 转换为 Int32 将导致 0,但在生产中它会尝试从 DBNull 转换为 Int32 并引发异常
    • 它写在文档中:Return Value: A 32-bit signed integer equivalent to value, or zero if value is Nothing.
    • AFAIK null 在 C# 中不是 DbNull.Value !!
    【解决方案3】:

    在您的 SQL 中使用 ISNULL() 函数。

    ISNULL(检查表达式,替换值)

    即...

    SELECT ISNULL(SUM(价格),0) 来自订单

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多