2009-07-02 9 views
11

SqlCommand.ExecuteReader() 메서드를 호출 할 때 ReSharper는 나중에 SqlDataReader 개체를 사용할 때 가능한 NullReference 예외가 있음을 알립니다. 다음 코드로SqlCommand.ExecuteReader()는 언제 null을 반환합니까?

그래서이 :

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

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

while (reader.Read()) 라인은 밑줄이 그어집니다.

제 질문은 독자 객체가 언제 null인지 궁금합니다. 나는 그것을 가로 질러 본 적이 없으며 문서에 그것이있을 수 있음을 언급하지 않았다. null인지 또는 무시하는 것이 안전한지 확인해야합니까?

ReSharper는 null이 될 수 있다고 생각하는 이유는 무엇입니까? 예를 들어 SqlCommand를 null로 검사하지 말고 사용할 수 있습니까? ExecuteReader 메서드에 특성이있는 것 같습니다.

답변

11

거짓 긍정입니다.

SqlDataReader.ExecuteReader를 통해, 독자가 null로 반환되는 유일한 방법은 내부 RunExecuteReader 메서드가 returnStream에 대해 'false'로 전달되는 것입니다. 그렇지 않은 경우입니다.

SqlDataReader의 깊이에서 리더 생성자는 항상 어떤 시점에서 호출되므로 실제로 null이 반환되도록 ExecuteReader가 실제로 가능하지는 않습니다.

2

나는이 문제를 몇 가지 다른 영역에서 다루었습니다. CLR의 여러 부분에서 코드 경로를 분석 한 것 같습니다. 그들이 null을 돌려주는 것이 상상할 수 있다고 생각할 때, 그것은 그것에 대해 불평 할 때입니다.

내가 불평 한 특별한 경우에는 null이 실제로 발생할 수 없습니다. 그러나 콜 그래프를 추적하여 일부 상황에서는 null을 반환 할 수있는 메소드를 찾았으며 Null 값이 상위로 전파 될 수 있습니다.

그래서 나는 이것을 이전에 CLR 버그라고 생각한 ReSharper 버그라고 부릅니다.

0

ExecuteReader()가 null을 반환 할 수있는 이유 중 하나를 결정했습니다.

null을 얻는 경우 클라이언트에 저장 프로 시저를 업데이트하는 스크립트를 보냈습니다. 내 클라이언트의 SQL Server (2000)는 DB 사용자가 저장 프로 시저를 실행할 수있는 권한을 필요로하도록 설정됩니다. SP를 업데이트 할 때 권한이 제거되어 다시 할당되지 않았습니다. 이 인스턴스에서는 SqlCommand.ExecuteReader()가 null을 반환했습니다.

권한 재 할당이 문제를 해결했습니다.

0

로그 파일에 대해 .dbo.sysfiles를 쿼리 한 결과로 null이 표시되었습니다. 나는 내 클라이언트를 sysadmin으로 접속했는데, 무슨 일이 일어 났는지 확신하지 못했습니다 ...

3

Resharper가 정확할 수도 있고, 잠재적으로 null을 반환 할 수 있습니다.

ExecuteReader()에 대한 특정 구현이 null 값을 버블 링하지 못하게해도 상관 없습니다. 사실 IDataReader는 null을 포함 할 수있는 (또는 가리킬 수있는) 개체입니다.

  • 미래에 IDbCommand의 다른 구현을 사용하기로 결정한다면 어떻게 될까요?
  • IDbCommnd 구현의 다음 업데이트에 null을 버블 링 할 수있는 코드의 다른 흐름이 포함되면 어떻게 될까요?

당신은 제대로 사용하기 위해 인터페이스의 구현 내부에 무슨 알 필요가 없습니다 - 당신은 단지 인터페이스를 알아야하고, 지금 인터페이스는 반환 값으로 널 수 있습니다.

관련 문제