Соответствует ли установка ActiveConnection команды ADO = ничего закрытию основного SQL-соединения? - PullRequest
3 голосов
/ 03 марта 2010

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

Их код имеет следующий шаблон:

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 команды ADO = Ничто не закрывает базовое SQL-соединение или это должно быть явно закрыто?

Также должна быть строка:

objCmd.ActiveConnection = Nothing

быть:

Set objCmd.ActiveConnection = Nothing

Как ни странно, первая версия не выдает ошибку, поэтому я и спрашиваю.

Прошло так много времени с тех пор, как я смотрел на ADO, и мои знания немного ржавые.

Ответы [ 5 ]

4 голосов
/ 04 марта 2010

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

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

2 голосов
/ 03 марта 2010

Закрытие ADODB RS + CONN:

objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing

Так должно быть: Set objCmd.ActiveConnection = Ничего, действительно

GL!

источник:

http://www.aspwebpro.com/tutorials/asp/dbconnectionclose.asp

2 голосов
/ 03 марта 2010

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

1 голос
/ 28 мая 2010

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

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

0 голосов
/ 03 марта 2010

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

Set objCmd.ActiveConnection = Nothing

Надеюсь, это поможет.

...