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

几个小时后您收到有关连接耗尽的错误这一事实意味着您的代码中的某处您没有正确处理您的连接。
上面的代码看起来是正确的,但是如果出现异常怎么办?当您的代码由于异常从方法中意外退出时,您确定正确处理这种情况吗?

解决这种情况的正确方法是重构您的代码。
到处介绍Using 模式。所以你上面的代码变成:

    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 回答