[ADO] Datenbank koprimieren



  • Hallo,

    ich greife per ADO auf eine Access Datenbank zu. Diese wird mit der Zeit sehr
    gross. In Access kann man "Datenbank koprimieren und reparieren" wählen.

    Kann man diese Funktion über ADO irgerndwie erledigen?


  • Mod

    Hallo

    sollte doch eigentlich per SQL-Befehl (Access) funktionieren
    (irgendwas mit "compact" ?)

    MfG
    Klaus



  • Ich hab da mal irgendwann was drüber gelesesn, aber ich weiß nicht mehr wo...
    Aber soweit ich mich erinnere, benötigt man dazu die Microsoft Jet and Replication Objects Library und dann konnte man daraus die Funktion CompactDatatbase verwenden.



  • void CompactDatabase(String f1,String psw1,String f2,String psw2)
    {
     String Provider1="Provider=Microsoft.Jet.OLEDB.4.0"
     ";Data Source="+f1+
     ";Jet OLEDB:Database Password="+psw1;
     String Provider2="Provider=Microsoft.Jet.OLEDB.4.0"
     ";Data Source="+f2+
     ";Jet OLEDB:Database Password="+psw2;
     Variant Adoobj=Variant::CreateObject("JRO.JetEngine");
     Adoobj.OleProcedure("CompactDatabase",Provider1.c_str(),Provider2.c_str());
     remove(f1.c_str());
     rename(f2.c_str(),f1.c_str());
    }
    


  • Danke, es kommt leider ein Fehler: 'Ausnahmefehler aufgetreten'
    ich probier noch ein wenig evtl. mach ich es per Kommandozeile.



  • Der Ausnahmefehler kommt dann, wenn du bei f2 (Destination) den gleichen Filenamen verwendest wie bei f1(Source).
    Die Funktion komprimiert die Datenbank mit dem Namen(Pfad) f1 und speichert diese dann unter dem Namen(Pfad) f2 ab.
    Darum dann auch das remove und rename.



  • ich hab es so versucht:

    bool __fastcall CDatabase::CompactDatabase()
    {
        bool bReturn = false;
    
        try {
            Close();
    
            AnsiString sFile1 = sFileName;
            AnsiString sFile2 = sFileName + ".tmp";
    
            String Provider1="Provider=Microsoft.Jet.OLEDB.4.0"
            ";Data Source="+sFile1+
            ";Jet OLEDB:Database Password=''";
            String Provider2="Provider=Microsoft.Jet.OLEDB.4.0"
            ";Data Source="+sFile2 + ".tmp"+
            ";Jet OLEDB:Database Password=''";
            Variant Adoobj=Variant::CreateObject("JRO.JetEngine");
            Adoobj.OleProcedure("CompactDatabase",Provider1.c_str(),Provider2.c_str());
    
            DeleteFile(sFile1.c_str());
            RenameFile(sFile2.c_str(),sFile1.c_str());
    
            ReOpen();
    
            bReturn = true;
        } catch (...) {
            MessageDlg("Fehler beim Komprimieren der Datenbank.", mtError, TMsgDlgButtons() << mbOK, 0);
        }
    
        return bReturn;
    };
    

    also File1 und 2 sind auf jeden Fall unterschiedlich. File1 existiert auch.
    Ein Passwort hab ich bei der Datenbank nicht vergeben.



  • Wie ruftst du CompactDatabase denn auf ?
    Pfade in sFileName mit \\ ?



  • bool __fastcall CDatabase::CompactDatabase()
    {
        bool bReturn = false;
    
        try {
            Close();
    
            AnsiString sFile1 = sFileName;
            AnsiString sFile2 = sFileName + ".tmp";
    
            String Provider1="Provider=Microsoft.Jet.OLEDB.4.0"
            ";Data Source="+sFile1+
            ";Jet OLEDB:Database Password=''";
            String Provider2="Provider=Microsoft.Jet.OLEDB.4.0"
            ";Data Source="+sFile2+
            ";Jet OLEDB:Database Password=''";
            Variant Adoobj=Variant::CreateObject("JRO.JetEngine");
            Adoobj.OleProcedure("CompactDatabase",Provider1.c_str(),Provider2.c_str());
    
            DeleteFile(sFile1.c_str());
            RenameFile(sFile2.c_str(),sFile1.c_str());
    
            ReOpen();
    
            bReturn = true;
        } catch (...) {
            MessageDlg("Fehler beim Komprimieren der Datenbank.", mtError, TMsgDlgButtons() << mbOK, 0);
        }
    
        return bReturn;
    };
    

Anmelden zum Antworten