Eсли не писать r.Close при окончании процедуры

Программирование на Visual Basic for Applications
Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Eсли не писать r.Close при окончании процедуры

Сообщение Avtopic » 08.01.2006 (Вс) 22:45

Здравствуйте!
...
Set r = db.OpenRecordset(sqlk)
...
r.Close
Set r = Nothing
End Sub
если не писать r.Close при окончании процедуры close не происходит?

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 09.01.2006 (Пн) 15:51

Т.е. если r объявлен в пределах процедуры при окончании процедуры, что, Recordset не закрывается?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.01.2006 (Пн) 17:20

Если r является локальной переменной, а не глобальной, то должен закрыться.
А есть ли причина, почему надо не писать r.Close?
Lasciate ogni speranza, voi ch'entrate.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 09.01.2006 (Пн) 19:32

Спасибо за ответ!
Причина в том что, в определенный момент, в цикле приходится перебирать много запросов, напр.:
в ARRE() имена запросов, допустим sqlk1, sqlk2, sqlk3 и т. д. их формирую заранее.
и в цикле идет выборка разных вариантов.
Set r = db.OpenRecordset(ARRE(i))
причем, к одному и тому же запросу может получиться, что возвращаться несколько раз.
в работе нет проблем, но мурашки бегают, когда представлю, какое количество Recordset может остаться открытым, если что-то неправильно делаю.
А делаю так:
Код: Выделить всё
r является локальной
For i = 1 To n
.....
....
Set r = db.OpenRecordset(ARRE(i))
....
....
Next
.....
r.Close
Set r = Nothing
End Sub

или нужно, обязательно вот так:
Код: Выделить всё
For i = 1 To n
.....
....
Set r = db.OpenRecordset(ARRE(i))
....
....
r.Close
Set r = Nothing
Next
.....

End Sub

Во втором варианте, меня мучает совесть перед компьютером, не зря ли я его терзаю. В прочем, в первом варианте тоже... :)
А если Recordset-и по окончании процедуры сами закрываются, то и проблем нет.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.01.2006 (Вт) 16:52

Вынеси Set r = Nothing за пределы цикла, в остальном нормально.
А что за задача? Не верится мне, что ее невозможно решить другим способом, менее страшным.
Lasciate ogni speranza, voi ch'entrate.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 10.01.2006 (Вт) 19:23

Безусловно, можно решить другим путем и все довел до одного, правда, огромного запроса.
Главное избавился от этого маразма с циклами.
А совет, все равно полезный, спасибо.

hohol_kz
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.08.2005 (Пт) 6:21

Сообщение hohol_kz » 14.01.2006 (Сб) 13:14

Хм, вообще-то твоего
Код: Выделить всё
Set r = Nothing
должно хватать полностью.

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

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 14.01.2006 (Сб) 22:32

To hohol_kz

Умоляю, объясните, как вы проверяете, хватает или нет.
Честно, мучает меня этот Set ... = Nothing. Ну, вышел я из процедуры, как проверить остается или нет переменная в памяти. По этой части VBA как раз некогда не ругается, пока машина не остановится.
Ну, написано, что надо писать Set ... = Nothing и я пишу. И вроде бы, почему надо, тоже написано, а где можно прочитать поподробнее?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.01.2006 (Вс) 7:08

VB всегда вызывает IUnknown::Release у любой ненулевой объектной переменной, которая вышла из области своей видимости. И ему пофигу, есть реально этот метод или нет, всё равно вызовет. Так что когда его нет, всё нафиг рушится. Соответственно, делать set = nothing следует либо когда нужно уничтожить объект где-нибудь в середине процедуры, либо когда нужно соблюсти порядок закрытия объектов. И ещё когда нужно разорвать циклическую ссылку. В остальном VB всё делает сам.
Скорее всего, у класса Recordset стоит Close на уничтожении. Иначе сложно представить, как бы он себя вёл. Тем не менее, явно предоставленные методы типа Close, Dispose и т.п. я всегда вызываю явно.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

hohol_kz
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.08.2005 (Пт) 6:21

Сообщение hohol_kz » 17.01.2006 (Вт) 15:41

Проверяю просто: если далее по коду мне объект уже не понадобится то прихлопнем его на всякий случай, чотбы место не занимал; если же еще понадобится, то оставляю на развод. А то надеяться на автоматическое освобождение памяти... Как было правильно сказано выше, лучше всего использовать явно. Тогда вероятность мусора при аварийонм сбое программы понижается.
На правах саморекламмы: "Кофейник" - это тот же "чайник", только круче.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 17.01.2006 (Вт) 20:05

Проверяю просто: если далее по коду мне объект уже не понадобится то прихлопнем его на всякий случай, чотбы место не занимал; если же еще понадобится, то оставляю на развод. А то надеяться на автоматическое освобождение памяти... Как было правильно сказано выше, лучше всего использовать явно. Тогда вероятность мусора при аварийонм сбое программы понижается.
Нет, это не “проверяю”, это “делаю” :D. Выше конечно все било сказано правильно. Я тоже обьязателно ставлю .Close и =Nothing

а здесь написано:
hohol_kz
Я делал что-то подобное, когда последовательно заполняю уровни дерева. Всегда хватало присвоения Nothing для recordset.
Так всеже, можно проверить “хватало” или “не хватало”?


Вернуться в VBA

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

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

    TopList