powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / как грамотно закрыть recordset?
84 сообщений из 84, показаны все 4 страниц
как грамотно закрыть recordset?
    #32816842
AlexJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
привык делать так:

var=currentdb.openrecordset("select Name from Names")("Name")

вопрос в том - выделяется ли память под такое открытие рекордсета и как его закрыть?

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

Access97
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816858
RFT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
recordset.Close
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816862
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
currentdb это вообще очень гнусная вещь, советую ею не пользоваться, так как каждый currentdb приводит к открытию нового экземпляра базы данных

рекордсет я обычно закрываю так:
objRst.Close
Set objRst = Nothing
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816863
Фотография neal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше и корректнее

Set recorset = nothing

------------------------------------------------------
Заходи в саpай аккуpатно - могут быть сеpьезные гpабли.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816877
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем же насинг без клоуза корректнее ?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816884
AlexJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
с этим:
objRst.Close
Set objRst = Nothing
все понятно...

но ведь объекту objRst сначала нужно присвоить рекордсет. а я то его открываю без присваивания имени...

Или способов кроме присваивания не существует?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816907
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexJS
но ведь объекту objRst сначала нужно присвоить рекордсет. а я то его открываю без присваивания имени...

Или способов кроме присваивания не существует?

что вы под этим подразумеваете?

рекордсет открывается так как у вас и написано в первом посте

тольно не
objRst = objDb.OpenRecordset(...)
а
Set objRst = objDb.OpenRecordset(...)
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816920
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да еще сразу не обратил внимание, что это за конструкция у вас такая?

("select Name from Names")("Name")
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816938
AlexJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lenivecда еще сразу не обратил внимание, что это за конструкция у вас такая?

("select Name from Names")("Name")

ну тогда реальный пример:

if currentdb.openrecordset("select IDВыставки from TВыставки where ID=35")("IDВыставки")=185 then

конструкция, поверьте, замечательно работает
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816956
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DLookup тебе в руки
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816966
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexJS if currentdb.openrecordset("select IDВыставки from TВыставки where ID=35")("IDВыставки")=185 then

конструкция, поверьте, замечательно работает
без ножа зарезал. что, что работает? Берет первое поле первой записи рекордсета? И что? А Dlookup не проще?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32816974
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
if currentdb.openrecordset("select IDВыставки from TВыставки where ID=35")("IDВыставки")=185 then

конструкция, поверьте, замечательно работает


Сишнику такая жуткая конструкция в кошмарном сне не присниться. Где создается объект, где уничтожается ? Зачем из-за одного значения рекордсет гонять ? Эдак и число записей можно в цикле мувнекстом пересчитывать :)
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817017
AlexJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо
думаю лукап действитльно мне поможет
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817025
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще не забудьте про остальные DSum, DMax ...
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817071
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за бред вы тут понаписали???

Leniveccurrentdb это вообще очень гнусная вещь, советую ею не пользоваться, так как каждый currentdb приводит к открытию нового экземпляра базы данных
Да ну? Во мля как бывает то


Программист-ЛюбительСишнику такая жуткая конструкция в кошмарном сне не присниться. Где создается объект, где уничтожается ?
Перепишите этот код на си, и поудивляйтесь немного.
Придется точку заменить на "->", а в остальном - те же яйца, только в профиль.

Советующие DLookup (и остальные DSum'ы, DMax'ы) почему-то не упоминают про то, что работает оно медленнее, чем чтение одного поля из рекордсета с одной записью.
Также все почему-то забывают о такой маааленькой детали... DLookup'у (DSum'у, DMax'у) пофигу на все уровни изоляции транзакций, он в своем воркспейсе работает. Вам оно надо? Точно надо? А вы уверены, что автору вопроса это тоже надо?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817082
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛП: ты топик с начала читал, или только конец?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817086
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Советующие DLookup (и остальные DSum'ы, DMax'ы) почему-то не упоминают про то, что работает оно медленнее, чем чтение одного поля из рекордсета с одной записью.


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

Если это проверенная информация, то можно взять на вооружение.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817115
AlexJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программист-Любитель автор
Советующие DLookup (и остальные DSum'ы, DMax'ы) почему-то не упоминают про то, что работает оно медленнее, чем чтение одного поля из рекордсета с одной записью.


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

Если это проверенная информация, то можно взять на вооружение.

Только что провел тестирование:

