0

ADO .NET を使用してデータベースに接続しています。

        Dim conn As SqlConnection
        Dim sqlcmd As SqlCommand
        Dim da As SqlClient.SqlDataAdapter
        Dim table As DataTable

        conn = New SqlConnection(Utilities.ConnectionString)
        sqlcmd = New SqlClient.SqlCommand()
        sqlcmd.Connection = conn
        sqlcmd.CommandType = CommandType.StoredProcedure
        sqlcmd.CommandText = "mySP"
        sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param", param1))

        da = New SqlClient.SqlDataAdapter()
        da.SelectCommand = sqlcmd
        table = New DataTable()
        da.Fill(table)
        conn.Close()   
        sqlcmd.Connection.Close() 

それはうまくいきます。SQL Server で起動すると、次のコマンドが実行されます。

       EXEC SP_WHO2

ADO .NET の前のコードから行われた呼び出しごとに、フィールド Command に値 "AWAITING COMMAND" があり、フィールド Status の値は "sleeping" です。これはどういう意味ですか?データベースへの接続はまだアクティブですか? データベース接続を閉じるにはどうすればよいですか?

4

1 に答える 1

2

数時間後に、実行された接続に関するエラーを受け取るという事実は、コードのどこかで接続を正しく破棄しないことを意味します。
上記のコードは正しいようですが、例外がある場合はどうなりますか?例外が原因でコードがメソッドから予期せず終了した場合の状況を正しく処理できますか?

この状況への正しいアプローチは、コードをリファクタリングすることです。どこでも使用パターンを
紹介します。したがって、上記のコードは次のようになります。

    Dim conn As SqlConnection 
    Dim sqlcmd As SqlCommand 
    Dim da As SqlClient.SqlDataAdapter 
    Dim table As DataTable 

    Using conn = New SqlConnection(Utilities.ConnectionString) 
        Using sqlcmd = New SqlClient.SqlCommand() 
            sqlcmd.Connection = conn 
            sqlcmd.CommandType = CommandType.StoredProcedure 
            sqlcmd.CommandText = "mySP" 
            sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param", param1)) 

            da = New SqlClient.SqlDataAdapter() 
            da.SelectCommand = sqlcmd 
            table = New DataTable() 
            da.Fill(table) 
        End Using  
    End Using

このアプローチにより、使い捨てオブジェクト(接続とコマンド)が正しく解放され、接続リークの微妙な問題が解消されます。

于 2012-09-23T12:12:33.143 に答える