Как сжать и восстановить базу данных ACCESS 2007 с помощью кода .NET? - PullRequest
4 голосов
/ 10 октября 2009

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

Есть предложения?

EDIT:

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

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

Ответы [ 5 ]

6 голосов
/ 12 октября 2009

Похоже на Office 12 Database Engine не имеет никакой документации в любом месте.

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

На 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 , CREATE TEMPORARY TABLE , и т. д.) было объявлено в справке Access. Будьте бдительны.

3 голосов
/ 04 октября 2013

Я знаю, что это старая тема, но у меня это сработало (для 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>")

http://www.tolchin.net/KB/Lists/Posts/Post.aspx?ID=9

2 голосов
/ 01 июля 2011
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.IO;
using System.Data;
using Microsoft.Office.Interop.Access.Dao;
protected void btnSubmitDenim_Click(object sender, EventArgs e)
{
    try
       {
string oldFileName = HttpContext.Current.Server.MapPath(@"~/App_Data/MyDatainAccess2010.accdb");
string newFileName = HttpContext.Current.Server.MapPath(@"~/App_Data/Temp.accdb");

   // Obtain a reference to the Access 2010 introp DBEngine formally known as JetEngine

    DBEngine engine = (DBEngine)HttpContext.Current.Server.CreateObject("Dao.DBEngine.120");


  // Compact the database (saves the compacted version to newFileName)

    engine.CompactDatabase(oldFileName, newFileName);


            // Delete the original database
            File.Delete(oldFileName);

            // Move (rename) the temporary compacted database to
            // the original filename
            File.Move(newFileName, oldFileName);

            // The operation was successful
            lblResult.Text = "Database Compact completed";
       }
       catch
       {
           // We encountered an error
           lblResult.Text = "Process Failed";

       }
    }

// Hope that helps
// Wasif
2 голосов
/ 01 апреля 2011

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

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

1 голос
/ 11 октября 2009

Вам не нужно 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 вместе с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...