Код: plaintext
1.
2.
3.
4.
5.
6.
Dim reccount As Integer
reccount = DCount("IDX", "T_Позиции к выставлению", "IDX_Выставки=" &  149 
 & " and (Тип='Площадь' or Тип='Заочники')")
reccount = CurrentDb.OpenRecordset("select count(*) as Recs from [T_Позиции к
 выставлению] where IDX_Выставки=" &  149  & " and (Тип='Площадь' or Тип='Заочники')")("Recs")
MsgBox reccount

в первом случае результат выдается через 6 сек, во втором через 3 сек. На глазок. Что посоветуете в этом случае? Как и рекордсет закрыть, и в скорости не потерять, и сишнику глаза не мозолить?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817131
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Kelme
ЛП: ты топик с начала читал, или только конец?
С начала.
Забыл собственно ответ дать

2 AlexJS
Если надо быть уверенным в корректном закрытии рекордсета, то надо его куда-нить сохранить.
Код: plaintext
1.
2.
Set rst = CurrentDb.OpenRecordset("select Name from Names")
var = rst("Name")
rst.Close: Set rst = Nothing
В принципе оно излишне, и эта работа должна выполняться автоматически. Однако в 97-ой аксес частенько что-то забывает закрыть.

2 Программист-Любитель
Быстрее, чем открытие рекордсета с условием выбора, сортировкой или группировкой и суммрованием плюс выборка поля из него ?
А почему оно должно быть медленнее?
Можно подумать, что всякие там DLookup'ы не открывают запросы, не накладывают условий, не выполняют всякие там группировки, суммирования и прочее. Если бы это было так, то откуда бы они информацию брали?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817133
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
короче чтобы грамотно закрыть рекордсет, надо его грамотно открыть

типа:

Код: plaintext
1.
2.
3.
4.
5.
  dim rs as DAO.Recordset
   set rs = currentdb.openrecordset("bla-bla-bla")
    .....
    rs.close
    set rs = nothing
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817147
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Можно подумать, что всякие там DLookup'ы не открывают запросы, не накладывают условий, не выполняют всякие там группировки, суммирования и прочее. Если бы это было так, то откуда бы они информацию брали?


Конечно открывают. Но я думал, что в DLookup'ах внутри может быть более соптимизированный алгоритм, нежели в универсальных запросах вообще. И рекордсеты внутри они просто обязаны корректно закрывать.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817153
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
быстрее всего будет

Код: plaintext
currentdb().OpenRecordset("select Name from Names WHERE ID=12345",dbopensnapshot).Collect( 0 )

.collect - можно выкинуть как недокументированное, сильно не помогает

помогает dbOpenSnapshot против dbOpenDynaset

А вот если таблица прилинкованная , замена Currentdb() на переменную, указывающую на базу поможет серьёзно ускориться
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817158
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-Любитель автор
Можно подумать, что всякие там DLookup'ы не открывают запросы, не накладывают условий, не выполняют всякие там группировки, суммирования и прочее. Если бы это было так, то откуда бы они информацию брали?


Конечно открывают. Но я думал, что в DLookup'ах внутри может быть более соптимизированный алгоритм, нежели в универсальных запросах вообще. И рекордсеты внутри они просто обязаны корректно закрывать.


ЛП прав ;)
HELP
Although you can use the DLookup function to display a value from a field in a foreign table, it may be more efficient to create a query that contains the fields that you need from both tables and then to base your form or report on that query.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817161
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что есть данные, что при использовании var=currentdb.openrecordset("select Name from Names")("Name")
мусор остаётся?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817167
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно открывают. Но я думал, что в DLookup'ах внутри может быть более соптимизированный алгоритм, нежели в универсальных запросах вообще.
А откуда этот соптимизированный алгоритм там возмется?
И как можно еще более оптимизировать какое-нибудь условие типа "Поле=Значение"? Есть индекс - будем его использовать, нет индекса - будем сканить. Это в случае запроса. А в случае DLookup'а - хрен его знает как ему в голову взбредет поиск выполнять.

И рекордсеты внутри они просто обязаны корректно закрывать.
Угу. Обязаны. Конструкция типа CurrentDb.OpenRecordset("трампампам")("трампампам") тоже обязана рекордсеты закрывать. Однако...
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817168
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey ShА что есть данные, что при использовании var=currentdb.openrecordset("select Name from Names")("Name")
мусор остаётся?

cм. начало топика
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817190
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервиспаки на офис и Jet стоят?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817206
AlexJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey ShСервиспаки на офис и Jet стоят?

Если это по поводу 3сек VS 6сек то стоит пак на офис и mdac 2.8
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817215
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AlexJS:

