VB.NET:嵌套“使用”进行数据库访问

时间:2012-05-23 20:41:35

标签: vb.net ado.net using

我想知道这是否是一种很好的数据访问方式,所有数据库对象都被正确关闭和处理?例如:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

你正在编写VB.Net,所以这只是部分适用,但是对于那些使用StyleCop的C#人来说,像这样的多个using statements会导致异常2202 in StyleCop

关于此规则在stylecop中的用处,msdn链接上有一段很长的反对意见。

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