处理Command / Data Reader对象

时间:2014-12-31 14:24:22

标签: vb.net

请从以下网页查看以下代码:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand(v=vs.110).aspx

Public Sub ReadOrderData(ByVal connectionString As String)
    Dim queryString As String = _
        "SELECT OrderID, CustomerID FROM dbo.Orders;" 
    Using connection As New SqlConnection(connectionString)
        Dim command As New SqlCommand(queryString, connection)
        connection.Open()
        Dim reader As SqlDataReader = command.ExecuteReader()
        Try 
            While reader.Read()
                Console.WriteLine(String.Format("{0}, {1}", _
                    reader(0), reader(1)))
            End While 
        Finally 
            ' Always call Close when done reading.
            reader.Close()
        End Try 
    End Using 
End Sub

SQLCommand对象未包含在Using语句中。但是,此问题中的代码(例如)是:SqlCommand with using statement

我看到很多代码包含未包含在Using语句中的数据读取器和命令。命令和数据读取器实现IDisposable。你必须将它们包装在Using statements / call .dispose?

我的一个想法是,当它们链接到的连接被释放时,DataReaders和Commands会被隐式关闭。这是对的吗?

2 个答案:

答案 0 :(得分:2)

处理连接时,数据读取器和命令不会关闭或处理。它们不可用,因为它们引用了不再活动的连接。

离开它们而不进行处理不会对数据库施加任何压力,但这会给垃圾收集器带来更多的工作。

当处理对象时,它们将从终结器队列中删除,以便垃圾收集器可以一次性删除它们。

如果不进行处理,垃圾收集器首先必须将它们移动到可释放队列,后台线程将逐个调用它们上的Finalize方法。之后,垃圾收集器可以删除它们。

答案 1 :(得分:-1)

您应始终使用Using语句。

你会在互联网上看到很多破碎的代码。