我有一些我继承的遗留代码,并试图弄清楚此代码是否导致连接保持对我的数据库开放。我对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关闭阅读器,原始开发人员似乎没有遵循这些做法。
答案 0 :(得分:0)
是的,它会。从数据读取器读取时发生的任何异常都将绕过结束语句。在某些时候,垃圾收集器将启动并处理并释放连接回连接池。
在此之前,无法使用连接。更糟糕的是,在执行命令时获取的任何锁都将保留,直到连接关闭。
使用... using
并非最佳做法,因为。以这种方式管理命令和连接实际上更简单,更安全