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

Kev*_*Kev 3 ado adodb asp-classic

我有一位客户的经典 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
Run Code Online (Sandbox Code Playgroud)

设置 ADO 命令的 ActiveConnection = Nothing 是否会关闭底层 SQL 连接,还是必须显式关闭?

还应该行:

objCmd.ActiveConnection = Nothing
Run Code Online (Sandbox Code Playgroud)

是:

Set objCmd.ActiveConnection = Nothing
Run Code Online (Sandbox Code Playgroud)

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

好久没有看ADO了,知识有些生疏了。

Rob*_*obV 5

我的理解始终是,设置ActiveConnectionNothing不会关闭连接,它只是将其从该对象中删除,这对于像记录集这样的事情很有用,您需要记录集的固定只读快照(与设置正确的光标选项相结合)等等不需要保持该 Recordset 的连接处于活动状态(但可能需要仍打开连接以进行其他操作)

AFAIK 只有实际调用才会objConn.Close关闭连接并Set objConn = Nothing释放内存