命令的存储过程可以返回null。是否正确检查返回值是否为null或是否还要检查obj是否为空?
object obj = command.ExecuteScalar();
int id = -1;
if (DBNull.Value == obj)
{
id = Convert.ToInt32(obj );
}
答案 0 :(得分:9)
您可能希望将if语句更改为
if (obj != null && DBNull.Value != obj) {
...
}
现在你正试图转换obj == DBNull.Value
。
答案 1 :(得分:3)
如果没有结果,您的查询可以返回null
,因此在一般情况下您应该检查它。 E.g:
SELECT TOP 1 Col1 FROM TABLE WHERE ...
以上查询可以返回:
null
如果没有与WHERE子句匹配的行DBNull.Value
如果第一个匹配的行在Col1中具有NULL值如果您的查询是这样的,您可以保证总会有结果,您只需要检查DBNull。 E.g。
SELECT MAX(Col1) FROM TABLE WHERE ...
如果没有与WHERE子句匹配的行,则上述查询将返回DBNull.Value。它永远不会返回null
。
当然,在某些情况下,您可以保证非空结果,在这种情况下,您不需要测试null或DBNull。 E.g。
SELECT COUNT(Col1) FROM TABLE WHERE ...
SELECT ISNULL(MAX(Col1),0) FROM TABLE WHERE ...
上述查询将始终返回非null值。它永远不会返回null
或DBNull.Value
。
答案 2 :(得分:1)
使用System.DBNull.Value
。点击此链接http://msdn.microsoft.com/en-us/library/system.dbnull%28v=vs.110%29.aspx
试试这个:
if(DBNull.Value != obj)
{
....
....
}
以下是Null
和DBNull
之间的区别。 What is the difference between null and System.DBNull.Value?