0

Please have a look at the code below:

Public Class Form1
    Private _ConString As String
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim objDR As SqlDataReader
        Dim objCommand As SqlCommand
        Dim objCon As SqlConnection
        Dim id As Integer
        Try
            _ConString = ConfigurationManager.ConnectionStrings("TestConnection").ToString
            objCon = New SqlConnection(_ConString)
            objCommand = New SqlCommand("SELECT * FROM Person")
            objCommand.Connection = objCon
            objCon.Open()
            objDR = objCommand.ExecuteReader(ConnectionState.Closed)
            Do While objDR.Read
                id = objDR("URN")
            Loop
            objDR.Close() 'line 16
        Catch ex As Exception
            throw
        Finally

        End Try

    End Sub
End Class

The connection object is closed on line 16. Please have a look at the code below:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim objDR As SqlDataReader
        Dim objCommand As SqlCommand
        Dim objCon As SqlConnection
        Dim id As Integer
        Try
            _ConString = ConfigurationManager.ConnectionStrings("TestConnection").ToString
            objCon = New SqlConnection(_ConString)
            objCommand = New SqlCommand("SELECT * FROM Person")
            objCommand.Connection = objCon
            objCon.Open()
            Using objCon
                Using objCommand
                    objDR = objCommand.ExecuteReader()
                    Do While objDR.Read
                        id = objDR("URN")
                    Loop
                End Using
            End Using
            objDR.Close() 'line 16
        Catch ex As Exception
           throw
        Finally

        End Try

    End Sub

I notice in both cases that the connection object and command object both still have state after they are closed (either by closing the data reader as per code sample 1 or moving outside the Using statement as per code sample 2). Could this be a source of a memory leak?

4

2 に答える 2

0

re:これはメモリリークの原因でしょうか? いいえ、そうすべきではありません。

また、これ:

            objDR = objCommand.ExecuteReader()
            Do While objDR.Read
                id = objDR("URN")
            Loop

すべての行を繰り返し処理し、id値を上書きするため、見栄えが悪くなります。最後の行セットは、IDの値で終わります。複数の行のセットから1つの結果を取得しています。max(URN)fromが必要な場合Personは、その結果を返すコマンドを記述できます。

于 2012-11-21T20:37:30.887 に答える
0

あなたはこのようなことをしているはずです...

Using Conn as new SqlConnection(_ConString)
 Dim cmd as New SqlCommand(Conn, "Select * FROM Person");
   id = Convert.ToInt32(cmd.ExecuteScalar())
End Using

必要に応じて、これを試してラップします。ただし、何らかの方法で処理する場合に限ります。(単純な「スロー」は何も処理しません。)

また、DataReader(反復、転送のみ)データアクセスコンポーネントを使用して、単一の値を取得しています。ExecuteScalar ()を使用して、そのコードを単純化することをお勧めします。

それを除けば、「Disposed」を「Closed」と同じであると混同しないでください。.NET Frameworkは、ガベージコレクションを管理します。接続オブジェクトとコマンドオブジェクトを破棄する場合は、それらに対して.Dispose()を呼び出します(ただし、Usingがこれを処理します!!!)

于 2012-11-21T20:19:28.100 に答える