【问题标题】:DBNull check for ExecuteScalarDBNull 检查 ExecuteScalar
【发布时间】:2014-01-15 09:44:48
【问题描述】:

命令的存储过程可以返回null。检查返回值是否为null是正确的方法还是我应该同时检查obj是否为null?

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

【问题讨论】:

  • 执行标量将始终返回一个通用对象。因此,在检查对象值之前检查 null 会更好。

标签: c# sql dbnull


【解决方案1】:

您可能希望将 if 语句更改为

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

现在您正在尝试转换 if obj == DBNull.Value。

【讨论】:

    【解决方案2】:

    如果没有结果,您的查询可以返回null,所以在一般情况下,您应该检查它。例如:

    SELECT TOP 1 Col1 FROM TABLE WHERE ...
    

    以上查询可以返回:

    • null 如果没有匹配 WHERE 子句的行
    • DBNull.Value 如果第一个匹配行在 Col1 中有 NULL 值
    • 否则为非空值

    如果您的查询可以保证始终有结果,则只需检查 DBNull。例如

    SELECT MAX(Col1) FROM TABLE WHERE ...
    

    如果没有匹配 WHERE 子句的行,上述查询将返回 DBNull.Value。它永远不会返回null。

    当然,在某些情况下,您可以保证结果为非空,在这种情况下,您不需要测试空或 DBNull。例如

    SELECT COUNT(Col1) FROM TABLE WHERE ...
    SELECT ISNULL(MAX(Col1),0) FROM TABLE WHERE ...
    

    上述查询将始终返回一个非空值。它永远不会返回 null 或 DBNull.Value。

    【讨论】:

      【解决方案3】:

      使用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?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多