powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / DbEngine(0)(0) vs. CurrentDb
23 сообщений из 23, страница 1 из 1
DbEngine(0)(0) vs. CurrentDb
    #32225509
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
В первых версиях Аксесса была функция CurrentDb, про которую было сказано, что она "не рекомендуется к употреблению и в дальнейших версиях будет упразднена". Вместо нее было рекомендовано пользоваться DbEngine(0)(0) - или, если подробнее, DbEngine.WorkSpaces(0).DataBases(0). Затем функция CurrentDb была возвращена, реабилитирована и рекомендована, а DbEngine(0)(0), наоборот, заклеймлена как противоречащая идеологии.

Более того, если мне не примерещилось, иногда случается, что DbEngine(0)(0) возвращает вовсе не CurrentDb, а какую-то другую, то ли библиотечную, то прилинкованную. Если так, то пользоваться DbEngine(0)(0) вместо CurrentDb вообще опасно.

Вопрос. Если согласно последним веяниям линии партии не рекомендуется использовать DbEngine(0)(0), то как оформлять транзакции, которые происходят на уровне WorkSpace, т.е. DbEngine(0)? Может, есть способ обратиться к текущему WorkSpace как-то по-другому?

Спасибо всем, как всегда.
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225514
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Драсте...
Саныч, в приложении Б к первому тому Гетца этот вопрос достаточно хорошо рассмотрен. Если возможности нет добраться до этого приложения, то могу скинуть кусок сюда.
Извиняюсь, если что не так //чё та последнее время всё не так...
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225516
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч,побойся бога! Уже суббота на дворе,а ты такие вопросы поднимаешь.
Что же касается генеральной линии... Дохтур сказал в морг,значит в морг...
То бишь DAO умер,да здравствует ADO! И все плавно перетекаем в сторону
VB.NET и SqlServer
Нуф-Нуф,не хандри!
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225517
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIG, спасибо. Постараюсь...
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225571
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 Нуф:

Ой, ребята, все не так, все не так, ребята... (С) Высоцкий. Присоединяюсь к VIG'у.

Thanx, мне совестно, что у меня нет Гетца. Мне будет еще более совестно, если ты сейчас станешь сидеть и набирать для меня целые страницы. А в двух словах нельзя?

2 VIG:

Барух ата, адонай, элоhейну, мелех hа-олам...
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225587
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DbEngine(0)(0) обеспечивает высокую скорость, но могут быть проблемы в многопользовательском режиме

Вот мнение Ken Getz:

От:Ken Getz (kengetz@my-deja.com)
Заголовок:Re: Increasing Performance

Группы новостей:comp.databases.ms-access
Число:2001-01-17 14:40:16 PST

