设置ADO命令的ActiveConnection = Nothing是否关闭底层SQL连接?

设置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已经很久了,我的知识有点生疏。

+0

应该是:Set objCmd。ActiveConnection =确实没什么 – Younes

+0

@Kev:我很好奇添加连接。关闭上面的代码修复了这个问题? – AnthonyWJones

+0

@AnthonyWJones - 我已经将建议传递给客户,现在只需等待观察。 – Kev

我的理解是总是设置ActiveConnectionNothing没有关闭它只是删除它从对象的连接,您希望记录的固定只读快照(与设置的组合,这是对于像记录集有用正确的游标选项),所以不需要保持连接住该记录(但可能需要连接仍然打开等操作)

据我所知只有实际调用objConn.Close关闭连接,Set objConn = Nothing腾出内存

+0

这就是我想的,只是想确认。 – Kev

+0

重新阅读MSDN文档以及它们使用的措辞是:“...将Command对象与当前连接分离”。 – Kev

是的,你是正确的,一个目标是什么的设置发布使用“设置”记忆......

 
Set objCmd.ActiveConnection = Nothing 

希望这有助于。

+0

但是底层的SQL连接也被清理了吗? – Kev

+0

@Kev:是的,它也得到了清理......因为你释放了'objCmd.ActiveConnection'所占用的内存,所以'Set objCmd = Nothing'也是谨慎的! – t0mm13b

+0

不,它不会,将ActiveConnection设置为Nothing只会清除Connection对象的对象引用,它不会清除实际的对象 – RobV

关闭一个ADODB RS + CONN:

objRS.Close 
Set objRS = Nothing 
objConn.Close 
Set objConn = Nothing 

所以应该是:设置objCmd.ActiveConnection =确实没有

GL!

来源:

http://www.aspwebpro.com/tutorials/asp/dbconnectionclose.asp

一段时间去过这一切,但不会将其设置为任何刚清除的对象。我敢打赌,如果您监控SQL Server连接没有终止。

+0

这就是我的想法,只是想确认。 – Kev

VBScript是垃圾收集,甚至提供非常清晰并明确保证GC的时间安排。在局部变量超出范围之前设置局部变量是完全多余的,因为函数的结尾会执行相同的操作,并且GC将清理该对象。

唯一的问题是ADODB.Connection的析构函数是否释放数据库资源。我99%肯定它确实如此。如果是这样,让Connection对象超出范围将释放所有关联的资源。