нет, я по поводу утечки памяти.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817239
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох Позорный
Что за бред вы тут понаписали???

Leniveccurrentdb это вообще очень гнусная вещь, советую ею не пользоваться, так как каждый currentdb приводит к открытию нового экземпляра базы данных
Да ну? Во мля как бывает то



можно писать настольные базочки и ржать себе тихонечко в уголочке над реальными вещами которые не замечаешь сам, а вот когда поработаешь на том уровне на котором мне приходится, тогда и начнеш замечать разные факты, которые не волнуют в других случаях

на нашей программе, которая кстати сказать работает досихпор на 97 аксесе, работают такие крупные предприятия как электростанции РАО ЕС
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817243
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
на нашей программе, которая кстати сказать работает досихпор на 97 аксесе, работают такие крупные предприятия как электростанции РАО ЕС


да ужж, атомные станции и ЦУП тож на ваших прогах работает?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817253
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какова связь между элекстростанцией и CurrentDB ?

Может имеется ввиду, что лучше писать
Код: plaintext
1.
2.
3.
4.
5.
Dim pdb as Database
set pdb =Dbengine( 0 )( 0 )
....
pdb.Openrecordset

...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817254
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очень жалко РАО ЕЭС
потому что там работают программисты, не понимающие разницы между открытием базы данных и созданием COM-объекта типа DAO.Database
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817271
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох Позорныйочень жалко РАО ЕЭС
потому что там работают программисты, не понимающие разницы между открытием базы данных и созданием COM-объекта типа DAO.Database

гы.. гы.. гы..
очень смешно
а вы повсей видимости принимали участие в разработке програмных продуктов микрософт и знаете всю реализацию метода CurrentDB
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817283
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dbengine(0)(0) не всегда может содержать актуальную для вас версию базы данных, мы в своем проекте данную задачу решили с помощью самовосстанавливающего класса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private IsCurDb As DataBase

Private Sub Class_Initialize()
    Set IsCurDb = Nothing
End Sub

Public Property Get curDB() As DataBase
    If IsCurDb Is Nothing Then
        Set IsCurDb = CurrentDb()
    End If
    Set curDB = IsCurDb
End Property

Private Sub Class_Terminate()
    If Not IsCurDb Is Nothing Then
        IsCurDb.Close
        Set IsCurDb = Nothing
    End If
End Sub
и все обращение к базе идет через данный класс
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817290
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вы повсей видимости принимали участие в разработке програмных продуктов микрософт и знаете всю реализацию метода CurrentDB
ОООооо
По всей видимости вы принимали?


про класс промолчу
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817310
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Lenivec :

В в каком воркспэйсе транзакции запускаются?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817316
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По всей видимости вы принимали?

я не принимал, но я и не леплю тут ересь про ком объекты


про класс промолчу

ага, лучше жевать чем говорить
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817320
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы лепите ересь про открытие баз данных и "гнусную вещь CurrentDB"
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817323
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы ещё подеритесь, горячие финские парни
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817327
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тут хохмы ради 100000 раз прогнал CurrentDB().Openrecordset и ни килобайта не утекло. CurrentDb() лучше присвоить переменной, ибо CurrentDB() это просто вызов метода
Код: plaintext
Application.CurrentDb()
и никакой мистики
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817348
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Shя тут хохмы ради 100000 раз прогнал CurrentDB().Openrecordset и ни килобайта не утекло. CurrentDb() лучше присвоить переменной, ибо CurrentDB() это просто вызов метода
Код: plaintext
Application.CurrentDb()
и никакой мистики

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

а теперь по поводу присвоить переменной, что собственно собой и представляет класс, так трансляторы они обладают одной очень плохой особенностью, терять переменные из-за тех или иных сбоев в работе программы, собственно именно для того чтобы обезопасить себе от потере переменной и был реализован класс, который представляет собой ничто иное как глобальную переменную
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817358
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хмм. Кстати немного по теме

1. смотрел я как то код Майкрософта в 97, так там любой If писался так
If (MyBoolVar) Then

2. Известная фича 97 - отсутствие некоего вычисления выражения в IF в 97 может приводить к незакрытию Access
If Me.chk Then - Access виснет
If Me.chk = True Then - Access не виснет

3. () - тоже выражение.

=> если проверяте буленовы поля
If CurDb.OpenRecordset("xxxx")("MyBool") Then - трудно сказать что тут может быть (по аналогии с глюком на If Me.chk Then)



