ExecuteScalar返回null或DBNull(开发或生产服务器)

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

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

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

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

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

在这里查看Rein的答案(并投票给他)以获得他的建议解决方案:

无法将类型为“System.DBNull”的对象强制转换为“System.String”

ExecuteScalarquery返回DBNull的null值,并且nullnull 。 也许在您的开发服务器上它从未发生过( query结果为null )。

在SQL中使用ISNULL()函数。

ISNULL(check_expression,replacement_value)

即…

SELECT ISNULL(SUM(Price),0)FROM Order

Interesting Posts