В чем разница между rs.close и rs = ничего в RecordSet - PullRequest
19 голосов
/ 30 марта 2010

Меня часто смущает, когда уместно использовать:

rs.Close 

против

Set rs = Nothing

Я понимаю, что необходимо закрыть соединение с источником, но должен ли я использовать оба, когда переменная выходит из области видимости?

Могу ли я просто установить для переменной значение Nothing, чтобы пропустить шаг закрытия соединения? Будет ли это считаться плохой практикой?

Ответы [ 4 ]

16 голосов
/ 30 марта 2010

Используя метод «Закрыть», вы закрываете соединение с базой данных, но все еще находитесь в памяти, где вы можете снова открыть, используя метод «Открыть».

С другой стороны, установка для набора записей значения «Ничего» полностью освобождает объект из памяти.

11 голосов
/ 02 апреля 2010

Метод Close разрушает структуру памяти.

Установка переменной на Nothing очищает указатель на эту структуру памяти.

Теоретически, очистка указателя должна освободить память, на которую ссылался указатель, потому что VBA использует подсчет ссылок для определения, когда он может освободить память. К сожалению, различные вещи могут пойти не так, и счетчик ссылок может выйти из строя, и память не будет освобождена, даже когда это должно быть.

Таким образом, чтобы быть уверенным, что вы не подвержены утечкам памяти или странным ошибкам, вызванным неявными и невыпущенными ссылками, вы оба Close устанавливаете Nothing.

5 голосов
/ 09 июля 2015

Вы можете установить Recordset в Nothing, не вызывая Close, согласно официальной документации:

Альтернативой методу Close является установка значения переменной объекта в Nothing (Set dbsTemp = Nothing).

Дополнительная информация: Набор записей. Закрыть метод (DAO)

0 голосов
/ 04 марта 2019

Ну, по моему опыту, если объект набора записей (в дальнейшем именуемый «RS») объявляется локально (в пределах функции / процедуры, в дальнейшем именуемой «B») и не будет доставлен туда, где B называется (в дальнейшем именуемый «А»), это безопасно и предлагается закрыть и установить нулевое значение RS внутри B; но в следующих ситуациях:

  1. RS доставляется как один из аргументов параметра B (byval или byref) из A
  2. RS объявлено в B и должно быть одним из возвращаемых значений B для использования A

RS в B должен только ничего не устанавливать, не закрывая его, иначе объект набора записей, возвращенный в A (или отправленный в B как один из параметров из A), также будет закрыт и ничего не установлен, делая его недоступным в A, даже если вы вернули RS в A заранее, а затем закрыли в B!

...