Мдя, с классом явно не возились. Он же инициируется при каждом к нему обращении. (можете написать внем
Код: plaintext
1.
2.
3.
4.
5.
Private Sub Class_Initialize()
On Error GoTo err
    #If (DebugVersion) Then
        Debug.Print "Class_Initialize"
    #End If
...
и тайное станет явным
я делаю такой класс с самоподхватом (инициализируется при первом обращении, или после необрабатываемой ошибки). Вот тогда он и есть самовосстанавливающаяся глобаль (не дергаемая лишний раз).
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817362
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лох Позорный
если интересно то посмотрите внимательно что будет происходить с коллекцией DBEngine(0).Databases при создании новых рекордсетов с помощью конструкций типа:
Код: plaintext
1.
2.
3.
4.
5.
set objRst1 = CurrentDb.OpenRecordset(...)
set objRst2 = CurrentDb.OpenRecordset(...)
set objRst3 = CurrentDb.OpenRecordset(...)
set objRst4 = CurrentDb.OpenRecordset(...)
set objRst5 = CurrentDb.OpenRecordset(...)
или типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
set objDb = CurrentDb
set objRst1 = objDb.OpenRecordset(...)
set objRst2 = objDb.OpenRecordset(...)
set objRst3 = objDb.OpenRecordset(...)
set objRst4 = objDb.OpenRecordset(...)
set objRst5 = objDb.OpenRecordset(...)
так вот, в первом случае на каждый отдельный рекордсет в коллекцию будет добавлен отдельный экземпляр базы данных
а во втором случае все рекордсеты будут созданы в одном единственном экземпляре базы данных

делайте выводы господа
и попробуйте доказать мне что я не прав
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817364
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Транслятор не может "потерять" переменную, речь может идти только об интерпретаторе Р-кода.

2) Мне неизвестны случаи пропажи значения переменных в VBA проекте, в концке концов объекты в VBA - это просто ссылки на IUnknown или IDispatch итерфейс. Либо переменной присвоили Nothing в коде, либо при выполнении случилась неперехваченная ошибка и пользователь вырал вариант "End"
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817367
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 мдя
это откуда же вас стоко умных программеров набралось
обоснуйте пожалуйста товарьщь умник почему класс должен инициализироваться при каждом обращении к нему
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817374
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из хелпа к 2003 аксессу

CurrentDb Method
See AlsoApplies ToExampleSpecifics
The CurrentDb method returns an object variable of type Database <mk:@MSITStore:dao360.chm::/html/daobjDatabase.htm> that represents the database currently open in the Microsoft Access window.
expression.CurrentDb
expression Required. An expression that returns one of the objects in the Applies To list.
Remarks
Note In Microsoft Access the CurrentDb method establishes a hidden reference to the Microsoft DAO 3.6 Object Library in a Microsoft Access database (.mdb).
In order to manipulate the structure of your database and its data from Visual Basic, you must use Data Access Objects (DAO). The CurrentDb method provides a way to access the current database from Visual Basic code without having to know the name of the database. Once you have a variable that points to the current database, you can also access and manipulate other objects and collections in the DAO hierarchy <mk:@MSITStore:dao360.chm::/html/daconMSJetDatabaseEngine25.htm>.
You can use the CurrentDb method to create multiple object variables that refer to the current database. In the following example, the variables dbsA and dbsB both refer to the current database:
Dim dbsA As Database, dbsB As Database
Set dbsA = CurrentDb
Set dbsB = CurrentDb

Note In previous versions of Microsoft Access, you may have used the syntax DBEngine.Workspaces(0).Databases(0) or DBEngine(0)(0) to return a pointer to the current database. In Microsoft Access 2000, you should use the CurrentDb method instead. The CurrentDb method creates another instance of the current database, while the DBEngine(0)(0) syntax refers to the open copy of the current database. The CurrentDb method enables you to create more than one variable of type Database that refers to the current database. Microsoft Access still supports the DBEngine(0)(0) syntax, but you should consider making this modification to your code in order to avoid possible conflicts in a multiuser database (multiuser (shared) database: A database that permits more than one user to access and modify the same set of data at the same time.).
If you need to work with another database at the same time that the current database is open in the Microsoft Access window, use the OpenDatabase <mk:@MSITStore:dao360.chm::/html/damthOpenDatabase.htm> method of a Workspace <mk:@MSITStore:dao360.chm::/html/daobjWorkspace.htm> object. The OpenDatabase method doesn't actually open the second database in the Microsoft Access window; it simply returns a Database variable representing the second database. The following example returns a pointer to the current database and to a database called Contacts.mdb:
Dim dbsCurrent As Database, dbsContacts As Database
Set dbsCurrent = CurrentDb
Set dbsContacts = DBEngine.Workspaces(0).OpenDatabase("Contacts.mdb")
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817375
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Sh1) Транслятор не может "потерять" переменную, речь может идти только об интерпретаторе Р-кода.

