2011-03-17 4 views
0
Public Function ExecCommand(ByVal sql As String) As SqlDataReader 
    Dim dReader As SqlDataReader 
    Dim cmd As New SqlCommand() 
    cmd.CommandText = sql 
    cmd.Connection = sm 
    Dim isOpened = OpenConnection() 
    If isOpened Then 
     dReader = cmd.ExecuteReader() 
     CloseConnection() 
    End If 
    Return dReader 
End Function 

그것은 아마도 null refrence가 그 datareader의 선언을 위해 런타임에 발생할 수 있습니다 말합니다. 왜 그런가요?초보자 이민 C 날카로운에서 Vb로 간단한 문제

+2

'isOpened'는 거짓입니까? – Heinzi

+0

나는 종종이 사이트에 게시 된 코드 중 일부를 볼 때 울기를 원합니다. –

답변

5

If 조건이 충족되지 않으면 dReader 변수가 초기화되지 않을 수 있기 때문입니다. 당신은 기본적으로 Nothing로 초기화 할 수 있습니다 :

Dim dReader As SqlDataReader = Nothing 

은 분명히이 방법의 호출자는이 사건을 처리해야합니다.

C# 이민자는 컴파일 타임 오류가 발생하지 않고 경고 만 받는다는 것에 놀랄 것입니다.

2

OpenConnection()이 실패하면 isOpened가 false입니다. 다음 블록은 실행되지 않고 dReader가 할당되지 않습니다.

Public Function ExecCommand(ByVal sql As String) As SqlDataReader 
    Dim dReader As SqlDataReader  // Not assigned yet 
    Dim cmd As New SqlCommand() 
    cmd.CommandText = sql 
    cmd.Connection = sm 
    Dim isOpened = OpenConnection() // Fails to connect 
    If isOpened Then     // Not executed 
     dReader = cmd.ExecuteReader() 
     CloseConnection() 
    End If 
    Return dReader      // Return value unknown 

(!) 참고로, CloseConnection()가 실행되지 않습니다 중 하나 그래서 당신은 몇 가지 문제가 나중에있을 수 있습니다.

+0

좋습니다, 감사합니다 –

0

add else dreader를 null로 지정하는 statemnt.

Public Function ExecCommand(ByVal sql As String) As SqlDataReader 
Dim dReader As SqlDataReader=Nothing 
Dim cmd As New SqlCommand() 
cmd.CommandText = sql 


cmd.Connection = sm 

희미한 isOpened = 대해서 openConnection() 만약 isOpened 그런 dReader = cmd.ExecuteReader() CloseConnection()
최종면
반환 dReader 종료 함수가있는 경우 반환하도록되어 어떤 기능

+0

null 참조가 여전히 발생합니다 ... – David