这会给我的数据库打开一个连接吗?

时间:2015-06-05 16:03:55

标签: asp.net .net vb.net ado.net sqlconnection

我有一些我继承的遗留代码,并试图弄清楚此代码是否导致连接保持对我的数据库开放。我对ADO.net并不太熟悉,但从我看到的情况来看,这应该会导致问题。

我有一个获取数据阅读器的功能:

Public Shared Function ExecuteDataReader(ByRef ObjSqlCmd As SqlCommand, ByVal CSTRING As String) As IDataReader
    Try
        Dim cn As New SqlConnection(CSTRING)
        cn.Open()
        ObjSqlCmd.Connection = cn
        Return ObjSqlCmd.ExecuteReader(CommandBehavior.CloseConnection)
    Catch ex As Exception
        If ObjSqlCmd.Connection.State = ConnectionState.Open Then ObjSqlCmd.Connection.Close()
        Return Nothing
    End Try
End Function

然后使用此代码阅读:

Dim cmd As New SqlCommand
'set up command
Dim idr As IDataReader = ExecuteDataReader(cmd, "database")

    If idr Is Nothing Then
        If cmd.Connection.State = ConnectionState.Open Then cmd.Connection.Close()
        Return arrResult
    End If

    While idr.Read
        'read
    End While

    If cmd.Connection.State = ConnectionState.Open Then cmd.Connection.Close()

我可以看到它在结束时关闭连接(假设没有出错并抛出异常)但是从MSDN他们说你应该总是关闭数据阅读器。连接关闭后会关闭吗?

另据我的理解,代码

 ObjSqlCmd.ExecuteReader(CommandBehavior.CloseConnection)

除非关闭数据阅读器,否则不会关闭连接。有人可以解释这里发生了什么,以及是否所有事情都可能正确关闭?我知道最好的做法是使用“使用”,然后尝试/ catch / finally关闭阅读器,原始开发人员似乎没有遵循这些做法。

1 个答案:

答案 0 :(得分:0)

是的,它会。从数据读取器读取时发生的任何异常都将绕过结束语句。在某些时候,垃圾收集器将启动并处理并释放连接回连接池。

在此之前,无法使用连接。更糟糕的是,在执行命令时获取的任何锁都将保留,直到连接关闭。

使用... using并非最佳做法,因为。以这种方式管理命令和连接实际上更简单,更安全