设置ADO Command的ActiveConnection = Nothing是否会关闭基础SQL连接?

时间:2010-03-03 14:06:04

标签: asp-classic ado adodb

我有一个客户经典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 Command的ActiveConnection = Nothing是否会关闭基础SQL连接,还是必须显式关闭?

也应该行:

objCmd.ActiveConnection = Nothing

是:

Set objCmd.ActiveConnection = Nothing

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

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

5 个答案:

答案 0 :(得分:4)

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

AFAIK实际上只调用objConn.Close关闭连接,Set objConn = Nothing释放内存

答案 1 :(得分:2)

关闭ADODB RS + CONN:

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

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

GL!

来源:

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

答案 2 :(得分:2)

对于所有这一切都是一段时间,但不会只是清除对象。我敢打赌,如果你监控SQL Server,那么连接就不会终止。

答案 3 :(得分:1)

VBScript是垃圾收集的,甚至可以提供有关GC时序的非常明确和明确的保证。在局部变量超出范围之前将其设置为空,这完全是多余的,因为函数的结尾将执行相同的操作,并且GC将清理对象。

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

答案 4 :(得分:0)

是的,你是对的,通过使用'Set'...

将对象设置为无
Set objCmd.ActiveConnection = Nothing

希望这有帮助。

相关问题