2) Мне неизвестны случаи пропажи значения переменных в VBA проекте, в концке концов объекты в VBA - это просто ссылки на IUnknown или IDispatch итерфейс. Либо переменной присвоили Nothing в коде, либо при выполнении случилась неперехваченная ошибка и пользователь вырал вариант "End"

полность согласен
в моем случае это второй вариант, так как проект большой и разрабатываю его не один я, а заставить писать чистый код у меня никаких рычагов нету
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817384
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу инициализации класса.

Код: plaintext
1.
2.
Option Compare Database
Option Explicit
Dim tс As New MyClass

Класс будет инициализироваться при первом вызове метода
Если проект сбросится - Run->Reset или End - произойдёт новая инициализация
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817389
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenivec2 мдя
это откуда же вас стоко умных программеров набралось
обоснуйте пожалуйста товарьщь умник почему класс должен инициализироваться при каждом обращении к нему
Вы читать умеете, вумник, ля?
Напишите то, что предлагалось в ветку #If и спросите пяток раз
?МойКласс.МояБаза.Name
97 запустит Initialize на каждое обращение, муд..рец вы наш. Я просто наблюдал это по факту.

Или вы сначала присваиваете обычной глобали
Public vМойКласс AS МойКласс
...
и где то при загрузке ее инициализируете
Set vМойКласс = МойКласс
а обращаетесь в коде уже не к классу а к переменной его типа
?vМойКласс.МояБаза.Name

???
только зачем вам тогда класс - это и обычным модулем делается (С теми же проверками ... IS Nothing )

ps (как и думал - Alexey Sh предлагает обращаться не к классу а к некой глобали с типом класса - что несколько разные вещи).
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817409
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
класс у меня определяется как
Public vМойКласс AS New МойКласс
и никаких переинициализаций при этом не возникает
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817426
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenivec2 Лох Позорный
если интересно то посмотрите внимательно что будет происходить с коллекцией DBEngine(0).Databases при создании новых рекордсетов с помощью конструкций типа:
Код: plaintext
1.
2.
3.
4.
5.
set objRst1 = CurrentDb.OpenRecordset(...)
set objRst2 = CurrentDb.OpenRecordset(...)
set objRst3 = CurrentDb.OpenRecordset(...)
set objRst4 = CurrentDb.OpenRecordset(...)
set objRst5 = CurrentDb.OpenRecordset(...)
или типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
set objDb = CurrentDb
set objRst1 = objDb.OpenRecordset(...)
set objRst2 = objDb.OpenRecordset(...)
set objRst3 = objDb.OpenRecordset(...)
set objRst4 = objDb.OpenRecordset(...)
set objRst5 = objDb.OpenRecordset(...)
так вот, в первом случае на каждый отдельный рекордсет в коллекцию будет добавлен отдельный экземпляр базы данных
а во втором случае все рекордсеты будут созданы в одном единственном экземпляре базы данных

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

Да, вызов CurrentDb создает новый объект типа DAO.Database.
Да, этот созданный объект добавляется в коллекцию Databases. А почему бы ему туда не добавляться?
Открытие базы данных при этом не происходит.

Чтобы вам было понятнее - аналогичный пример с рекордсетами.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function test()
    Dim db As Database
    Set db = CurrentDb
    Dim rst As Recordset, rst1 As Recordset
    
    Set rst = db.OpenRecordset("t")
    Debug.Print db.Recordsets.Count
    
    Set rst1 = rst.Clone
    Debug.Print db.Recordsets.Count
End Function
Да, клонирование рекордсета создает новый объект типа DAO.Recordset
Да, новый объект добавляется в семейство Recordsets
Открытия рекордсета - нету.

Разумеется, объекты типа Recordset, открытые на различных объектах типа Database - держат ссылки на эти самые объекты типа Database. Как только рекордсет закроется - ссылка освободится.

Вдогонку про класс
ps (как и думал - Alexey Sh предлагает обращаться не к классу а к некой глобали с типом класса - что несколько разные вещи).
Что обращение к классу по имени (MoйКласс.МояБаза), что создание глобальной переменной As New - один хрен.
Не нужен тут класс вообще.
Делается одна глобальная пропертя (с теми же самыми проверками на Nothing)

