Как сжать и восстановить базу данных ACCESS 2007 с помощью кода .NET?

Мне нужно сжать и восстановить файл базы данных Access 2007 .accdb. Я знаю, что JRO.JetEngine может делать это с файлами .mdb, но мне нужно восстановить более новую версию формата 2007 с помощью кода.

Какие-либо предложения?

РЕДАКТИРОВАТЬ:

Вот в чем дело: я обнаружил, что могу использовать библиотеку COM-объектов «Библиотека объектов ядра СУБД Microsoft Office 12 Access», использовать класс DBEngine и вызывать его метод CompactDatabse. Но мне кажется, что нет места для ввода пароля базы данных; Похоже, что для ядра СУБД Office 12 нигде нет документации. Я нашел документацию по более старым версиям метода CompactDatabase, но они мне совершенно не помогают.

Это сводит меня с ума.


person TheAgent    schedule 10.10.2009    source источник


Ответы (4)


Похоже, что для ядра СУБД Office 12 нигде нет документации.

Не совсем так. Доступна ограниченная информация.

В MSDN см.:

Справочник разработчика Access 2007

Существует ветка для Справочника по объектам репликации Microsoft Jet (JRO), поэтому JRO (одна из библиотек, содержащих ADO classic) все еще официально поддерживается (и AFAIK все еще работает) для ACE, например формат accdb. метод CompactDatabase принимает два параметра, оба из которых являются подключением к OLE DB. нить. Следовательно, ввод пароля базы данных не должен отличаться от обычного соединения, например. используя Jet OLEDB:Database Password в строке подключения. Помните, что для формата accdb вам нужно включить Jet OLEDB:Engine Type=5 в строку подключения, например.

Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=C:\MyDB.accdb;
Jet OLEDB:Database Password=MYPASSWORD;
Jet OLEDB:Engine Type=5

Как бы то ни было (как оказалось) ограниченная документация для механизма ACE находится в Справка Office для Access 2007.

Имейте в виду, что большая часть ядра СУБД Access была разработана в 1990-х годах, когда частные форматы были в моде; Я подозреваю, что документация была скрыта по коммерческим причинам, а знания просто потеряны. Так что в документации, доступной на данный момент, есть много дыр, причем больших. Часто единственный способ узнать, как работает движок, - это обнаружить его на практике. Существующая документация содержит ужасающие ошибки: уже сегодня я опубликовал пару примеров на SO, где потенциально можно использовать фиктивные функции (LIMIT TO nn ROWS, СОЗДАТЬ ВРЕМЕННУЮ ТАБЛИЦУ и т. Д.) Было объявлено в справке Access. Пусть покупатель будет бдителен.

person onedaywhen    schedule 12.10.2009
comment
Я использую этот код с JRO, и он выдает исключение COM: Dim t_jetEngine As New JRO.JetEngine: t_jetEngine.CompactDatabase (Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C: \ MyDB.accdb; Jet OLEDB: Database Password = MYPASSWORD, Provider = Microsoft.ACE.OLEDB.12.0; Источник данных = C: \ COMPACTED.accdb;) Исключение: Недействительный аргумент Что не так с моим кодом? - person TheAgent; 13.10.2009
comment
@TheAgent: вам нужно добавить Jet OLEDB: Engine Type = 5 в строки подключения. Я обновил свой ответ, чтобы охватить это, используя ваш в качестве примера. - person onedaywhen; 13.10.2009

Я знаю, что это старый поток, но у меня это сработало (для VB.Net). Надеюсь, это поможет кому-то в будущем:

Добавить ссылку на библиотеку объектов ядра СУБД Microsoft Office 12.0 Access

Dim dbe As New Microsoft.Office.Interop.Access.Dao.DBEngine

dbe.CompactDatabase("C:\folder\database.accdb",  "C:\folder\database_New.accdb", , , ";pwd=<database password>")
person Jon    schedule 04.10.2013

Вам не нужен JRO. JRO даже не должно существовать - это один из уродливых пасынков ADODB, возникший из-за ошибочной попытки Microsoft заменить собственный DAO Access / Jet / ACE на ADO, неродной уровень абстракции. JRO обеспечивает поддержку специфических для Jet функций, недоступных в ADODB.

Если бы вы вместо этого использовали DAO, у вас уже была бы вся функциональность, и она работает для всех форматов, поддерживаемых используемой версией Access (поскольку версия DAO синхронизируется с вашей версией Access, то есть когда db улучшен, к нему прилагается новая версия DAO).

Итак, в A2007 вы просто использовали бы компактные методы DAO (с Access 2 не было операции восстановления как отдельной команды, и восстановление происходит только в том случае, если ядро ​​базы данных определяет во время сжатия, что восстановление необходимо). Если вы работаете вне Access, вам необходимо использовать ACE-совместимую версию DAO. Если у вас не установлен A2007 и вы установили ACE независимо, эта версия DAO установлена ​​вместе с ним.

person David-W-Fenton    schedule 10.10.2009
comment
Итак, на какую версию DAO я должен ссылаться в Visual Studio? Я пробовал объектную библиотеку Microsoft DAO 3.6, и она не распознает формат базы данных, вызывая исключение: Нераспознанный формат базы данных 'C: \ Database.accdb' - person TheAgent; 11.10.2009
comment
Правильно, DAO 3.6 предназначен для Jet 4. Вам нужна версия для ACE, которая отображается в ссылках MS IDE как Microsoft Office 12.0 Access Database Engine Object Library, а DLL - это ACEDAO.DLL. - person David-W-Fenton; 12.10.2009

Просто к сведению, что касается JRO, он не поддерживает файлы базы данных Access версии 2007 или более поздней версии. Хотя метод CompactDatabase в этой библиотеке работает при использовании поставщика ACE OLEDB, на самом деле он создает файл базы данных 2002–2003 (Jet 4.0).

Кстати, Engine Type = 5 - это Jet 4.0, так что это должно быть мертвой раздачей в отношении созданной версии.

person pclement    schedule 01.04.2011