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 は、IDisposable を実装する DbCommand を継承しています。

次のことを行うコードを見ていますが、暗黙のカーソルが閉じられないという問題があります。

     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

暗黙カーソルが開いていて、それが問題であることをどのように判断していますか? 私が尋ねる理由は、「Close」メソッドを呼び出しても実際には接続が閉じられないためです。プールが使用されなくなり、別の場所に再割り当てできることをプールに知らせるだけです。実際に物理的に接続を開くにはコストがかかるため、これはパフォーマンス上の理由から行われます。同じ接続が何度も再利用され、「Close」を呼び出した後でも開いたままになる可能性があるため、Oracle ツールを使用して接続をピアリングしている場合、道に迷う可能性があります。

コマンド オブジェクトを明示的に破棄する理由は見たことがありません。これは、パラメーターとその他の情報の単なるコレクションです。

using ブロックを使用する場合、コードで明示的に「Close」または「Dispose」を呼び出す必要はまったくありません。それが using ブロックの要点です。Close を呼び出すのを忘れないように保護します。

于 2009-06-16T13:48:35.697 に答える