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

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

试试这个 :

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

这是NullDBNull之间的区别。 null和System.DBNull.Value有什么区别?