处理传统ASP中的ADODB连接

时间:2010-09-22 14:03:00

标签: vbscript asp-classic adodb

我是一名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

现在,让我们从问题开始:

问题#1:

什么是最好的,

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

问题#2:

在执行SELECT时,我应该使用断开连接的记录集,如

Set Recordset = Command.Execute

Command.ActiveConnection = Nothing

Connection.Close

Set Connection = Nothing

问题#3:

我必须致电

Recordset.Close
Connection.Close

即使我做了

Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing

正好在下面(即在销毁之前由Set Stuff= Nothing.Close调用的垃圾收集器)?

问题#4:

我是否必须包含

Recordset.Close
Connection.Close

Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing

即使函数在那里结束,这些对象超出了范围,垃圾收集器(应该)会处理它们吗?

问题#5:

经典ASP是否有汇集连接,所以我可以用每个命令打开和关闭它们,还是应该传递一个公共连接对象?


先谢谢你的帮助,安德烈。

1 个答案:

答案 0 :(得分:10)

问题#1。

两者。
这取决于您是否需要所有参数Recordset.Open,以及您的个人偏好。

问题#2。

你可以,但没关系。它几乎没有任何区别 - 你的命令已经完成,虽然打开了连接对象,但是所有的锁和东西都会在服务器上发布。

问题#3。

VBScript中没有垃圾收集器,有引用计数。

当没有对它的引用时,一个对象被销毁,其所有终结器被调用 在汇集连接的情况下,这会产生影响 - 因为服务器可能保留对连接的引用,将变量设置为Nothing可能实际上没有做任何事情,因为引用计数不会达到零(并且你不要无论如何都必须将它设置为Nothing,它将在退出函数时自动完成。

如果服务器不打算连接池,它可能不会引用它,此时将变量设置为Nothing(显式或隐式)也将关闭连接。 / p>

我个人的偏好是致电Close,以便我知道我的东西在哪里,但不要将变量设置为Nothing。这对于池化和非池化连接都可以正常工作。

问题#4。

见问题3。

问题#5。

在Web环境中,您总是希望在需要时打开一个新的Connection对象,除非您的多个方法必须在同一事务中执行它们的位。