【问题标题】:ExecuteScalar() sometimes returns empty but not null object. Why?ExecuteScalar() 有时会返回空但不为空的对象。为什么?
【发布时间】:2013-11-08 08:39:10
【问题描述】:

ExecuteScalar() 有时会返回空对象 -not null- 尽管记录存在。当我用 quickwatch 分析这个对象时,我看到object.GetType() 等于DbNull。 我可以处理这个空对象,但我需要知道为什么它有时会返回空对象,尽管记录存在。

string sql = @"SELECT SentDate 
               FROM dbo.EmailOut                                    
               WHERE ID = @ID";
SqlCommand cmd = new SqlCommand(sql, _cnn);
cmd.CommandType = System.Data.CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@ID", ID));
object obj = cmd.ExecuteScalar();
if (obj == null)
    return false
sentDate = (DateTime)obj;
cmd.Dispose();

大多数情况下,我的查询都能完美运行。你能检查我的代码吗?

【问题讨论】:

  • 那个“空”对象 null。
  • 记录可能存在,但SentDate 列可能是null
  • 希望这只是一个示例,但您应该将 SqlCommand 包装在 using 语句中
  • 发送日期列不为空。我确定。很奇怪
  • @SecretSquirrel:一般来说,是的。在这种情况下,它并不是非常糟糕,因为 SqlCommand.Dispose 本质上是一个空操作。但是,人们不应该习惯它,因为例如,不处理 OleDbCommand 或 SqlCeCommand 造成麻烦。

标签: c# executescalar


【解决方案1】:

返回值null 表示没有找到记录。

返回值DBNull表示找到了一条记录,但该记录中SentDate的值是NULL

【讨论】:

  • 但 sentdate 不为空
  • @cihata87:这……太令人惊讶了。您确定吗?你能重现这个问题吗?
  • @cihata87:那么我们需要进一步调查。您能否准备一个能够可靠地重现问题的最小样本(包括数据库数据)?
  • 最后我发现记录是在 1 或 2 秒后创建的。但是当我检查 senddate 为空时,因为查询运行得如此之快。所以我做了这个 System.Threading.Thread.Sleep(2000);我总是得到完整的对象。谢谢