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

C# ExecuteScalar返回null或DBNull(开发或生产服务器),c#,dbnull,asp.net-development-serv,executescalar,C#,Dbnull,Asp.net Development Serv,Executescalar,我正在尝试向C中现有的DataRow中添加一列。之后,该列将由数据库中的单个值填充 DataRow dr已存在,列COLNAME也存在。 comTBP是我的SqlCommand 如果我的数据库中有一个值,并且ExecuteScalar可以获得该值,那么这一切都可以正常工作。如果我在我的本地开发服务器上测试这段代码,那么如果ExecuteScalar返回null或DBNull,并且我的新列的值为0,它也可以工作。但是,如果我将代码部署到生产服务器,就会出现问题。如果我对同一个数据库执行相同的操作,

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

DataRow dr已存在,列COLNAME也存在。 comTBP是我的SqlCommand

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

显然,在生产环境中,执行命令时返回的是NULL,或者connectionstring中出现了一些不同的错误,或者其他什么错误;一般来说,在将ExecuteScalar的结果直接转换为另一种类型之前,应该始终测试DBNull

在这里查看Rein的答案,并投票支持他提出的解决方案:


ExecuteScalar为查询中的null值返回DBNull,为无结果返回null。也许在您的开发服务器上,查询结果从未出现空值。

在SQL中使用ISNULL函数

ISNULL检查\u表达式,替换\u值

选择ISNULLSUMPrice,0
FROM Order

Convert.ToInt32 FROM null结果为0。那么要么他没有说出全部真相,要么你错了;-我过去也遇到过类似的问题,通过在转换/转换之前始终检查DBNULL来解决。我知道它在生产中返回NULL。。它在开发中也返回NULL,因为它是同一个DB。我的问题是为什么它在开发中返回NULL,在生产中返回DBNull?在开发过程中,从NULL转换为Int32将导致0,但在生产过程中,它尝试从DBNull转换为Int32,并抛出一个异常。这是在文档中编写的:返回值:一个与值等效的32位有符号整数,如果值为空,则为零。C中的AFAIK NULL不是DBNull。Value!!很可能是关于生产和开发的不同数据。
dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar());