将ADO Command的ActiveConnection设置为Nothing会关闭底层的SQL连接吗?

3
我是一名有用的助手,可以进行文本翻译。以下是需要翻译的内容:

我的客户使用经典ASP应用程序时遇到了ASP_0147错误。我首先要检查的是他们是否及时关闭和释放SQL/ADO资源。

他们的代码具有以下模式:

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 = Nothing 是否会关闭底层的 SQL 连接,还是必须显式地关闭连接?
此外,应该将以下行:
objCmd.ActiveConnection = Nothing

是:

Set objCmd.ActiveConnection = Nothing

奇怪的是,第一个版本没有生成错误,这就是我问的原因。

我已经很久没看ADO了,我的知识有些生疏。


应该是:Set objCmd.ActiveConnection = Nothing - Younes
@Kev:我很好奇,上面的代码加上了连接.Close是否解决了问题? - AnthonyWJones
@AnthonyWJones - 我已经把建议反馈给客户了,现在只能等待看看了。 - Kev
5个回答

5
我的理解一直是将 ActiveConnection 设置为 Nothing 并不会关闭连接,只是将其从该对象中移除,这对于像 Recordsets 这样的东西很有用,其中您希望获得 Recordset 的固定只读快照(与设置正确的游标选项相结合),因此不需要保持连接以获取该 Recordset(但可能仍需要连接仍然打开以进行其他操作)。
据我所知,只有实际调用 objConn.Close 才会关闭连接,并且 Set objConn = Nothing 会释放内存。

那是我所想的,只是想确认一下。 - Kev
重新阅读MSDN文档,他们使用的措辞是:“...将Command对象与当前连接分离”。 - Kev

2

2

这段时间过去了,但是把它设置为“nothing”只会清除对象。我敢打赌如果你监控SQL Server,连接并没有被终止。


我也是这么想的,只是想确认一下。 - Kev

1

VBScript是垃圾回收的,甚至提供了非常清晰和明确的保证,关于GC的时机。在变量即将超出范围之前将其设置为无效完全是多余的,因为函数的结束会做同样的事情,而GC会清理对象。

唯一的问题是ADODB.Connection的析构函数是否释放数据库资源。我有99%的把握它会这样做。如果是这样,只需让Connection对象超出范围即可释放所有相关资源。


0

是的,您说得对,将对象设置为“无”可以通过使用“Set”释放内存...

Set objCmd.ActiveConnection = Nothing

希望这可以帮到您。


但是底层的SQL连接也会被清理吗? - Kev
@Kev:是的,它也会被清理干净... 因为您释放了“objCmd.ActiveConnection”所占用的内存,因此还明智地“将objCmd设置为Nothing”! - t0mm13b
不,将ActiveConnection设置为“nothing”只会清除对象对连接对象的引用,而不会清除实际对象。 - RobV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接