0

我想知道这是否是一种进行数据访问的好方法,就所有数据库对象被正确关闭和处置而言?例如:

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这样的方法是否可以确保所有对象都被正确清理?

4

4 回答 4

2

Usingtry/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

于 2012-05-23T20:45:23.400 回答
1

要添加,Using 块将“在幕后”添加一个 Try Final 语句。在 finally 语句中,它将在对象上调用 IDisposable.Dispose。换句话说,无论你做什么或发生什么,对象都会被处理掉。

于 2012-05-23T20:46:40.037 回答
0

是的,这没关系。IDisposable 对象的 Dispose 方法总是被调用。

PS:在这种情况下,Dispose 方法还包含 Close 方法。

于 2012-05-23T20:44:04.010 回答
0

您正在编写 VB.Net,因此这仅部分适用,但对于使用 StyleCop 的 C# 人员来说,像这样的多个using 语句将导致 StyleCop 中的异常2202

关于该规则在 stylecop 中的有用性的反对意见的msdn链接中有一个很长的部分。

我不会判断您是否应该在您的 VB.Net 代码中注意 StyleCops 对 C# 的警告。

于 2012-05-23T20:52:32.920 回答