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了,知识有点生疏了。

4

5 回答 5

5

我的理解始终是设置ActiveConnectionNothing没有关闭它只是从该对象中删除它的连接,这对于像 Recordsets 这样的东西很有用,您想要一个 Recordset 的固定只读快照(结合设置正确的光标选项)等等不需要为该 Recordset 保持连接活动(但可能需要连接仍然打开以进行其他操作)

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

于 2010-03-04T16:06:34.223 回答
2

关闭 ADODB RS + CONN:

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

所以应该是: Set objCmd.ActiveConnection = Nothing 实际上

GL!

来源:

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

于 2010-03-03T14:09:51.940 回答
2

所有这一切都已经有一段时间了,但不会将其设置为空,只是清除对象。我敢打赌,如果您监视 SQL Server,则连接不会终止。

于 2010-03-03T14:11:20.897 回答
1

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

唯一的问题是 ADODB.Connection 的析构函数是否释放了数据库资源。我有 99% 的把握确实如此。如果是这样,只要让 Connection 对象超出范围就会释放所有关联的资源。

于 2010-05-28T18:04:28.480 回答
0

是的,您是正确的,通过使用“设置”将对象设置为空会释放内存......

设置 objCmd.ActiveConnection = 无

希望这可以帮助。

于 2010-03-03T14:08:47.110 回答