处理传统ASP中的ADODB连接

Alb*_*reo 3 vbscript adodb asp-classic

我是一个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
Run Code Online (Sandbox Code Playgroud)

第二版:

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
Run Code Online (Sandbox Code Playgroud)

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

问题#1:

什么是最好的,

Connection.Open "blah blah blah"
Command.CommandText = "blah blah blah"
Recordset.Open Command, Connection
Run Code Online (Sandbox Code Playgroud)

要么

Connection.Open "blah blah blah"

Command.ActiveConnection = Connection
Command.CommandText = "blah blah blah"

Set Recordset = Command.Execute
Run Code Online (Sandbox Code Playgroud)

问题2:

在做SELECT时我应该使用断开连接的记录集

Set Recordset = Command.Execute

Command.ActiveConnection = Nothing

Connection.Close

Set Connection = Nothing
Run Code Online (Sandbox Code Playgroud)

问题#3:

我必须打电话吗?

Recordset.Close
Connection.Close
Run Code Online (Sandbox Code Playgroud)

即使我这样做

Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
Run Code Online (Sandbox Code Playgroud)

正下方(即,垃圾收集器时由被调用Set Stuff= Nothing.Close它们破坏前)?

问题#4:

我必须包括

Recordset.Close
Connection.Close

Set Recordset = Nothing
Set Command = Nothing
Set Connection = Nothing
Run Code Online (Sandbox Code Playgroud)

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

问题#5:

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


提前感谢您的帮助,Andrea.

GSe*_*erg 10

问题#1.

都.
这取决于您是否想要所有参数Recordset.Open,以及您的个人喜好.

问题2.

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

问题#3.

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

当没有对它的引用时,一个对象被销毁,所有的终结器被调用.
在池连接的情况下,这可能会有所不同 - 因为服务器可能保留对连接的引用,将变量设置为Nothing实际可能不会执行任何操作,因为引用计数不会达到零(并且您不必设置它到Nothing反正,它会自动在退出函数来完成).

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

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

问题#4.

见问题3.

问题#5.

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