在不关闭SQL阅读器的情况下关闭SqlConnection - 它是否会导致连接泄漏

时间:2012-12-20 09:53:52

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

我一直在使用SQLDataReader来获取数据库中的一些数据。一旦我使用Reader与连接我只关闭连接而不是阅读器。我们是否有任何连接泄漏的可能性

以下是我正在使用的代码

 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

1 个答案:

答案 0 :(得分:2)

不,关闭连接就足够了,但更好的方法是通过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文档中有关使用

的重要部分
  

有时您的代码需要非托管资源,例如文件   handle,COM包装器或SQL连接。使用块保证   代码完成后处理一个或多个此类资源   跟他们。这使得它们可供其他代码使用。

     

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