문제

호출을 사용할 때 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을 확인하지 않고 사용할 수있게되면 왜 NULL을 확인할 수 있습니까? Executereader 메소드에 속성이있는 것 같습니다.

도움이 되었습니까?

해결책

그것은 거짓 긍정적입니다.

SQLDATAREADER.EXECUTEREADER를 반영하면 독자가 NULL로 반환되는 유일한 방법은 내부 runExeCutereader 메소드가 returnStream에 대해 'false'로 전달되는 경우라는 것을 알 수 있습니다.

sqldatareader의 깊이에서 독자 생성자는 항상 어느 시점에서 호출되므로 Executereader가 NULL을 반환하는 것이 물리적으로 불가능하다고 확신합니다.

다른 팁

resharper는 맞습니다. 잠재력이 null을 반환 할 수 있습니다.

특정 구현 여부는 중요하지 않습니다 ExecuteReader() 널 값을 기포 할 수는 없습니다. 사실은 IdataReader가 널을 포함하거나 가리킬 수있는 물체라는 사실이 남아 있습니다.

  • 미래에 다른 구현을 사용하기로 결정한 경우 IDbCommand?
  • 해당 IDBCOMMND 구현의 다음 업데이트에 코드에 다른 흐름이 포함되어있어 널을 거품 할 수있게되면 어떻게해야합니까?

인터페이스 구현 내에서 올바르게 사용하기 위해 어떤 일이 발생하는지 알 필요가 없습니다. - 인터페이스를 알아야하며 지금은 인터페이스가 널을 리턴 값으로 허용합니다.

나는 다른 몇 가지 영역에서 그들과 함께이 문제를 겪었습니다. CLR의 여러 부분에서 코드 경로를 분석 한 것 같습니다. 그들이 NULL을 반환하는 것이 생각할 수 있다는 것을 알게되면, 그것은 그것에 대해 불평 할 때입니다.

내가 불평 한 특별한 경우, Null은 실제로 일어날 수 없었습니다. 그러나 그들은 전화 그래프를 어떤 상황에서는 NULL을 반환 할 수있는 방법으로 추적했으며, 널 값은 상단으로 전파 될 수 있습니다.

그래서, 나는 그것을 resharper 버그라고 부릅니다 (이전에 CLR 버그라고 생각했습니다).

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

널을 받고있는 경우, 저장 프로 시저를 업데이트하기 위해 내 고객에게 스크립트를 보냈습니다. 내 클라이언트의 SQL Server (2000)가 설정되어 DB 사용자가 저장 프로 시저를 실행할 권한이 필요합니다. 그들이 SP를 업데이트했을 때 권한이 제거되어 재 할당되지 않았습니다. 이 경우 sqlcommand.executereader ()가 null을 반환했습니다.

허가를 다시 할당하면이 문제가 해결되었습니다.

로그 파일에 대해 .dbo.sysfiles를 쿼리하고 null 답례로. 내 클라이언트가 Sysadmin이었던 시스템 사용자로서의 클라이언트를 연결 시켰습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top