我是一名ASP.NET C#家伙,他必须回到经典ASP,需要一些帮助。
首先,看看这两个函数(我在VBScript中知道注释是由'
而不是//
声明的,但语法高亮显示在这里与'
混淆。)
第一个版本:
Function DoThing
Dim Connection, Command, Recordset
Set Connection = Server.CreateObject("ADODB.Connection")
Set Command = Server.CreateObject("ADODB.Command")
Set Recordset = Server.CreateObject("ADODB.Recordset")
Connection.Open "blah blah blah"
Command.CommandText = "blah blah blah"
Recordset.Open Command, Connection
If Recordset.EOF = False Then
While Recordset.EOF = False Then
// Do stuff.
Recordset.MoveNext
WEnd
Else
// Handle error.
End If
Recordset.Close
Connection.Close
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
End Function
第二版:
Function DoAnotherThing
Dim Connection, Command, Recordset
Set Connection = Server.CreateObject("ADODB.Connection")
Set Command = Server.CreateObject("ADODB.Command")
Connection.Open "blah blah blah"
Command.ActiveConnection = Connection
Command.CommandText = "blah blah blah"
Set Recordset = Command.Execute
If Recordset.EOF = False Then
While Recordset.EOF = False Then
// Do stuff.
Recordset.MoveNext
WEnd
Else
// Handle error.
End If
Recordset.Close
Connection.Close
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
End Function
现在,让我们从问题开始:
什么是最好的,
Connection.Open "blah blah blah"
Command.CommandText = "blah blah blah"
Recordset.Open Command, Connection
或
Connection.Open "blah blah blah"
Command.ActiveConnection = Connection
Command.CommandText = "blah blah blah"
Set Recordset = Command.Execute
在执行SELECT时,我应该使用断开连接的记录集,如
Set Recordset = Command.Execute
Command.ActiveConnection = Nothing
Connection.Close
Set Connection = Nothing
我必须致电
Recordset.Close
Connection.Close
即使我做了
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
正好在下面(即在销毁之前由Set Stuff= Nothing
和.Close
调用的垃圾收集器)?
我是否必须包含
Recordset.Close
Connection.Close
Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
即使函数在那里结束,这些对象超出了范围,垃圾收集器(应该)会处理它们吗?
经典ASP是否有汇集连接,所以我可以用每个命令打开和关闭它们,还是应该传递一个公共连接对象?
先谢谢你的帮助,安德烈。
答案 0 :(得分:10)
两者。
这取决于您是否需要所有参数Recordset.Open
,以及您的个人偏好。
你可以,但没关系。它几乎没有任何区别 - 你的命令已经完成,虽然打开了连接对象,但是所有的锁和东西都会在服务器上发布。
VBScript中没有垃圾收集器,有引用计数。
当没有对它的引用时,一个对象被销毁,其所有终结器被调用
在汇集连接的情况下,这会产生影响 - 因为服务器可能保留对连接的引用,将变量设置为Nothing
可能实际上没有做任何事情,因为引用计数不会达到零(并且你不要无论如何都必须将它设置为Nothing
,它将在退出函数时自动完成。
如果服务器不打算连接池,它可能不会引用它,此时将变量设置为Nothing
(显式或隐式)也将关闭连接。 / p>
我个人的偏好是致电Close
,以便我知道我的东西在哪里,但不要将变量设置为Nothing
。这对于池化和非池化连接都可以正常工作。
见问题3。
在Web环境中,您总是希望在需要时打开一个新的Connection对象,除非您的多个方法必须在同一事务中执行它们的位。