DBengine(0)(0) is always faster than CurrentDb, because CurrentDb
always refreshes all the internal collections of objects. Won't affect
your startup performance, however. OTOH, referring to CurrentDb often,
especially in loops, can make a big slowdown in your code. -- Ken
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225604
Нуф-нуф_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что выбрать: CurrentDb или DBEngine(0)(0)?
Для получения ссылки на текущую базу данных необходимо использовать объект DBEngine, а также коллекции Workspaces (член этой коллекции Workspaces(0) создается автоматически во время вашей регистрации в Access) и Databases (Access открывает базу данных пользователя как Databases(0)). Все это можно сделать посредством оператора DBEngine.Workspaces(0).Databases(0) который можно сократить до
DBEngine(0)(0) если вас устраивают коллекции, используемые по умолчанию (см. далее раздел «Коллекции, используемые по умолчанию»).
Если с помощью этих операторов можно получить ссылку на базу данных пользователя, то зачем же тогда нужна функция CurrentDb, делающая то же самое? И почему компания Microsoft раньше утверждала, что эта функция устарела и вместо нее лучше использовать вышеприведенные операторы, а теперь она опять говорит о том, что использование функции CurrentDb более предпочтительно? Все это сводится к одному: ядро базы данных (Jet) и Access — это два отдель-ных продукта. Хотя Jet и обеспечивает необходимую функциональность, кото-рая требуется Access при работе с базами данных, однако Access предоставляет пользователю свой уровень сервиса, используемый разработчиками при написа-нии приложений в Access. Таким образом, Jet позволяет получить ссылку на базу данных пользователя посредством оператора DBEngine(0)(0), тогда как Access — посредством функции CurrentDb.
Разумеется, использование оператора DBEngine(0)(0) обязательно, когда вы ра-ботаете вне Access. Иначе говоря, если для управления объектами доступа к дан-ным (DAO) используются средства OLE-автоматизации, это единственный путь для получения ссылки на базу данных Access. С другой стороны, Access предос-тавляет функцию CurrentDb, позволяющую сделать то же самое внутри Access. Существуют некоторые тонкости при получении ссылки на базу данных пользователя внутри Access. Объекты CurrentDb и DBEngine(0)(0) не являются од-ним и тем же объектом, хотя они и ссылаются на одну и ту же базу данных. Каж-дый раз, когда вы получаете эту ссылку посредством функции CurrentDb, Access создает новый внутренний объект, ссылающийся на текущую базу данных. Ядро базы данных (Jet) при выполнении оператора DBEngine(0)(0) таких объектов не создает и возвращает только ссылку на эту базу. Это объясняет, почему нельзя создать ссылки, используя функцию CurrentDb в операторе, включающем в себя несколько других ссылок. Когда VBA во время исполнения такого оператора встретит эту функцию, Access создаст свою внутреннюю ссылку и предоставит ее вам как ссылку на текущую базу данных (такие же действия Access выполняет при открытии базы данных посредством функции OpenDatabase). После выполне-ния оператора Access закрывает внутреннюю ссылку на текущую базу данных. Для некоторых типов объектов, например для наборов записей, Access пытается сохранить эту ссылку. Для других же типов объектов эта ссылка не сохраняется и дальнейшие попытки ее использования заканчиваются неудачно.
Например, попытка выполнения процедуры
Sub ThisDoesntWork()
Dim doc As Document
Set doc CurrentDb.Containers!Tables.Documents(0)
Debug.Print doc.Name
End Sub
приведет к ошибке при выполнении оператора вывода значения свойства
doc.Name в окне отладки. Объект базы данных, использовавшийся для получения ссылки на конкретный документ, был уничтожен, поэтому ссылка на doc стала некорректной. Заметим, что если бы вы заменили в данном программном коде CurrentDb на DBEngine(0)(0) или использовали бы отдельную переменную для ссылки на текущую базу данных, эта процедура выполнилась бы без каких-либо проблем:
Sub ThisDoesntWork()
Dim db As Database
Dim doc As Document
Set db CurrentDb()
Set doc db.Containers!Tables.Documents(0)
Debug.Print doc.Name
End Sub
Что же все-таки предпочесть при написании программы: CurrentDb или DBEngine(0)(0)? Если вы работаете с базами данных Access, используя средства
автоматизации, то ответ прост: DBEngine(0)(0). Если же вы работаете «внутри»
Access, то вы можете использовать как CurrentDb, так и DBEngine(0)(0). Разумеет-ся, использование функции CurrentDb проще и легче для понимания при про-смотре программного кода. Однако этот метод не так быстр, как хотелось бы.
Эксперименты показали, что получение ссылки с использованием функции
CurrentDb на порядок медленнее получения такой же ссылки посредством опера-тора DBEngine(0)(0). Между этими двумя методами существует одно большое раз-лич ие, которое может повлиять на ваш выбор. Ссылка, полученная посредством функции CurrentDb, всегда актуальна, в то время как ссылку, полученную при по-мощи DBEngine(0)(0), необходимо обновлять посредством метода Refresh перед использованием любой коллекции объекта базы данных. Метод Refresh доста-точ но медленный, поэтому он сразу лишит вас выигрыша в скорости, полученно-го от применения DBEngine(0)(0). Поэтому практически во всех примерах, приве-денных в этой книге, ссылка на текущую базу данных получается посредством
вызова функции CurrentDb.
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225605
Нуф-нуф_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
(с) Гетц и еже с ними...
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225611
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Оно, конечно, спасибо, причем громадное. Мне совестно, как я и пугал.

Но все равно непонятно, почему нельзя всегда пользоваться DbEngine(0)(0). Если MS рекомендуют CurrentDB, то они ведь что-то имеют в виду? Во всем этом длинном тексте я ответа на этот вопрос не нашел.
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225612
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
P.S. Неужели дело только в Refresh? И что имеется в виду - DbEngine.Refresh???
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225621
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
И если с DbEngine(0)(0), как сказал Serge Gavrilov, "могут быть проблемы в многопользовательском режиме" (оставим в стороне вопрос, почему именно в многопользовательском), то все-таки - как без DbEngine(0)(0) оформлять транзакции?
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225627
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос, почему именно в многопользовательском
Если другой юзер изменит структуру таблиц, зпросов и т.п., то для того, чтобы увидеть его изменения, нужно вручную отрефрешить соответствующие коллекции. Насколько я понимаю это и есть единственная проблема. А при использовании CurrentDb создается новый объект типа Database, и в нем все коллекции рефрешаться автоматически. Но за это приходится расплачиваться небольшой потерей производительности.

