2008-09-30 37 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 

代碼但是Visual Studio中仍警告我說的

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

燦導致NullReferenceException。減輕這種情況的最佳方法是什麼?我不能將聲明移動到try塊中。

回答

9

明確初始化博士聲明沒有這樣:

Dim dr As DbDataReader = Nothing 

,警告就會消失。

0

您的代碼是正確的。在finally語句中,只要您檢查以確保您的對象不爲空,它將不會根據代碼中發生的情況拋出空引用異常。

0

我不太清楚,VB.NET如何初始化變量,但在C#中,您必須在某處使用它們之前設置「dr」某個值/引用。

我認爲這應該工作:

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工作。 – 2008-09-30 11:58:12

4

如果GetDataReader拋出,dr將不會被分配,並將仍然有其初始值。 VB.NET確實初始化引用Nothing,但編譯器不會讓你依賴它。

如果使用.NET 2.0,我會建議Using聲明:

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