powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / rst.close; set rst=nothing - не баг
15 сообщений из 15, страница 1 из 1
rst.close; set rst=nothing - не баг
    #32468429
chkalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может я не прав (или открытие америки заново)?
Код: plaintext
1.
rst.close
set rst=nothing

Приведенная последовательность необязательна, и команды эти имеют совершенно разный смысл.

rst - является указателем на структуру recordset.
В случае, если recordset открыт как currentdb.openrecordset, то после использования rst нужно закрывать его используя rst.close

Если rst использовался как указатель на recordset или recordsetclone какой-либо формы, то закрывать rst нужно используя set rst=nothing, т.е. просто уаляется указатель rst. Использование rst.close приведет к закрытию recordset на который указывал указатель, т.е. recordset/recordsetclone формы, что приведет к неизбежному г...
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32468450
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поиск по форуму....
и получишь кучу интересного по данному вопросу.!!!!!
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32468467
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это верно при при работе с recordset формы, но не с рекордсетом, созданным recordsetclone (это копия исходного рекордсета). Проверить несложно.
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32468468
chkalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не спорю.
А как поступать если нужно открыть более дной копии?
только следующим образом?

Код: plaintext
1.
2.
3.
dim rst1 as recordset
dim rst2 as recordset
set rst1=me.recordsetclone
set rst2=rst1.clone
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32468506
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другого я не знаю.
Тут есть у меня вопрос.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim rst As DAO.Recordset
Dim rst1 As DAO.Recordset
Set rst = Me.RecordsetClone
Set rst1 = Me.RecordsetClone
rst.MoveNext
rst1.MoveNext
Me.Bookmark = rst1.Bookmark
rst.Close
rst1.Close
Set rst = Nothing
Set rst1 = Nothing


По логике если мы создали 2 независимых копии - то текущей записью формы должна быть вторая, мы же передвигали курсор в разных рекордсетах.
А на самом деле - третья.

Предположим, что они ссылаются на один и тот же набор.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim rst As DAO.Recordset
Dim rst1 As DAO.Recordset
Set rst = Me.RecordsetClone
Set rst1 = Me.RecordsetClone
rst.Close
Set rst = Nothing
rst1.MoveNext
Me.Bookmark = rst1.Bookmark
rst1.Close
Set rst1 = Nothing

Текущая-вторая, закрытие первого рекордсета ни к чему не приводит, получается это разные рекодсеты.
Может кто-нибудь пояснит такое поведение?
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32468608
chkalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
me.recordsetcone - не метод, а свойство
т.е. оба rst и rst1 ссылаются на один и тотже рекордсет RecordsetClone. Именно поэтому выполнение два раза rst.movenext и rst1.movenext относится к одному рекордсету и переводит указатель на третью запись

независимы recordset создается методом clone, т.е. rst и rst1 будут независимы только в том случае если было селано

Код: plaintext
1.
rst=me.recordsetclone
rst1=rst.clone
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32468616
chkalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторSet rst = Nothing

выражение убивает ссылку, а не закрывает объект. Объект закрывается
Код: plaintext
rst.close
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32468758
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А разве у меня нет rst.Close?

Неlp:
Свойство RecordsetClone используется для ссылок на объект формы Recordset, указанный в свойстве формы Источник записей (RecordSource).

Значения

Значение свойства формы RecordsetClone определяет копию набора записей базовой таблицы или запроса, указанных в свойстве формы Источник записей (RecordSource). Например, если форма основана на запросе, то обращение к свойству RecordsetClone эквивалентно созданию копии объекта Recordset с помощью того же запроса. Если к форме будет дополнительно применен фильтр, то объект Recordset создается с учетом фильтра.

Если это ссылка, почему не был убит исходный рекордсет во втором куске кода?

Если это копия - то почему так странно ведет себя в первом куске?
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32468884
chkalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я создаю копии наборов как я описывал выше и таких глюков не наблюдал. И вспоминается, что с подобным встречался, после чего и отказался от назначения recordsetclone и начал использовать вво втором назначении метод clone
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32468938
АлексейЕ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как мне кажется, с помощью метода RecordsetClone мы не создаем новый рекордсет, а лишь обращаемся к уже созданному Access'ом в момент открытия формы. Т.е. при открытии формы создается два рекордсета, основной и клон.

Слегка доработанный пример от Alexander G
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Dim rst As DAO.Recordset
Dim rst1 As DAO.Recordset
Set rst = Me.RecordsetClone
Set rst1 = Me.RecordsetClone

