【发布时间】:2015-06-05 16:03:54
【问题描述】:
我有一些我继承的旧代码,我正在尝试确定此代码是否导致与我的数据库的连接保持打开状态。我对 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)
除非数据读取器关闭,否则不会关闭连接。有人可以解释这里发生了什么,如果一切都可以正确关闭吗?我知道最好的做法是使用“using”然后try/catch/finally来关闭阅读器,原来的开发者似乎没有遵循这些做法。
【问题讨论】:
-
当连接关闭(但 DataReader 未处理)时,您得到的是将释放(可能是大对象)留给 GC。此外,这种关闭连接的多重检查(IMO)容易出错且令人困惑。在您打开它的地方关闭连接并让异常冒泡,直到您能够做一些有意义的事情。
标签: asp.net .net vb.net ado.net sqlconnection