как без DbEngine(0)(0) оформлять транзакции?
А причем тут транзакции? DbEngine(0) (0) - это объект типа Database, у него нет методов BeginTrans и т.д.
Для транзакций нужон Workspace, а это DbEngine(0). Чувстуешь разницу между DbEngine(0)(0) и DbEngine(0)?
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225645
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Не, видимо, я плохо формулирую свои вопросы. Считать до двух я умею, особенно если считать нули. Вопрос вот в чем: если я напишу

Код: plaintext
1.
2.
Set ws = DbEngine( 0 )
Set db = ws( 0 )
ws.BeginTrans

то операции, которые я произведу над db, будут включены в транзакцию. Если же я напишу

Код: plaintext
1.
2.
Set ws = DbEngine( 0 )
Set db = CurrentDb
ws.BeginTrans

то они включены в транзакцию не будут?

И второй вопрос: почему мне когда-то DbEngine(0)(0) выдало базу, отличную от CurrentDb?
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225655
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1
Если верить Гетцу-будут.
Если не верить-то можно проверить:
Код: plaintext
1.
2.
3.
4.
Set ws = DbEngine( 0 )
Set db = ws( 0 )
ws.BeginTrans
db.execute( "INSERT INTO ....." )
ws.rollback

2. почему мне когда-то DbEngine(0)(0) выдало базу, отличную от CurrentDb?
Это я так иногда шучу (Билл Гейтс)
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225661
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
VIG, спасибо. Только, наверно, надо пробовать с CurrentDb.

А с вопросом номер 2 - это действительно был глюк? Так не должно быть?
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225672
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только, наверно, надо пробовать с CurrentDb
Естественно.Как всегда подвел метод Paste&Copy.
это действительно был глюк? Так не должно быть?
Думаю,что да. Но точно сказать не могу. Я ДАО уже года 3 как не использую.
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225723
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А с вопросом номер 2 - это действительно был глюк? Так не должно быть?

Лень переводить

От:David W. Fenton (dXXXfenton@bway.net)
Заголовок:Re: The DBengine(0)(0) problem - attn Mark Johnson

View this article only
Группы новостей:comp.databases.ms-access
Число:2003-03-28 10:38:49 PST
[...]
CurrentDB() *always* points to the one the user perceives as being
open in the Access UI. DBEngine(0)(0) points to the first database
that has a UI that appears in the user interface.

Say you are working in a database. It is DBEngine(0)(0). You run a
wizard. It is DBEngine(0)(1), which does not show up in the UI
after you've finished it and in most instances does *not* remain in
the databases collection after it terminates. You close the
database. What happens to the wizard? Well, in some undefined
circumstances it becomes DBEngine(0)(0), so, even though there is
nothing open in the user interface, there is still a database open
as far as the databases collection of the default workspace is
concerned. If, in the same instance of Access you now open another
MDB, it will not become DBEngine(0)(0) -- it will be added to the
databases collection and be DBEngine(0)(1).

[...]
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225741
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 Serge Gavrilov:

Thanx a lot!!!

Теперь однозначно понятно, что пользоваться DbEngine(0)(0) нельзя.
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225779
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Но зато проделан эксперимент по VIG'у (спасибо!) - все пашет. То есть CurrentDb входит в транзакции, производимые над DbEngine(0).

Эксперимент проделан следующий:

1.

With DBEngine(0)
.BeginTrans
CurrentDb.Execute ("INSERT ...")
.CommitTrans
End With

2.

With DBEngine(0)
.BeginTrans
CurrentDb.Execute ("INSERT ...")
.Rollback
End With

В первом случае результаты инсерта сохранились, а во втором нет, как и хотелось.
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225804
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следовательно Гетцу(в отлиции от Гейтса) можно верить.
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225805
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
У меня нет Гетца (excuse me), но в приведенной Нуфом цитате нигде не сказано, что CurrentDb работает с транзакциями...
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225820
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня у самого есть только 0.5 Гетца (2-ой том) :)
Я имел в виду не цитату Нуфа, а пример обработки транзакций в ДАО ,который есть как раз в этом томе.
...
Рейтинг: 0 / 0
DbEngine(0)(0) vs. CurrentDb
    #32225823
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Мои очередные покаянные слова Гетцу за отсутствие его у меня. :^)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / DbEngine(0)(0) vs. CurrentDb
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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