И совсем уж вдогонку
Непонятно чем это лучше, чем использование DBEngine(0)(0)
Если коллекции (QueryDefs, TableDefs и прочее) меняются - то как ни крути, они и в DBEngine(0)(0) устарели, и в сохраненной переменной в рукотворном классе.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817442
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
И что?

а то что имеется ограничение на колличество открытых баз данных (кстати что по вашему тогда открытая база данных как не экземпляр объекта?) и это ограничение равно всего навсего 255 и для больших проектов если раскидываться направо и налево CurrentDb, то выделенный лимит исчерпаешь очень быстро

автор
Что обращение к классу по имени (MoйКласс.МояБаза), что создание глобальной переменной As New - один хрен.
Не нужен тут класс вообще.
Делается одна глобальная пропертя (с теми же самыми проверками на Nothing)

ради бога, хозяин барин, нравится пользуйте, я не запрещаю

автор
Непонятно чем это лучше, чем использование DBEngine(0)(0)

где вы прочитали у меня что чтото лучше или хуже, я лишь указал на недостаток обращения через DBEngine(0)(0)
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817453
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лох Позорный : хелп про отличия Currentdb() от Dbengine(0)(0) мне сильно не понравился
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817511
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenivecкласс у меня определяется как
Public vМойКласс AS New МойКласс
и никаких переинициализаций при этом не возникает

Хм если быт точным, класс у вас определяется как МойКласс.

Public vМойКласс AS New МойКласс - это определение переменной а не класса

обращение к переменной не есть обращение к классу. Речь шла именно об обращениях к классу.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817521
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 мдя: в VBA классы какие-то болезненные, обращаться к ним иначе как к экзкмплярам никак не получается, ну не нашёл я там статических переменных и методов. Может плохо искал?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817527
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а кто вам таки сказал, что в COM бывают статические переменные/методы класса?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817546
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Sh2 мдя: в VBA классы какие-то болезненные, обращаться к ним иначе как к экзкмплярам никак не получается, ну не нашёл я там статических переменных и методов. Может плохо искал?
Да я не против объявления AS NEW, просто речь шла об обращении именно к классу. При этом (обращении собственно к классу), если класс на держит себя за ссылку (или кто нить еще не держит проинициированную им, не как NEW переменную ), происходит его Initialize, а если держит - не происходит.


МетОда с Pablic xxx As New у меня как то выпала из круга решений, то ли по дурости, то ли из за того, что надо где-то в 3-м месте (кроме класса и вызовов) ее (переменную) объявлять. Я просто делел так в самом классе

В объявлениях:
Private Self As Object
В Class_Initialize :
...
Set Self = Me

В методе Public Sub CloseMe()
...
Set Self = Nothing

при этом обьявлять дополнительную переменную мне не надо, после первого обращения к любому компоненту/методу класса он держит себя за хвост и повторного Initialize не происходит, пока не произойдет CloseMe, или ошибка - в остальном ведет себя как Ваш экземпляр.

Класс я рисовал не для CurrentDB. а для кучки линкованных DB (и Current, заодно), все инициировались напрямую в Initialize (я не закладывался на то, что кто-то снаружи закроет какую-нто ДБ - что, в отсутствии Property Set, кстати сказать и у ленивца нихто не сделает присвоением Nothing, правда метод Close, похоже закроет базу - надо бы и его как-то перекрыть, а не проверять Is Nothing всякий раз), поскольку у меня просто все вызовы написаны как вызовы методов
Set rst =МойКласс.МояБ1.OpenRecordset(...)

Да, и для транзакций он у меня не заточен, ибо воркспейс в нем у меня задается (пусть и (0)), явно.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817592
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МойКласс - это что?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817603
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох ПозорныйСоветующие DLookup (и остальные DSum'ы, DMax'ы) почему-то не упоминают про то, что работает оно медленнее, чем чтение одного поля из рекордсета с одной записью. ...


Но сама-то Function CurrentDb() As Database тоже достаточно долгая.
Поэтому скорость выполнения будет зависеть от того как ее использовать.
Если в цикле гнать считывание поля рекордсета открываемого с CurrentDb, то использование Dlookup будет быстрее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Sub test1()
    Dim a, i, v
    a = Timer
    For i =  1  To  1000 
        v = CurrentDb.OpenRecordset("Select * From msysobjects")("id")
    Next
    Debug.Print Timer - a
