0

根据 OracleClient.OracleCommand 的 MSDN 文档:

Public Sub ReadMyData(ByVal connectionString As String)
    Dim queryString As String = "SELECT EmpNo, DeptNo FROM Scott.Emp"
    Using connection As New OracleConnection(connectionString)
        Dim command As New OracleCommand(queryString, connection)
        connection.Open()
        Dim reader As OracleDataReader = command.ExecuteReader()
        Try
            While reader.Read()
                Console.WriteLine(reader.GetInt32(0) & ", " _
                   & reader.GetInt32(1))
            End While
        Finally
            ' always call Close when done reading.
            reader.Close()
        End Try
    End Using
End Sub

OracleCommand 未包装在 Using 块中。

问:应该吗?OracleCommand 继承自 DbCommand,后者实现了 IDisposable。

我正在查看执行以下操作的代码,并且我们遇到了隐式游标未关闭的问题:

     Dim cmd As OracleCommand = createCommand("some sql")
     ds = GetDataSet(cmd)
     cmd.Dispose()
     cmd = Nothing

GetDataSet 看起来像:

  Dim da As New OracleDataAdapter()
  Dim ds As New DataSet()

  Using conn As OracleConnection = GetOpenConnection()
     cmd.Connection = conn
     da.SelectCommand = cmd
     da.Fill(ds, 0)
     cmd.Connection = Nothing
  End Using
  da.Dispose()
  da = Nothing
  Return ds

这会不会泄露资源?

4

2 回答 2

1

首先,我认为您应该在代码中显式关闭连接,因为根据提供者的不同,调用 Close 方法时会完成一些额外的工作

于 2009-06-16T13:11:55.257 回答
1

您如何确定隐式游标已打开并且这是一个问题?我问的原因是调用“关闭”方法实际上并没有关闭连接。它只是让池知道它不再被使用并且可以在其他地方重新分配。这样做是出于性能原因,因为实际打开连接的成本很高。相同的连接将被重复使用多次,并且即使在调用“关闭”之后也可能保持打开状态,因此如果您使用一些 Oracle 工具来查看连接,它可能会让您误入歧途。

我从来没有看到任何明确处置命令对象的理由。它只是参数和其他信息的集合。

如果您使用 using 块,则绝对不需要在代码中显式调用“Close”或“Dispose”。这就是 using 块的重点。它可以防止您忘记调用 Close,因为这正是它为您所做的。

于 2009-06-16T13:48:35.697 回答