3

私はデータベースからいくつかのデータをフェッチするためにSQLDataReaderを使用しています。接続でReaderを使用すると、接続のみを閉じ、Readerは閉じません。接続リークの可能性はありますか?

これが私が使用しているコードです

 Public Sub Get_SomeData(ByVal sCon As String,ByRef ObjectToReturn As SomeClass)
        Dim sqlCon As SqlConnection = New SqlConnection(sCon)
        Dim sqlR As SqlDataReader = Nothing
        Dim sqlCmd As SqlCommand = New SqlCommand
        sqlCmd.CommandType = CommandType.StoredProcedure
        sqlCmd.Connection = sqlCon
        sqlCmd.CommandText = "get_SomeData"
        sqlCon.Open()
        sqlR = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection)
        If sqlR.HasRows And sqlR.Read Then
            ObjectToReturn.Property1 = sqlR("Column1").ToString
            ObjectToReturn.Property1 = sqlR("Column1").ToString
            ObjectToReturn.Property1 = sqlR("Column1").ToString
            ObjectToReturn.Property1 = sqlR("Column1").ToString
        End If
        sqlCon.Close()
    End Sub
4

1 に答える 1

2

いいえ、接続を閉じるだけで十分ですが、より良いアプローチはUsingステートメントを使用することです

    Using sqlCon = New SqlConnection(sCon)
        Dim sqlR As SqlDataReader = Nothing
        Using sqlCmd = New SqlCommand
            sqlCmd.CommandType = CommandType.StoredProcedure
            sqlCmd.Connection = sqlCon
            sqlCmd.CommandText = "get_SomeData"
            sqlCon.Open()
            Using sqlR = sqlCmd.ExecuteReader()
                If sqlR.HasRows And sqlR.Read Then
                    ObjectToReturn.Property1 = sqlR("Column1").ToString
                    .......
               End If
            End Using
       End Using
  End Using

使用に関する MSDN ドキュメントの重要な部分

コードで、ファイル ハンドル、COM ラッパー、SQL 接続などのアンマネージ リソースが必要になる場合があります。Using ブロックは、コードの処理が終了したときに、1 つ以上のそのようなリソースの破棄を保証します。これにより、他のコードで使用できるようになります。

マネージド リソースは、追加のコーディングを行わなくても、.NET Framework のガベージ コレクター (GC) によって破棄されます。管理対象リソースの Using ブロックは必要ありません。ただし、ガベージ コレクターを待つ代わりに、Using ブロックを使用して管理対象リソースを強制的に破棄することもできます。

于 2012-12-20T10:00:12.000 に答える