4 Stimmen

Wie komprimiere und repariere ich eine ACCESS 2007-Datenbank mit .NET-Code?

Ich muss eine Access 2007 .accdb-Datenbankdatei komprimieren und reparieren. Ich weiß, dass JRO.JetEngine dies mit .mdb-Dateien tun kann, aber ich muss das neuere Format der Version 2007 per Code reparieren.

Irgendwelche Vorschläge?

EDIT :

Hier ist die Sache: Ich habe herausgefunden, dass ich die COM-Objektbibliothek "Microsoft Office 12 Access Database Engine Object Library" verwenden und die DBEngine-Klasse verwenden und ihre CompactDatabse-Methode aufrufen kann. Aber es scheint keinen Ort zu geben, an dem ich das Datenbankkennwort angeben kann; anscheinend hat Office 12 Database Engine nirgendwo eine Dokumentation. Ich habe einige Dokumentationen für ältere Versionen der CompactDatabase-Methode gefunden, aber die helfen mir überhaupt nicht weiter.

Das macht mich verrückt.

6voto

onedaywhen Punkte 52850

Sieht aus wie Office 12 Database Engine keine Dokumentation zu haben irgendwo.

Das stimmt nicht ganz. Es sind nur wenige Informationen verfügbar.

Auf MSDN, siehe:

Access 2007-Referenz für Entwickler

Es gibt eine Verzweigung für Microsoft Jet Replication Objects (JRO) Referenz so dass JRO (einer der Bibliotheken, die ADO classic umfassen ) wird immer noch offiziell unterstützt (und funktioniert AFAIK immer noch) für ACE, z.B. das accdb-Format. Die CompactDatabase-Methode benötigt zwei Parameter, die beide eine OLE DB-Verbindungszeichenfolge sind. Daher sollte sich die Angabe des Datenbankpassworts nicht von einer normalen Verbindung unterscheiden, z.B. mit Jet OLEDB:Database Password in der Verbindungszeichenfolge. Denken Sie daran, dass Sie für das accdb-Format Folgendes einschließen müssen Jet OLEDB:Engine Type=5 in der Verbindungszeichenfolge, z. B.

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

Was auch immer es wert ist (nicht viel, wie sich herausstellt), eine begrenzte Dokumentation für die ACE-Engine findet sich in der Office-Hilfe für Access 2007 .

Bedenken Sie, dass der größte Teil der Access-Datenbank-Engine in den 1990er Jahren entwickelt wurde, als proprietäre Formate der letzte Schrei waren; ich vermute, dass die Dokumentation aus kommerziellen Gründen unterdrückt wurde und das Wissen einfach verloren gegangen ist. Es gibt also viele Lücken in der derzeit verfügbaren Dokumentation, und zwar große. Oft ist die einzige Möglichkeit, herauszufinden, wie der Motor funktioniert, die tatsächliche Nutzung. Die Dokumentation, die es gibt, enthält einige erschreckende Fehler: bereits heute habe ich ein paar Beispiele auf SO gepostet, in denen möglicherweise noch fiktive Funktionen verwendet werden ( LIMIT TO nn ROWS (Begrenzung auf nn Zeilen) , TEMPORÄRE TABELLE ERSTELLEN usw.) wurde in der Access-Hilfe ausgeschrieben. Vorbehalt des Leergangs.

5voto

Jon Punkte 1171

Ich weiß, dies ist ein alter Thread, aber das hat bei mir funktioniert (für VB.Net). Hoffentlich kann es jemand auf dem Weg zu helfen:

Hinzufügen eines Verweises auf "Microsoft Office 12.0 Access-Datenbank-Engine Objektbibliothek"

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

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

2voto

David-W-Fenton Punkte 22473

Sie brauchen JRO nicht. JRO sollte gar nicht existieren - es ist eines der hässlichen Stiefkinder von ADODB, das durch Microsofts fehlgeleiteten Versuch entstanden ist, Access/Jet/ACEs natives DAO durch ADO, eine nicht-native Abstraktionsschicht, zu ersetzen. JRO ist dazu da, Jet-spezifische Funktionen zu unterstützen, die in ADODB nicht verfügbar sind.

Wenn Sie stattdessen DAO verwenden würden, hätten Sie die gesamte Funktionalität bereits, und es funktioniert für alle Formate, die von der Access-Version, die Sie verwenden, unterstützt werden (da die DAO-Version mit Ihrer Access-Version synchronisiert wird, d. h., wenn die DB-Engine verbessert wird, gibt es eine neue Version von DAO, die damit einhergeht).

In A2007 verwenden Sie also einfach die DAO-Kompaktierungsmethoden (seit Access 2 gibt es keine Reparaturoperation als separaten Befehl mehr, und eine Reparatur erfolgt nur, wenn die Datenbank-Engine während der Kompaktierung feststellt, dass eine Reparatur erforderlich ist). Wenn Sie von außerhalb von Access arbeiten, müssen Sie die ACE-kompatible Version von DAO verwenden. Wenn Sie A2007 nicht installiert haben und den ACE unabhängig davon installiert haben, haben Sie diese Version von DAO mit installiert.

2voto

pclement Punkte 21

Zu Ihrer Information: JRO unterstützt keine Access-Datenbankdateien der Version 2007 oder höher. Während die CompactDatabase-Methode in dieser Bibliothek zu funktionieren scheint, wenn Sie den ACE OLEDB Provider verwenden, wird es in der Tat eine 2002-2003 (Jet 4.0) Datenbankdatei erzeugen.

BTW, ein Engine Type = 5 ist Jet 4.0, also sollte das ein eindeutiger Hinweis auf die erstellte Version sein.

2voto

Wasif Majeed Punkte 21
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";

       }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X