DBNull检查ExecuteScalar

时间:2014-01-15 09:44:49

标签: c# sql dbnull

命令的存储过程可以返回null。是否正确检查返回值是否为null或是否还要检查obj是否为空?

object obj = command.ExecuteScalar();
int id = -1;
if (DBNull.Value == obj)
{
   id = Convert.ToInt32(obj );
}

3 个答案:

答案 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值。它永远不会返回nullDBNull.Value

答案 2 :(得分:1)

使用System.DBNull.Value。点击此链接http://msdn.microsoft.com/en-us/library/system.dbnull%28v=vs.110%29.aspx

试试这个:

if(DBNull.Value != obj)
{
 ....
 .... 
}  

以下是NullDBNull之间的区别。 What is the difference between null and System.DBNull.Value?