|
|
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
В первых версиях Аксесса была функция 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 как-то по-другому? Спасибо всем, как всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2003, 22:40 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
Драсте... Саныч, в приложении Б к первому тому Гетца этот вопрос достаточно хорошо рассмотрен. Если возможности нет добраться до этого приложения, то могу скинуть кусок сюда. Извиняюсь, если что не так //чё та последнее время всё не так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2003, 23:18 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
Саныч,побойся бога! Уже суббота на дворе,а ты такие вопросы поднимаешь. Что же касается генеральной линии... Дохтур сказал в морг,значит в морг... То бишь DAO умер,да здравствует ADO! И все плавно перетекаем в сторону VB.NET и SqlServer Нуф-Нуф,не хандри! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2003, 23:29 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
VIG, спасибо. Постараюсь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2003, 23:53 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
2 Нуф: Ой, ребята, все не так, все не так, ребята... (С) Высоцкий. Присоединяюсь к VIG'у. Thanx, мне совестно, что у меня нет Гетца. Мне будет еще более совестно, если ты сейчас станешь сидеть и набирать для меня целые страницы. А в двух словах нельзя? 2 VIG: Барух ата, адонай, элоhейну, мелех hа-олам... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 12:22 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 13:02 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
Что выбрать: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 13:50 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
(с) Гетц и еже с ними... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 13:51 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
Оно, конечно, спасибо, причем громадное. Мне совестно, как я и пугал. Но все равно непонятно, почему нельзя всегда пользоваться DbEngine(0)(0). Если MS рекомендуют CurrentDB, то они ведь что-то имеют в виду? Во всем этом длинном тексте я ответа на этот вопрос не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 14:17 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
P.S. Неужели дело только в Refresh? И что имеется в виду - DbEngine.Refresh??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 14:18 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
И если с DbEngine(0)(0), как сказал Serge Gavrilov, "могут быть проблемы в многопользовательском режиме" (оставим в стороне вопрос, почему именно в многопользовательском), то все-таки - как без DbEngine(0)(0) оформлять транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 15:55 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
вопрос, почему именно в многопользовательском Если другой юзер изменит структуру таблиц, зпросов и т.п., то для того, чтобы увидеть его изменения, нужно вручную отрефрешить соответствующие коллекции. Насколько я понимаю это и есть единственная проблема. А при использовании CurrentDb создается новый объект типа Database, и в нем все коллекции рефрешаться автоматически. Но за это приходится расплачиваться небольшой потерей производительности. как без DbEngine(0)(0) оформлять транзакции? А причем тут транзакции? DbEngine(0) (0) - это объект типа Database, у него нет методов BeginTrans и т.д. Для транзакций нужон Workspace, а это DbEngine(0). Чувстуешь разницу между DbEngine(0)(0) и DbEngine(0)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 16:24 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
Не, видимо, я плохо формулирую свои вопросы. Считать до двух я умею, особенно если считать нули. Вопрос вот в чем: если я напишу Код: plaintext 1. 2. то операции, которые я произведу над db, будут включены в транзакцию. Если же я напишу Код: plaintext 1. 2. то они включены в транзакцию не будут? И второй вопрос: почему мне когда-то DbEngine(0)(0) выдало базу, отличную от CurrentDb? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 17:41 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
1 Если верить Гетцу-будут. Если не верить-то можно проверить: Код: plaintext 1. 2. 3. 4. 2. почему мне когда-то DbEngine(0)(0) выдало базу, отличную от CurrentDb? Это я так иногда шучу (Билл Гейтс) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 17:58 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
VIG, спасибо. Только, наверно, надо пробовать с CurrentDb. А с вопросом номер 2 - это действительно был глюк? Так не должно быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 18:04 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
Только, наверно, надо пробовать с CurrentDb Естественно.Как всегда подвел метод Paste&Copy. это действительно был глюк? Так не должно быть? Думаю,что да. Но точно сказать не могу. Я ДАО уже года 3 как не использую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 18:33 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
>А с вопросом номер 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). [...] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2003, 21:57 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
2 Serge Gavrilov: Thanx a lot!!! Теперь однозначно понятно, что пользоваться DbEngine(0)(0) нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2003, 00:01 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
Но зато проделан эксперимент по 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 В первом случае результаты инсерта сохранились, а во втором нет, как и хотелось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2003, 11:07 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
Следовательно Гетцу(в отлиции от Гейтса) можно верить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2003, 13:00 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
У меня нет Гетца (excuse me), но в приведенной Нуфом цитате нигде не сказано, что CurrentDb работает с транзакциями... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2003, 13:03 |
|
||
|
DbEngine(0)(0) vs. CurrentDb
|
|||
|---|---|---|---|
|
#18+
У меня у самого есть только 0.5 Гетца (2-ой том) :) Я имел в виду не цитату Нуфа, а пример обработки транзакций в ДАО ,который есть как раз в этом томе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2003, 14:04 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32225517&tid=1680147]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 404ms |

| 0 / 0 |
