3

我一直在使用 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
4

1 回答 1

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 文档中关于使用的重要部分

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

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

于 2012-12-20T10:00:12.000 回答