2010-03-03 2 views
3

У меня есть клиент, у которого классическое приложение ASP генерирует ошибки ASP_0147. Первое, что я проверю, это то, что они закрывают и освобождают ресурсы SQL/ADO.Выполняет ли настройку ActiveConnection команды ADO = Ничто не закрывает базовое SQL-соединение?

Их код имеет следующую закономерность:

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 

не ли настройки антидопинговой командования ActiveConnection = Nothing близко лежащий в основе SQL Connection или же, что должны быть закрыты явно?

Также следует линия:

objCmd.ActiveConnection = Nothing 

быть:

Set objCmd.ActiveConnection = Nothing 

Как ни странно первая версия не генерирует ошибку, которая является, почему я спрашиваю.

Это было так давно, что я посмотрел на ADO, и мои знания несколько ржавые.

+0

Должно быть: Установить objCmd.ActiveConnection = Ничего действительно – Younes

+0

@Kev: Мне любопытно, добавила ли связь. Закрыто для кода выше, исправить проблему? – AnthonyWJones

+0

@ AnthonyWJones - Я передал рекомендации клиенту, теперь просто подождал и посмотрел. – Kev

ответ

4

Мое понимание всегда заключалось в том, что установка ActiveConnection на Nothing не закрывала соединение, которое оно только что удалило с этого объекта, это полезно для таких вещей, как Recordsets, где вы хотите фиксированный снимок только для чтения Recordset (в сочетании с настройками правильные параметры управления курсором) и поэтому не нужно держать связь жить для этого Recordset (но, возможно, потребуется подключение еще открыта для других операций)

AFAIK только фактически вызывая objConn.Close закрывает соединение и Set objConn = Nothing освобождает память

+0

Вот что я подумал, просто хотел подтвердить. – Kev

+0

Перечитайте документы MSDN и используемую им фразеологию: «... disassociates объект Command из текущего Connection». – Kev

0

Да, вы правы, что установка объекта ни к чему не освобождает память с помощью «Set» ...

 
Set objCmd.ActiveConnection = Nothing 

Надеются, что это помогает.

+0

Но также ли очищается базовое соединение с SQL? – Kev

+0

@Kev: Да, он тоже очищается ... так как вы освобождаете память, занятую «objCmd.ActiveConnection», было бы также разумно «Set objCmd = Nothing» также! – t0mm13b

+0

Нет, это не так, установив ActiveConnection на ничего, только очищает ссылку на объект Connection, он не очищает фактический объект. – RobV

2

было некоторое время для всего этого, но не устанавливая его ни к чему не только очистить объект. Бьюсь об заклад, если вы контролируете SQL Server, соединение не будет прекращено.

+0

Вот что я тоже думал, просто хотел подтвердить. – Kev

1

VBScript собирает мусор и даже обеспечивает очень четкое и явные гарантии относительно времени ГХ. Невозможно установить локальную переменную вправо до того, как она выходит из области видимости, потому что конец функции будет делать то же самое, и GC очистит объект.

Вопрос только в том, что деструктор ADODB.Connection освобождает ресурсы базы данных. Я на 99% уверен, что это так. Если это так, просто отключив объект Connection из сферы действия, вы освободите все связанные ресурсы.