2012-05-23 179 views
0

我想知道是否這是一個很好的方式做數據訪問,在所有的數據庫對象被正確關閉和處置?例如:VB.NET:嵌套「使用」數據庫訪問

Using conn As New SqlConnection(MyConnectionString) 
    Using cmd As New SqlCommand("some SQL here", conn) 
    ... add parameters ... 
    conn.Open() 
    Using dr As SqlDataReader = cmd.ExecuteReader() 
     While dr.Read() 
     ... do stuff ... 
     Wend 
    End Using 
    End Using 
End Using 

嵌套Using像可接受的實踐?如果我在Read()循環中的某個點退出方法,那麼像這樣使用Using將確保所有對象都被正確清理,無論如何,

回答

2

Using保證在隱含的try/finally塊中有序地處置。

' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK 
Dim resource As New resourceType 
Try 
    ' Insert code to work with resource. 
Catch ex As Exception 
    ' Insert code to process exception. 
Finally 
    ' Insert code to do additional processing before disposing of resource. 
    resource.Dispose() 
End Try 

嵌套使用以類似的方式工作。如果您退出一段代碼,它將執行finally塊,並正確處理您的對象。

http://msdn.microsoft.com/en-US/library/htd05whh(v=VS.80).aspx

+0

我從來不知道使用語句本質上是一個嘗試/最後。我總是用try/catch/finally來處理我的連接。 +1爲有用的提示。 – Tony318

+0

聽起來不錯..如果我在任何時候明確地退出該方法,它仍然適用嗎?例如。如果我的SQL是一個'COUNT(*)FROM ...',我使用語句'Return cmd.ExecuteScalar()'。它會在'End Using's之前退出該方法,但是它仍然會清理嗎? –

+1

是的,它應該按照正確的順序觸發所有的'finally'塊。 –

0

是的,這沒關係。 IDisposable對象的Dispose方法始終被調用。

PS:在這種情況下,Dispose方法也包含Close方法。

1

要添加,Using塊將「幕後」添加一個嘗試最後陳述。在finally語句中,它將調用IDisposable.Dispose對象。換句話說,無論你做什麼或發生了什麼,對象都會被丟棄。

0

你正在寫VB.Net,所以這只是部分適用的,但對於那些使用StyleCop的C#人來說,多重using statements這樣會引起異常2202 in StyleCop

msdn鏈接上存在冗長的部分,關於此規則在stylecop中的用處有不同意見。

我不會判斷你是否應該在你的VB.Net代碼中注意C#的StyleCops警告。

+0

謝謝..嵌套使用的不明智,或者只是StyleCop的一個怪癖? –

+0

@ ingredient_15939我猜這個規則主要針對第三方[IDisposable](http://msdn.microsoft.com/en-us/library/system.idisposable.aspx)實現。對於MS代碼,如[SqlConnections](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx),假設它遵循正確的處置技術/模式,我們是非常安全的,所以在IDisposable對象是框架對象的情況下,您可能沒有多個使用語句。 –