当使用调用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方法有一个属性。
答案 0 :(得分:11)
这是误报。
反思SqlDataReader.ExecuteReader,我可以看到读取器返回null的唯一方法是,如果内部RunExecuteReader方法为returnStream传递'false',则不是。
在SqlDataReader的深处,总是会在某个时刻调用 a reader构造函数,所以我很确定ExecuteReader在物理上不可能返回null。
答案 1 :(得分:3)
Resharper是正确的,它可以返回null潜力。
ExecuteReader()
的特定实现是否不允许冒出空值并不重要 - 事实仍然是IDataReader是一个可以包含(或指向)null的对象。
IDbCommand
的其他实现您不需要知道接口实现中发生了什么以便正确使用 - 您只需要知道接口,现在接口允许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 中查看时不会输出任何内容。 当查询没有返回任何行时,就会发生这种情况。