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

Yon*_*oni 10 c# dbnull asp.net-development-serv executescalar

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

DataRow dr已存在且列"COLNAME"也存在.
comTBP是我的SqlCommand.

dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar());
Run Code Online (Sandbox Code Playgroud)

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

Pio*_*cik 18

ExecuteScalarDBNull从null 返回null值query并且null没有结果.也许在您的开发服务器上它从未发生过(null由此产生query).


Dav*_*ras 8

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

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

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