2008-09-30 6 views
2

아마 이것에 대한 간단한 수정을가한다하지만 현재 비주얼 스튜디오 아직도 날을 경고하지만DataReader를이

dim dr as dbDataReader 

try 
     dr = connection.getDataReader(sql_str) 
Catch ex as sqlClientException 
    log.error(ex) 
finally 

    if not IsNothing(dr) then 
    dr.close 
    end if 
end try 

유사한 코드를 가지고있는

if not IsNothing(dr) then 
     dr.close 
     end if 

수 NullReferenceException이 발생합니다. 이것을 완화하는 가장 좋은 방법은 무엇입니까? 선언을 try 블록으로 옮길 수 없습니다.

답변

9

가 명시 적으로 같은 Nothing으로 박사 선언을 초기화 :

나는이 일을한다고 생각합니다.

0

코드가 정확합니다. finally 문에서 개체가 null이 아닌지 확인하기 만하면 코드에서 발생하는 상황을 기반으로 null 참조 예외가 throw되지 않습니다.

0

VB.NET이 변수를 초기화하는 방법을 정확히 기억하지 않지만 C#에서는 어딘가에서 사용하기 전에 "dr"에 값/참조를 설정해야합니다.

Dim dr As DbDataReader = Nothing 

그리고 경고가 사라집니다 :

dim dr as dbDataReader 

try 
     dr = connection.getDataReader(sql_str) 
Catch ex as sqlClientException 
    log.error(ex) 
    dr = Nothing ' there is the change ' 
' finaly block is not necesary ' 
end try 

if not IsNothing(dr) then 
    dr.close 
end if 
+0

이 솔루션은 VS2008 SP1에서 나를 위해 작동하지 않습니다

.NET 2.0을 사용하는 경우, 나는 Using 문을 추천 할 것입니다. –

+0

'작동하지 않습니다'는 정확히 무엇입니까? 컴파일 오류 (그렇다면 메시지를 보내주십시오)? 또는 런타임에 작동하지 않습니다 (예외가 발생 했습니까? 그렇다면 예외를 보내십시오 .ToString()). 현재 컴퓨터에 VB.NET 컴파일러가 없습니다. ( – TcKs

+0

제안을 적용한 후 원래 포스터의 코드가 생성하는 컴파일 타임 경고가 남아 있습니다. –

4

GetDataReader이 throw되면 dr은 할당되지 않으며 계속 초기 값을 갖습니다. VB.NET은 Nothing에 대한 참조를 초기화하지만 컴파일러는 이에 의존하지 않습니다.

Using dr As DbDataReader = connection.GetDataReader(sql_str) 
    Try 
     ' Do something with dr ' 
    Catch ex As SqlClientException 
     log.error(ex) 
    End Try 
End Using