Закрытие рекордсета.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Закрытие рекордсета.

Сообщение АндрейБ » 06.03.2015 (Пт) 13:00

Вопрос тривиальный. Сейчас перекапываю книгу "Обработка баз данных на VB6" Джеффри П.Мак-Мануса.
Он в своих примерах всегда после того как поработал с рекордсетом закрывает его и обнуляет (а я просто закрываю у себя):
Код: Выделить всё
rs.close
Set rs = Nothing

В чем смысл обнуления?
Кто ищет, тот всегда найдет ...

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Закрытие рекордсета.

Сообщение ger_kar » 06.03.2015 (Пт) 14:07

Тут всё зависит от области видимости переменной, если переменная локальная и область её видимости ограничивается процедурой/функцией, то ссылка на объект (не важно какой) обнулится при выходе из процедуры. А если это статичная переменная или глобальная, то она обнулится при завершении приложения. Если нужно обнулить её раньше (если она больше не нужна - это надо сделать обязательно!), то это делается только принудительно.
Кроме этого смысл явного обнуления - это хороший стиль написания кода, к которому надо себя приучать. При этом это должно делаться на автомате.
Я например кроме всего прочего выделяю такие вещи еще и отступами, так же как блоки If...Then, циклы и т.п. Таким образом создание и обнуление объектной переменной смотрится как блок и визуально выделяется. Также отдельным блоком с отступами идет открытие и закрытие рекордсета, создание новой записи и её обновление и т.п. В итоге код получается хорошо структурированным с визуально выделенными блоками. Причем это относится не только к рекордсетам, а вообще к выделению в блоки всего и вся, что может иметь начало и конец. Например открытие и закрытие файла, и всё такое.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 06.03.2015 (Пт) 14:13

ger_kar, нет.
Там что-то с порядком обнуления рекордсета и соединения, на вскидку не могу вспомнить, но их надо обнулить оба и в конкретном порядке.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Закрытие рекордсета.

Сообщение ger_kar » 06.03.2015 (Пт) 14:38

Ну вообще вопрос был про рекордсет, причем, если его принудительно не обнулить, а только закрыть (так как делает автор), то в конечном счёте он все равно обнулится при выходе из процедуры. Т.е. на выходе получим хоть так, хоть сяк один и тот же результат.
Если же говорить о системе объектов ADODB, то да, прежде чем закрыть соединение, то нужно закрыть рекордсет. Хотя можно и не закрывать, а занулить ссылку на соединение у рекордсета или команды, потом закрыть соединение и работать с отключенным рекордсетом, если параметры рекордсета это позволяют сделать (т.е. курсор должен быть клиентским и обновление пакетным).
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 06.03.2015 (Пт) 15:46

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

Смог найти только пример в msdn:
Код: Выделить всё
' clean up
rstEmployees.Close
Cnxn.Close
Set rstEmployees = Nothing
Set Cnxn = Nothing

PS: Хакер? Ты ведь где-то на форуме упоминал об этом?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Закрытие рекордсета.

Сообщение ger_kar » 06.03.2015 (Пт) 16:07

Ну вообще там хитрая связка и всё зависит от конкретных настроек и применения.
Если используется рекордсет без объекта Command, то в случае если рекордсет связан с источником данных он имеет ссылку на объект Connection. В этом случае пока ссылку на рекордсет не занулить соединение не уничтожится. Если Command используется, то там все хитрее и рекордсет работает с соединением через него.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Закрытие рекордсета.

Сообщение ger_kar » 06.03.2015 (Пт) 16:12

Забыл добавить, что если настройки рекордсета позволяют работать без соединения, то ссылку на Connection можно просто занулить, не уничтожая сам рекорсет. В противном случае попытка занулить ссылку на Connection вызовет ошибку. Тоже самое произойдет если рекордсет получен через объект Command. Тогда нужно занулять ссылку непосредственно у самой команды.
Бороться и искать, найти и перепрятать

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Re: Закрытие рекордсета.

Сообщение АндрейБ » 06.03.2015 (Пт) 16:44

на счет
Код: Выделить всё
Set rs = Nothing
я понял, буду обнулять - возможно что и обновление не происходило у меня (это информация для ger_kar - к теме про скорость обновления) быстро потому что я закрывал рекордсет, но не обнулял, а рекордсет ссылался на Connection, поэтому соединение висело открытым и скорость обновления была не достаточной?

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

на счет хорошего стиля программирования (отступы в условиях, в циклах и т.п.) - это обязательно и не для красоты или что бы показать свой уровень, просто когда у меня процедура выросла на несколько страниц и было много циклов и т.п. я понял что разбираться не реально, особенно когда вложенные циклы и условия один в другой - ошибки (зацикливания) неизбежны. Когда структура текста визуально грамотно построена и следствии этого хорошо просматривается и анализируется - поиск ошибок, внесение изменений - облегчило мою лично работу на 50% - я думаю минимум.
Кто ищет, тот всегда найдет ...

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Закрытие рекордсета.

Сообщение ger_kar » 06.03.2015 (Пт) 17:01

АндрейБ писал(а):другой вопрос, я закрыл и обнулил базу данных
Как это? Может речь идет о соединении?

АндрейБ писал(а):просто когда у меня процедура выросла на несколько страниц и было много циклов
Вообще хороший стиль программирования подразумевает такую структуру, где код процедуры или функции умещается на одну страницу и охватывается одним взглядом. Есть конечно случаи, когда приходится писать огромные по размеру процедуры, но такие случаи как правило очень редки. В большинстве случаев практически всегда можно разбить процедуру или функцию на составляющие части.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Закрытие рекордсета.

Сообщение Хакер » 07.03.2015 (Сб) 4:24

Qwertiy писал(а):PS: Хакер? Ты ведь где-то на форуме упоминал об этом?

О чём?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 07.03.2015 (Сб) 12:06

Хакер писал(а):О чём?

В целом было что-то про вредность бескомпромисных советов, и как пример приводился совет всегда присваивать Nothing локальным переменным. После чего говорилось, что это нужно только в специфических случаях, когда требуется гарантировать порядок освобождения ресурсов и описывалась ситуация с рекордсетом. Или я что-то путаю? А то поиском не получилось найти - ни форумным, ни гугловским.

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Re: Закрытие рекордсета.

Сообщение АндрейБ » 09.03.2015 (Пн) 15:39

ger_kar писал(а):
АндрейБ писал(а):другой вопрос, я закрыл и обнулил базу данных
Как это? Может речь идет о соединении?

Да я имел ввиду соединение с базой.
Кто ищет, тот всегда найдет ...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList