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