Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / rst.close; set rst=nothing - не баг / 15 сообщений из 15, страница 1 из 1
05.04.2004, 05:53
    #32468429
chkalov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
Может я не прав (или открытие америки заново)?
Код: 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
05.04.2004, 07:15
    #32468450
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
поиск по форуму....
и получишь кучу интересного по данному вопросу.!!!!!
...
Рейтинг: 0 / 0
05.04.2004, 08:00
    #32468467
Alexander G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
Это верно при при работе с recordset формы, но не с рекордсетом, созданным recordsetclone (это копия исходного рекордсета). Проверить несложно.
...
Рейтинг: 0 / 0
05.04.2004, 08:05
    #32468468
chkalov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
Не спорю.
А как поступать если нужно открыть более дной копии?
только следующим образом?

Код: plaintext
1.
2.
3.
dim rst1 as recordset
dim rst2 as recordset
set rst1=me.recordsetclone
set rst2=rst1.clone
...
Рейтинг: 0 / 0
05.04.2004, 09:20
    #32468506
Alexander G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
Другого я не знаю.
Тут есть у меня вопрос.
Код: 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
05.04.2004, 10:32
    #32468608
chkalov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
me.recordsetcone - не метод, а свойство
т.е. оба rst и rst1 ссылаются на один и тотже рекордсет RecordsetClone. Именно поэтому выполнение два раза rst.movenext и rst1.movenext относится к одному рекордсету и переводит указатель на третью запись

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

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

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

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

Значения

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

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

Если это копия - то почему так странно ведет себя в первом куске?
...
Рейтинг: 0 / 0
05.04.2004, 12:39
    #32468884
chkalov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
я создаю копии наборов как я описывал выше и таких глюков не наблюдал. И вспоминается, что с подобным встречался, после чего и отказался от назначения recordsetclone и начал использовать вво втором назначении метод clone
...
Рейтинг: 0 / 0
05.04.2004, 13:01
    #32468938
АлексейЕ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
Как мне кажется, с помощью метода 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
05.04.2004, 13:01
    #32468939
Alexander G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
Я не отношусь к этому как глюку, а хочу понять разницу между клоном и копией, поскольку Гетц подчеркивает различие между ними.
...
Рейтинг: 0 / 0
05.04.2004, 14:17
    #32469088
Alexander G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
Копаемся
Код: 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
05.04.2004, 15:38
    #32469301
АлексейЕ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
Все правильно.
В первом случае (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
05.04.2004, 15:48
    #32469321
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
Да конечно, ObjPtr() просто возвращает то число (адрес) который лежит в этой переменной, а уж он то указывает на структуру в памяти где валяется сам объект. Если объект потихому уничтожали, то в переменной до сих пор будет лежать этот адрес и ObjPtr() его вам вернет, токо по тому адресу уже будет находится черт знает что.
...
Рейтинг: 0 / 0
06.04.2004, 01:10
    #32469831
Alexander G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rst.close; set rst=nothing - не баг
Поскольку других объяснений нет, остается принять это. Но пояснить разницу между копией и клоном составители хелпа и Гетц могли бы. В русском языке этой разницы нет и я всегда удивлялся, почему применяются разные термины.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / rst.close; set rst=nothing - не баг / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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