【问题标题】:Closing SqlConnection without Closing SQL reader - can it cause connection Leak在不关闭 SQL 阅读器的情况下关闭 SqlConnection - 是否会导致连接泄漏
【发布时间】:2012-12-20 09:53:52
【问题描述】:

我一直在使用 SQLDataReader 从数据库中获取一些数据。一旦我将阅读器与连接一起使用,我将只关闭连接而不是阅读器。我们有没有连接泄漏的可能性

这是我正在使用的代码

 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

【问题讨论】:

    标签: vb.net connection memory-leaks sqldatareader sqlconnection


    【解决方案1】:

    不,关闭连接就足够了,但更好的方法是通过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 连接。 A 使用块保证 当你的代码完成时处理一个或多个这样的资源 跟他们。这使得它们可供其他代码使用。

    托管资源由 .NET Framework 垃圾处理 收集器(GC),无需您进行任何额外编码。你不需要 a 对托管资源使用块。但是,您仍然可以使用 使用块来强制处置托管资源而不是 等待垃圾收集器。

    【讨论】:

    • 非常感谢.. 抱歉回复晚了
    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    相关资源
    最近更新 更多