设置ADO命令的ActiveConnection = Nothing是否关闭底层SQL连接?
问题描述:
我有一个客户是经典的ASP应用程序正在产生ASP_0147错误。我要检查的第一件事是他们正在关闭并且很快释放SQL/ADO资源。设置ADO命令的ActiveConnection = Nothing是否关闭底层SQL连接?
他们的代码具有以下模式:
Function GetXXXXRecordSet()
Set objConn = Server.CreateObject("ADODB.Connection")
With objConn
.CursorLocation = 3 ''adUseServer (default)
.ConnectionString = strConnectionString
.Open
End With
Set objCmd = Server.CreateObject("ADODB.Command")
Set objCmd.ActiveConnection = objConn
'' Build command object to call SQL stored proc, snipped for brevity
Set objRs = Server.CreateObject("ADODB.RecordSet")
objRs.Open objCmd, ,3,4 '' Cursor=adOpenStatic, Locktype=adLockBatchOptimistic
'' Return Recordset
Set GetXXXXRecordSet = objRs
If Not objCmd Is Nothing Then
objCmd.ActiveConnection = Nothing '' Should this use a Set statement?
Set objCmd = Nothing
End If
If Not ObjRs Is Nothing The Set objRs = Nothing
End Function
设置是否ADO命令的ActiveConnection =没有接近底层的SQL连接或是否必须被明确地关闭?
也应行:
objCmd.ActiveConnection = Nothing
是:
Set objCmd.ActiveConnection = Nothing
奇怪的是第一个版本不产生错误这就是为什么我问。
我看了ADO已经很久了,我的知识有点生疏。
答
关闭一个ADODB RS + CONN:
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
所以应该是:设置objCmd.ActiveConnection =确实没有
GL!
来源:
http://www.aspwebpro.com/tutorials/asp/dbconnectionclose.asp
答
VBScript是垃圾收集,甚至提供非常清晰并明确保证GC的时间安排。在局部变量超出范围之前设置局部变量是完全多余的,因为函数的结尾会执行相同的操作,并且GC将清理该对象。
唯一的问题是ADODB.Connection的析构函数是否释放数据库资源。我99%肯定它确实如此。如果是这样,让Connection对象超出范围将释放所有关联的资源。
应该是:Set objCmd。ActiveConnection =确实没什么 – Younes
@Kev:我很好奇添加连接。关闭上面的代码修复了这个问题? – AnthonyWJones
@AnthonyWJones - 我已经将建议传递给客户,现在只需等待观察。 – Kev