Debug.Print  "Клон 1  " & ObjPtr(rst1) &  "    Клон 2  " & ObjPtr(rst) &  "   Основной "  & ObjPtr(Me.Recordset)
rst.Close
Debug.Print  "Клон 1  " & ObjPtr(rst1) &  "    Клон 2  " & ObjPtr(rst) &  "   Основной "  & ObjPtr(Me.Recordset)
rst1.Close
Set rst = Nothing
Set rst1 = Nothing
Debug.Print  "Клон 1  " & ObjPtr(rst1) &  "    Клон 2  " & ObjPtr(rst) &  "   Основной "  & ObjPtr(Me.Recordset)

Set rst = Me.RecordsetClone
Set rst1 = Me.RecordsetClone

Debug.Print  "Клон 1  " & ObjPtr(rst1) &  "    Клон 2  " & ObjPtr(rst) &  "   Основной "  & ObjPtr(Me.Recordset)
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32468939
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не отношусь к этому как глюку, а хочу понять разницу между клоном и копией, поскольку Гетц подчеркивает различие между ними.
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32469088
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Копаемся
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim rst As DAO.Recordset
Dim rst1 As DAO.Recordset
Set rst = Me.RecordsetClone
Set rst1 = rst 

Debug.Print  "Клон 1  " & ObjPtr(rst1) &  "    Клон 2  " & ObjPtr(rst) &  "   Основной "  & ObjPtr(Me.Recordset)
rst.Close
Set rst = Nothing
Debug.Print  "Клон 1  " & ObjPtr(rst1) &  "    Клон 2  " & ObjPtr(rst) &  "   Основной "  & ObjPtr(Me.Recordset)
rst1.Close
Set rst1 = Nothing
Debug.Print  "Клон 1  " & ObjPtr(rst1) &  "    Клон 2  " & ObjPtr(rst) &  "   Основной "  & ObjPtr(Me.Recordset)

Отрабатывает без проблем, хотя rst1 - просто еще ссылка на один рекордсет

А так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim rst As DAO.Recordset
Dim rst1 As DAO.Recordset
Set rst = CurrentDb.OpenRecordset( "SELECT * FROM tbl1;" )
Set rst1 = rst 

Debug.Print  "Клон 1  " & ObjPtr(rst1) &  "    Клон 2  " & ObjPtr(rst) &  "   Основной "  & ObjPtr(Me.Recordset)
rst.Close
Set rst = Nothing
Debug.Print  "Клон 1  " & ObjPtr(rst1) &  "    Клон 2  " & ObjPtr(rst) &  "   Основной "  & ObjPtr(Me.Recordset)
rst1.Close

Вылетает на последней строке, как и положено, с ошибкой 3420

ПОЧЕМУ?!
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32469301
АлексейЕ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все правильно.
В первом случае (Me.RecordsetClone) Access, т.к. он сам создал рекордсет для предоставления его через свойство RecordsetClone не даст Вам самому его закрыть. Т.е. ни rst.Close, ни rst1.Close не приводит к его закрытию. Закрывает его сам Access при закрытии формы. Можно сотню строк поставить Me.RecordsetClone.Close и они отработаю без ошибки, по скольку, как мне кажется, Access их просто игнорирует.
К стати отсюда и предупреждение в хелпе по свойству RecordsetClone
Примечание. Если пользователь закроет форму или изменит значение свойства формы Источник записей (RecordSource), прежний объект Recordset станет неопределенным. Последующие ссылки на этот объект или на закладки, сохраненные в форме или в этом объекте, приведут к возникновению ошибки.
Т.к. Access сам открывает и закрывает рекордсет для RecordsetClone и мы на это не можем повлиять.
Повторюсь, это лишь мое мнение, но именно оно помогло мне понять некоторые особенности, такие как при наличии записей в рекордсете свойства BOF и EOF, тем не менее, возвращали значение TRUE.
http://am.rusimport.ru/MSAccess/f2.aspx?id=15205

Во втором случае, при закрытии рекордсета ссылка на него не уничтожается, вот и ObjPtr() и возвращает номер объекта на который ссылается переменная, при том, что сам объект уже закрыт.
Думаю ObjPtr() не проверяет сам объект, закрыт, открыт, существут или нет, а возвращает лишь свойство переменной.
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32469321
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да конечно, ObjPtr() просто возвращает то число (адрес) который лежит в этой переменной, а уж он то указывает на структуру в памяти где валяется сам объект. Если объект потихому уничтожали, то в переменной до сих пор будет лежать этот адрес и ObjPtr() его вам вернет, токо по тому адресу уже будет находится черт знает что.
...
Рейтинг: 0 / 0
rst.close; set rst=nothing - не баг
    #32469831
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку других объяснений нет, остается принять это. Но пояснить разницу между копией и клоном составители хелпа и Гетц могли бы. В русском языке этой разницы нет и я всегда удивлялся, почему применяются разные термины.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / rst.close; set rst=nothing - не баг
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]