什么时候SqlCommand.ExecuteReader()会返回null?

时间:2009-07-02 02:08:25

标签: .net resharper nullreferenceexception sqlcommand

当使用调用SqlCommand.ExecuteReader()方法时,ReSharper告诉我,之后我使用SqlDataReader对象时可能会出现NullReference异常。

所以使用以下代码:

using (SqlConnection connection = GetConnection())
{
    using (SqlCommand cmd = connection.CreateCommand())
    {
        cmd.CommandText = ; //snip

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                //snip
            }
        }
    }
}

while (reader.Read())行加下划线。

我的问题是读者对象何时会为空?我从来没有遇到它,文档没有提到它可能。我应该检查它是否为空或是否可以安全忽略?

为什么ReSharper认为它可能为null,例如它让我使用SqlCommand而不建议检查null?我猜是ExecuteReader方法有一个属性。

6 个答案:

答案 0 :(得分:11)

这是误报。

反思SqlDataReader.ExecuteReader,我可以看到读取器返回null的唯一方法是,如果内部RunExecuteReader方法为returnStream传递'false',则不是。

在SqlDataReader的深处,总是会在某个时刻调用 a reader构造函数,所以我很确定ExecuteReader在物理上不可能返回null。

答案 1 :(得分:3)

Resharper是正确的,它可以返回null潜力。

ExecuteReader()的特定实现是否不允许冒出空值并不重要 - 事实仍然是IDataReader是一个可以包含(或指向)null的对象。

  • 如果将来您决定使用IDbCommand的其他实现
  • ,该怎么办?
  • 如果该IDbCommnd实现的下一次更新将在代码中包含一个允许冒泡null的不同流程,该怎么办?

您不需要知道接口实现中发生了什么以便正确使用 - 您只需要知道接口,现在接口允许null作为返回值

答案 2 :(得分:2)

我在其他几个方面遇到过这个问题。看起来他们已经对CLR的各个部分中的代码路径进行了分析。当他们发现可以想到返回null时,那就是他们抱怨它的时候。

在我抱怨的特定情况下,null实际上不会发生。但是,在某些情况下,他们将调用图跟踪到一个可以返回null的方法,并且可以想象空值可以传播到顶部。

所以,我称之为ReSharper错误(我之前称之为CLR错误)。

答案 3 :(得分:0)

我已经确定了ExecuteReader()可以返回null的一个原因。

在我获得null的情况下,我向客户端发送了一个脚本来更新存储过程。我的客户端的Sql Server(2000)已设置为DB用户需要权限才能执行存储过程。当他们更新SP时,权限被删除而不是重新分配。在这个实例中,SqlCommand.ExecuteReader()返回null。

重新分配权限修复此问题。

答案 4 :(得分:0)

我遇到了一个问题,我查询了.dbo.sysfiles的日志文件并获得了null作为回报。 我让我的客户端连接为系统管理员的SYSTEM用户,不知道发生了什么......

答案 5 :(得分:0)

对我来说它不为空,但在 Powershell 中查看时不会输出任何内容。 当查询没有返回任何行时,就会发生这种情况。