【问题标题】:VB.net program dataadapter connection closes after fill, but database still shows connectionVB.net程序dataadapter连接填充后关闭,但数据库仍然显示连接
【发布时间】:2010-08-19 13:09:27
【问题描述】:

运行以下子程序(VS 调试器)后,我尝试在 SSMS 中分离数据库,但它显示连接仍然​​打开并且不会让我分离。如果我在调试器中关闭程序,数据库显示没有连接。我在 finally 块中检查了数据适配器的连接并显示已关闭。什么给了

Private Function ClientMasterDBFiles(ByVal MasterClientDBConnection As String, ByVal DBName As String) As DataTable
    Dim da As SqlDataAdapter
    Dim ds As DataSet

    Try
        ds = New DataSet
        da = New SqlDataAdapter
        da.SelectCommand = New SqlCommand
        With da.SelectCommand
            .CommandType = CommandType.StoredProcedure
            .Connection = New SqlConnection(MasterClientDBConnection)
            .CommandText = "QT_DataSync_GetDBFileLocations"
            .Parameters.Add(New SqlParameter("@DBName", SqlDbType.VarChar, 100))
            .Parameters.Item("@DBName").Direction = ParameterDirection.Input
            .Parameters.Item("@DBName").Value = DBName
            .CommandType = CommandType.StoredProcedure
            .CommandTimeout = 10
        End With

        da.Fill(ds)

        If ds.Tables.Count > 0 Then
            Return ds.Tables(0)
        End If

    Catch ex As Exception
        m_ErrorLog.HandleException(ex)
        Throw
    Finally
        If Not da Is Nothing Then da.Dispose()
        If Not ds Is Nothing Then ds.Dispose()
        da = Nothing
        ds = Nothing
    End Try
End Function

【问题讨论】:

    标签: sql-server vb.net


    【解决方案1】:

    编辑

    我一直都错了。
    您的问题是 .Net SqlClient 类池连接。


    你需要显式关闭SqlCommand的连接,像这样:

    If Not da Is Nothing Then da.SelectCommand.Connection.Close()
    

    但是,您应该改用 Using 语句,如下所示:

    Dim ds As DataSet
    
    Try
        Using da As SqlDataAdapter, _
              da.SelectCommand = New SqlCommand, _
              da.Connection = New SqlConnection(MasterClientDBConnection)
    
            With da.SelectCommand
                .CommandType = CommandType.StoredProcedure            
                .CommandText = "QT_DataSync_GetDBFileLocations"
                .Parameters.Add(New SqlParameter("@DBName", SqlDbType.VarChar, 100))
                .Parameters.Item("@DBName").Direction = ParameterDirection.Input
                .Parameters.Item("@DBName").Value = DBName
                .CommandType = CommandType.StoredProcedure
                .CommandTimeout = 10
            End With
    
            da.Fill(ds)
    
            If ds.Tables.Count > 0 Then
                Return ds.Tables(0)
            End If
        End Using
    Catch ex As Exception
        m_ErrorLog.HandleException(ex)
        Throw
    End Try
    

    此外,您不应该释放 DataSet,因为您要返回其中的一个表。

    【讨论】:

    • 我尝试显式关闭连接,但正如我提到的,它在填充后已经关闭。如果我再次关闭它,它仍然对SSMS中的数据库没有影响,仍然显示连接。
    • 使用上面的“使用”代码仍然可以在子返回后在 SSMS 中显示一个活动连接
    • 您确定没有打开任何其他连接吗?
    • 绝对没有,我在运行子程序之前检查并没有连接,在我通过子程序调试之后就是连接。我立即关闭程序,连接消失了。这是一台开发机器,只有我可以访问。
    • 按Ctrl+D、N,在System.Data.SqlClient.SqlConnection.Open()处添加一个函数断点,然后查看打开了多少个连接。 (在 Locals 窗口中右键单击 this,然后单击 Make Object ID)
    猜你喜欢
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2014-12-05
    • 2020-12-31
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多