Обработка соединений ADODB в классическом ASP - PullRequest
3 голосов
/ 22 сентября 2010

Я - парень из 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 Ответ

10 голосов
/ 22 сентября 2010

Вопрос №1.

Оба.
Это зависит от того, хотите ли вы иметь все параметры Recordset.Open, а также от ваших личных предпочтений.

Вопрос № 2.

Можно, но это не важно. Это вряд ли что-то изменит - ваша команда выполнена, и, хотя объект подключения открыт, все блокировки и прочее освобождаются на сервере.

Вопрос № 3.

В VBScript нет сборщика мусора, есть подсчет ссылок.

Объект уничтожается со всеми вызванными финализаторами, когда на него больше нет ссылок.
В случае соединений в пуле это может иметь значение - поскольку сервер может сохранять ссылку на соединение, установка переменной на Nothing может ничего не делать на самом деле, потому что счетчик ссылок не достигнет нуля (а у вас нет в любом случае, чтобы установить его на Nothing, это будет сделано автоматически после выхода из функции).

Если сервер не собирается объединять в пул, у него, вероятно, не будет ссылки на него, и в этот момент установка переменной Nothing (явно или неявно) также закроет соединение.

Здесь я предпочитаю звонить Close, чтобы я знал, где мои вещи, но не устанавливал переменные на Nothing. Это будет хорошо работать как для пула, так и для пула соединений.

Вопрос № 4.

См. Вопрос 3.

Вопрос № 5.

В веб-среде вы всегда хотите открывать новый объект Connection, когда вам это нужно, за исключением случаев, когда несколько ваших методов должны выполнять свои биты в одной транзакции.

...