powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Правильное закрытие DAO.рекордсета: вопрос...
14 сообщений из 14, страница 1 из 1
Правильное закрытие DAO.рекордсета: вопрос...
    #32435079
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда закрывал ранее открытый рекордсет так:

rs.Close
set rs=nothing

Надоело писать 2 строчки, сочинил под это дело функцию (в стандартном модуле):

Function CloseObj(ByRef Z As Object)
On Error Resume Next
Z.Close
Set Z = Nothing
End Function

и передаю ей rs для закрытия. (On Error Resume Next сделано на случай, если переданный объект не рекордсет и не имеет метода Close).

Так вот, вдруг обнаружил, что первый способ закрытия рекордсета и передача его этой функции не одно и тоже: при закрытии функцией, таблица, данные которой фигурировали в рекордсете, не освобождается. Например, не могу удалить ее, - система говорит, что таблица открыта.

Знатоки, разъясните ситуацию, пожалуйста. В чем разница?
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32435093
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты попробуй On Error Resume Next убрать - вдруг Close и не отрабатывает вовсе?
Строка
Код: plaintext
Set Z = Nothing 

лишняя. При передаче рекордсета в функцию ты сделал лишнюю ссылку, ну и убил потом ее. Внешняя ссылка то от этого не обнулилась

З.Ы. Лень писать - можно вообще на VB положиться, ниче не закрывать и не обнулять
З.З.Ы. Предыдущее З.Ы. считать шюткой :)
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32435101
IgorM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛППри передаче рекордсета в функцию ты сделал лишнюю ссылку, ну и убил потом ее. Внешняя ссылка то от этого не обнулилась
ЛП ты не прав. :) ByRef есть ByRef - это кстати легко проверяется через ObjPtr.

2Alex112
Что касается исходного вопроса: в общем случае у меня всё прибивается корректно. Что-то ты еще забыл.
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32435106
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 IgorM
Не понял. Ты знаешь способ передавать объекты ByVal???
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32435123
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 IgorM
В дополнение к первому своему "не понял"
Код: plaintext
1.
2.
3.
Dim rst1 As Recordset, rst2 as Recordset
Set rst1 = CurrentDb.OpenRecordset( "Таблица1" )
Set rst2 = rst1
Debug.Print ObjPtr(rst1), ObjPtr(rst2)

Ну выдает ObjPtr одно и то же значение. Но ссылки то две.
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32435132
IgorM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, в VB способов не знаю, тут ты прав, не прав в том, что ссылка не обнулится, можешь проверить.
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32435146
IgorM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подожди, я тут "перепутался". :)

Смысл в том, что при таком объявлении

Код: plaintext
Function CloseObj(ByRef Z As Object) 

счетчик ссылок не увеличивается, а при таком:

Код: plaintext
Function CloseObj(ByVal Z As Object) 

увеличивается. Что имхо и соответствует передаче "указателя" или "объекта".
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32435149
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где не обнулится ссылка? В какой момент?
Код: plaintext
1.
2.
3.
4.
5.
6.
Public Function test()
    Dim rst As Recordset
    Set rst = трампампам
    ' одна ссылка есть '
    CloseObj rst ' в этом момент и вторая ссылка появилась - для передачи параметра '
    ' а вот здесь второй ссылки уже нет. но первая то осталась! '
End Function ' и только здесь первая ссылка обнулится - если все будет хорошо :)'
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32435156
IgorM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня не остаётся, только что проверил. Nothing (нулевой адрес) в rst, что, в общем-то, логично.
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32435182
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок. Теперь понял
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32437159
chkalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос такой - а зачем писать две строчки
Код: plaintext
1.
2.
rs.close
set rs=nothing


если они выполняют оно и тоже действие и являются взаимозаменяемыми (альтернативными по отношению руг к другу)? Или есть особенности и хелп нагло врет?
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32437267
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторони выполняют оно и тоже действие и являются взаимозаменяемыми
.....................
................
...............
...................
......................
сильно писал кипятком пока писал ответ
прочитал свой ответ
отмодерил свой ответ
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32437427
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2chkalov
chkalovони выполняют оно и тоже действие и являются взаимозаменяемыми


тебе просто повезло и в темноте ты обошел эти грабли.
забудь про лень и вставляй эти две строки не задумываясь.
самое лёгкое(при их отсутствии) - акс не выгружается из памяти...
...
Рейтинг: 0 / 0
Правильное закрытие DAO.рекордсета: вопрос...
    #32437502
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может быть проблема с неправильной "передачей по ссылке" (достаточно взять ссылку в скобки):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Option Compare Database
Option Explicit

Function CloseObj(ByRef Z As Object)
On Error Resume Next
    Z.Close
    Set Z = Nothing
    Debug.Print Z Is Nothing; ObjPtr(Z)
End Function

Public Function testCloseObj()
Dim db As Database
Dim rst As Recordset
    Set db = CurrentDb()
    Set rst = db.OpenRecordset( "tab0" )
    CloseObj rst
    Debug.Print rst Is Nothing; ObjPtr(rst)
    CloseObj db
    Debug.Print db Is Nothing; ObjPtr(db)
End Function


?testCloseObj()
True 0
True 0
True 0
True 0

а вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function testCloseObj()
Dim db As Database
Dim rst As Recordset
    Set db = CurrentDb()
    Set rst = db.OpenRecordset( "tab0" )
    CloseObj (rst)
    Debug.Print rst Is Nothing; ObjPtr(rst)
    CloseObj (db)
    Debug.Print db Is Nothing; ObjPtr(db)
End Function

?testCloseObj()
True 0
False 1922228
True 0
False 1920208
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Правильное закрытие DAO.рекордсета: вопрос...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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