End Sub
Sub test2()
    Dim a, i, v
    a = Timer
    For i =  1  To  1000 
        v = DLookup("id", "msysobjects")
    Next
    Debug.Print Timer - a
End Sub
Sub test3()
    Dim a, i, v, d
    Set d = CurrentDb
    a = Timer
    For i =  1  To  1000 
        v = d.OpenRecordset("Select * From msysobjects")("id")
    Next
    Debug.Print Timer - a
End Sub

Скорость 2 и 3 примерно одинакова.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817608
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уже писал здесь, нефиг вызывать Application.CurrentDb() больше одного раза.
присвоить глобальной переменной и забыть.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817609
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И по имени в случае выборки в SELECT одного поля незачем обращаться, индекса 0 достаточно
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817610
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenivec...а то что имеется ограничение на колличество открытых баз данных (кстати что по вашему тогда открытая база данных как не экземпляр объекта?) и это ограничение равно всего навсего 255 и для больших проектов если раскидываться направо и налево CurrentDb, то выделенный лимит исчерпаешь очень быстро

Я не понял, вы считаете, что если я несколько раз вызову CurrentDB, то в коллекцию Databases будут добавлены новые объекты? В какой версии Access?

For i = 1 To 1000
v = CurrentDb.OpenRecordset("Select * From msysobjects")("id")
Next
Debug.Print DBEngine(0).Databases.Count

Выводится 1

При вызове CurrentDb, если не было присвоения объектной переменной, Database как создается, так и уничтожается.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817611
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Sh МойКласс - это что?
в описанном мною выше - это имя (модуля) класса (т.е. "самого класса"), в котором и описан самоподхват (Set Self = Me) и все прочее. Т.е. "стандартный экземпляр класса", который не умирает пока не вызовете соответствующий метод, или не сбросите программу.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817612
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey ShИ по имени в случае выборки в SELECT одного поля незачем обращаться, индекса 0 достаточно
Какое это имеет отношение к тому, что я написал о сравнении скорости dlookup и CurrentDb.OpenRecordset?
Ну замените в моем примере на 0, скорость будет практически таже.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817614
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Serge Gavrilov
Но сама-то Function CurrentDb() As Database тоже достаточно долгая.
Используйте DBEngine(0)(0), оно быстрое :)

Я не понял, вы считаете, что если я несколько раз вызову CurrentDB, то в коллекцию Databases будут добавлены новые объекты? В какой версии Access?
В любой версии аксес - если сохранять ссылку на открытый рекордсет .
Так что речь идет не о том, что "вызовами CurrentDb раскидываться направо и налево", а о том, что "открытыми рекордсетами раскидываться направо и налево". Надобность держать 255 открытых курсоров - весьма сомнительна, тем не менее сгодится как аргумент.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817615
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Shуже писал здесь, нефиг вызывать Application.CurrentDb() больше одного раза.
присвоить глобальной переменной и забыть.

Интересное решение :-)
Но ведь Database может меняться: может добавиться таблица, а ваша глобальная переменная это не заметит.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817616
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov Alexey Shуже писал здесь, нефиг вызывать Application.CurrentDb() больше одного раза.
присвоить глобальной переменной и забыть.

Интересное решение :-)
Но ведь Database может меняться: может добавиться таблица, а ваша глобальная переменная это не заметит.

Появление "на лету" новых таблиц, модификация их структуры - это ошибка проектирования
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817617
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov Alexey Shуже писал здесь, нефиг вызывать Application.CurrentDb() больше одного раза.
присвоить глобальной переменной и забыть.

Интересное решение :-)
Но ведь Database может меняться: может добавиться таблица, а ваша глобальная переменная это не заметит.
Ну, Refresh семейств никто не отменял. Надо только делать их выборочно и выигрыш в скорости супротив повсеместного CurrentDB будет на лице
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817619
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov Alexey Shуже писал здесь, нефиг вызывать Application.CurrentDb() больше одного раза.
присвоить глобальной переменной и забыть.

Интересное решение :-)
Но ведь Database может меняться: может добавиться таблица, а ваша глобальная переменная это не заметит.
не заметит этого и DBEngine(0)(0), и точно так же не заметит этого предлагаемый ленивцем чудо-класс
Метод Refresh у коллекций есть на этот случай.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817621
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более того, я и с "темповой" LocaDB так работаю. Пока жив. (где уш тут ашипка праэктирования, когда сама LocaDB может появиться в процессе работы, не говоря о "темповых" таблицах). И при удаленном пополнении базы с данными новыми таблицами (с учетом того, что процедура эта разовая - при модификации структуры) - мне достаточно не забыть сделать Refresh семейств и все.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817622
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох ПозорныйИспользуйте DBEngine(0)(0), оно быстрое :)

