这会打开与我的数据库的连接吗?

Will this leave a connection open to my database?

我继承了一些遗留代码,我试图弄清楚这段代码是否导致与我的数据库的连接保持打开状态。我对 ADO.net 不太熟悉,但据我所知,这应该会导致问题。

我有一个获取数据的函数reader:

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 他们说你应该总是关闭数据 reader。当连接关闭时它会关​​闭吗?

另外据我了解,代码

 ObjSqlCmd.ExecuteReader(CommandBehavior.CloseConnection)

除非数据reader关闭,否则不会关闭连接。有人可以解释这里发生了什么,是否一切都可以正确关闭?我知道最好的做法是用"using"然后try/catch/finally关闭reader,原来的开发者好像没有遵循这些做法。

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

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

使用 ... using 并不是最佳实践,因为。这样管理命令和连接其实更简单更安全