2011-03-17 54 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 

它說也許在運行時可能會發生空指定,以聲明該datareader。這是爲什麼?從C sharp到Vb簡單問題的初學者移民

+2

什麼是你的函數應該返回如果'isOpened'是錯誤的? – Heinzi 2011-03-17 10:58:24

+0

當我看到本網站上發佈的一些代碼時,我經常想哭。 – 2011-03-17 13:11:11

回答

5

這是因爲,如果如果條件不滿足的dReader變量可能未初始化。你可以在默認情況下將它初始化爲Nothing

Dim dReader As SqlDataReader = Nothing 

顯然,這種方法的調用者需要處理這種情況。

另外,作爲一個C#移民你可能奇怪爲什麼你沒有得到一個編譯時錯誤,但只是一個警告。

2

如果OpenConnection的()失敗,則isOpened是假的。下面的塊不會被執行,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

這很好,謝謝 – 2011-03-19 10:36:24

0

添加在分配dreader爲空別的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

其中空引用仍然會發生... – David 2011-03-17 11:03:06