Какая разница между rs.close vs rs = ничего в RecordSet
Я часто сбиваю с толку, когда это целесообразно:
rs.Close
против
Set rs = Nothing
Я понимаю, что нужно закрыть соединение с источником, но следует ли использовать оба параметра, когда переменная выпадает из области видимости?
Могу ли я просто установить для переменной значение Nothing, чтобы пропустить шаг закрытия соединения? Будет ли это считаться плохой практикой?
Ответы
Ответ 1
Используя метод "Закрыть", вы закрываете соединение с базой данных, но все еще находитесь в памяти, где вы можете снова открыть, используя метод "Открыть".
Установка набора записей в "Nothing" с другой стороны полностью освобождает объект из памяти.
Ответ 2
Метод Close сбрасывает структуру памяти.
Установка переменной в Nothing очищает указатель на эту структуру памяти.
Теоретически, очистка указателя должна освобождать память, на которую ссылался указатель, поскольку VBA использует подсчет ссылок для определения, когда он может освободить память. К сожалению, различные вещи могут пойти не так, и счетчик ссылок может закончиться из-за удара, и память не будет выпущена, даже когда это будет.
Таким образом, чтобы убедиться, что вы не подвержены утечке памяти или странные виды ошибок, вызванных неявными и невыпущенными ссылками, вы оба закрываетесь и устанавливаете значение Nothing.
Ответ 3
Вы можете установить Recordset на Nothing без необходимости вызова Close, согласно официальной документации:
Альтернативой методу Close следует установить значение переменной объекта Nothing (Set dbsTemp = Nothing).
Дополнительная информация: Метод Recordset.Close(DAO)