我正在尝试向C#中的现有DataRow
添加列。之后,该列将填充我的数据库中的单个值。
DataRow dr已存在且列“COLNAME”也存在
comTBP是我的SqlCommand
。
dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar());
如果我的数据库中有值,并且ExecuteScalar()可以获得该值,则一切正常。如果我在我的开发服务器(本地)上测试此代码,如果ExecuteScalar()返回null或DBNull并且我的新列的值为0,它也可以工作。但是如果我将代码部署到生产服务器,则会出现问题。如果我使用相同的数据库执行所有操作,则会抛出异常,并显示一条消息,指出它无法将DBNull转换为Int32。
我的问题是为什么这个错误出现在生产服务器上而不是我的本地开发服务器上?
答案 0 :(得分:18)
ExecuteScalar
返回DBNull
以获取query
和null
的空值,但没有结果。也许在您的开发服务器上它从未发生过(null
来自query
)。
答案 1 :(得分:8)
显然,在生产中,您可以从命令执行返回NULL
或者在连接字符串或其他内容中有不同的内容;作为一般规则,您应该在转换/直接转换为另一种类型ExecuteScalar
的结果之前测试DBNull。
在这里检查Rein的答案(并投票给他)以获得他建议的好解决方案:
Unable to cast object of type 'System.DBNull' to type 'System.String`
答案 2 :(得分:2)
在SQL中使用ISNULL()函数。
ISNULL(check_expression,replacement_value)
...即
SELECT ISNULL(SUM(Price),0) 来自订单