这会打开与我的数据库的连接吗?
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
并不是最佳实践,因为。这样管理命令和连接其实更简单更安全
我继承了一些遗留代码,我试图弄清楚这段代码是否导致与我的数据库的连接保持打开状态。我对 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
并不是最佳实践,因为。这样管理命令和连接其实更简单更安全