да Лох Позорный
В любой версии аксес - если сохранять ссылку на открытый рекордсет .
Так что речь идет не о том, что "вызовами CurrentDb раскидываться направо и налево", а о том, что "открытыми рекордсетами раскидываться направо и налево". Надобность держать 255 открытых курсоров - весьма сомнительна, тем не менее сгодится как аргумент.
согласен
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817623
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще то говоря появление новой таблицы никак не мешает обратиться к ней с помощью сохранённой до её создания ссылки на CurrentDB()

Где у Карла Маркса написано, что MSYSOBJECT загружается в память намертво? Попробуйте, без всякого Refresh рекордсеты будут успешно открываться. Если уж что и грузится в память, то это коллекции Application.Containers
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817625
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey ShПоявление "на лету" новых таблиц, модификация их структуры - это ошибка проектирования

Ну, кто-то может сказать, что и использование Access - это ошибка проектирования.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817626
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 мдя: странно, с временной db я уже лет 6 как работаю таким образом :)
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817627
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov Alexey ShПоявление "на лету" новых таблиц, модификация их структуры - это ошибка проектирования

Ну, кто-то может сказать, что и использование Access - это ошибка проектирования.

я трактую ссылку на CurrentDB() как некий аналог коннекшна, которые собраны далее в workspace, который обеспечивает единое пространство транзакций для нескольких коннектов
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817628
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Sh2 мдя: странно, с временной db я уже лет 6 как работаю таким образом :)
рад за вас, а то я аж вспотел с перепугу читая:
Alexey ShПоявление "на лету" новых таблиц, модификация их структуры - это ошибка проектирования
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817630
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 мдя: я сознательно временные базы и таблицы оставил за рамками обсуждения, чтоб не усложнять задачу.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817631
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох Позорный...не заметит этого и DBEngine(0)(0), и точно так же не заметит этого предлагаемый ленивцем чудо-класс
Метод Refresh у коллекций есть на этот случай.

сам по себе вызов DBEngine(0)(0) заметит...

А скорость Refresh не будет сопоставим с самим присвоением Set db=CurrentDb?
Я не проверял
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817632
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отцы, вы лучше расшифруйте загадку из хелпа к 2003

Note In previous versions of Microsoft Access, you may have used the syntax DBEngine.Workspaces(0).Databases(0) or DBEngine(0)(0) to return a pointer to the current database. In Microsoft Access 2000, you should use the CurrentDb method instead. The CurrentDb method creates another instance of the current database, while the DBEngine(0)(0) syntax refers to the open copy of the current database. The CurrentDb method enables you to create more than one variable of type Database that refers to the current database. Microsoft Access still supports the DBEngine(0)(0) syntax, but you should consider making this modification to your code in order to avoid possible conflicts in a multiuser database.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817633
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey ShОтцы, вы лучше расшифруйте загадку из хелпа к 2003


Это примечание существует еще с Access 97, в чем именно загадка? :
Help
Примечание. В предыдущих версиях Microsoft Access для возвращения указателя текущей базы данных использовался синтаксис DBEngine.Workspaces(0).Databases(0) или DBEngine(0)(0). В Microsoft Access для Windows 95 вместо этого следует использовать функцию CurrentDb. Функция CurrentDb создает новый экземпляр текущей базы данных, тогда как конструкция DBEngine(0)(0) представляет ссылку на открытую копию текущей базы данных. С помощью функции CurrentDb пользователь имеет возможность создать несколько объектных переменных типа Database, представляющих текущую базу данных. Microsoft Access по-прежнему поддерживает синтаксис DBEngine(0)(0), однако, рекомендуется внести изменения в имеющиеся программы во избежание возможных конфликтов при работе с сетевой базой данных.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817637
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) О каких конфликтах идёт речь?
2) Зачем плодить коннекты?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817642
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817645
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Усё. резюмирую - вызывать CurrentDB() один раз, дабы сэкономить место в Dbengine(0) да и процессор незачем напрягать.
Workspace - не резиновый, 253 максимум члена в коллекции
Проверил, лишние CurrentDB() лишних коннектов к базе не создают, и то хорошо
...
Рейтинг: 0 / 0
84 сообщений из 84, показаны все 4 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / как грамотно закрыть recordset?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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