IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Compresser une base de données *.mdb sans Access


Sujet :

C++Builder

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut Compresser une base de données *.mdb sans Access
    Bonjour à tous,

    Je souhaite compresser une base de données Access sans que Access soit installé sur le poste, donc directement avec Jet Engine.

    J'ai trouvé ce code chez nos parrains Delphynautes mais je suis incapable de l'adater à C++, donc si vous avez des idées...:

    function CompactAccessDB(DB, MdP : string): Boolean; {DB = path complet de la base Access, MdP = password de la DB }
    // Ajouter ComObj dans les Uses
    var
    v: OLEvariant;
    begin
    Result := False;
    try
    v := CreateOLEObject('JRO.JetEngine');
    try
    if CopyFile(PAnsiChar(DB),PAnsiChar(DB+'.bak'),False) then //backup de la base
    begin
    V.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DB+';Jet OLEDB: Database Password='+MdP,
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DB+'comp'+';Jet OLEDB: Database Password='+MdP); //compactage
    DeleteFile(DB);// suppression de la base d'origin
    RenameFile(DB+'comp',DB); // mise en place de la base compactée
    Result := True;
    end;
    finally
    V := Unassigned;
    end;
    except
    Result := False;
    end;
    end;

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    J'ai trouvé cette page, mais pareil impossible à implémenter :

    http://support.microsoft.com/kb/230501/EN-US/

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Fbartolo:
    Un lien dans la FAQ Access, je pense qu'il faut utiliser Ole
    Je viens de me rendre compte qu'il faut Access
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Merci Blondel, avec le composant XP Application Access, cela fonctionne, mais moi je souhaite me passer d'access comme le fait ADO d'ailleurs.

    Le code Delphy le fait bien semble t-il via JRO (donc avec le moteur Jet directement), mais je ne suis pas arrivé à l'implémenter en C++

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    J'ai commence a traduire je te donne ce qui est fait:
    le norceau de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    // ne pas oublier d'inclure
    // #include <comobj.hpp>
    // #include <utilcls.h>
    Variant v;
    unsigned char * DB;
    unsigned char * DB_BAK;
    unsigned char * Mdp;
    DB = "C:\\Documents and Settings\\blondelle\\Mes documents\\MySQL\\UtilisationBDE\\fichiers\\maBdd\\maBdd1.mdb";
    DB_BAK = "C:\\Documents and Settings\\blondelle\\Mes documents\\MySQL\\UtilisationBDE\\fichiers\\maBdd\\maBdd1.bak";
    Mdp = "";
    v = CreateOleObject("JRO.JetEngine");
    if (CopyFile(DB, DB_BAK, false))
    {
    v.OleFunction("CompactDatabase");
    }
    Je cree un fichier .Bak pour la fonction "CompactDatabase" je n'ai pas encore trouve.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Oui bien vu, sans soute quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v.OleFunction("CompactDatabase",Provider1,Provider2);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v.OleProcedure("CompactDatabase",Provider1,Provider2);
    a tester donc...

  7. #7
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    J'en suis a ceci mais j'ai une exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    v.OleFunction("CompactDatabase", "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = DB;Jet OLEDB:Database Password = Mdp","Provider = Microsoft.Jet.OLEDB.4.0;Data Source = DB_comp;Jet OLEDB:Database Password = Mdp");
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Idem exeption...

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Merci Blondel pour ton aide précieuse.

    Ci dessous en exemple le résultat qui fonctionne et en plus c'est hyper rapide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    void  CompactDatabase(AnsiString Base1, AnsiString psw1, AnsiString Base2, AnsiString psw2)
    {
     
    	   AnsiString  Provider1=	"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Base1 + ";Password =" + psw1;
    	   AnsiString  Provider2=	"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Base2 + ";Password =" + psw2;
     
    	   Variant  v=Variant::CreateObject("JRO.JetEngine");
    	   v.OleFunction("CompactDatabase",  Provider1.c_str(), Provider2.c_str());
     
    	  v = Unassigned;
    }
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    		 AnsiString  Base1="C:\\Documents and Settings\\Fernand Bartolo\\Dev\\Testxxxxxx\\Iris.mdb";
    		 AnsiString  psw1="";
     
    		 AnsiString  Base2="C:\\Documents and Settings\\Fernand Bartolo\\Dev\\Testxxxxxx\\Test.mdb";
    		 AnsiString  psw2="";
     
     
    		 if  (FileExists(Base2))
    				 DeleteFile(Base2);
    		 CompactDatabase(Base1,psw1,Base2,psw2);
    		 ShowMessage("OK!!");
    }
    //---------------------------------------------------------------------------

  10. #10
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    C'est super je suis comptant pour toi, je pense que le code devrait etre propose pour la FAQ.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  11. #11
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je pense qu'il faut remplacer v.Clear( ); par v = Unassigned; comme dans la Doc Delphi.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    D'après ce que j'ai pu lire c'est la même chose.

    J'ai vérifié avec CodeGuard, il n'y a pas de fuite mémoire (même en enlevant la ligne consernée).

    Mais je pense que ta solution est plus adaptée car documentée, je modifie de suite.

    Merci

  13. #13
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 81
    Points
    81
    Par défaut Une petite merveille!
    Excellent code!

    Merci!

    ciao

    antoine

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment ouvrir une base vide avec OleADO sans Access
    Par blondelle dans le forum C++Builder
    Réponses: 12
    Dernier message: 06/03/2007, 13h34
  2. Comment créer une base utilisable sur PC sans ACCESS
    Par lesalloues dans le forum Runtime
    Réponses: 4
    Dernier message: 22/08/2006, 14h52
  3. Connexion à une base de données mysql via access
    Par eautret dans le forum Access
    Réponses: 2
    Dernier message: 07/04/2006, 10h02
  4. Peut-on manipuler une base de donnée oracle sans oracle
    Par sillycoder dans le forum Oracle
    Réponses: 8
    Dernier message: 19/01/2006, 09h00
  5. compresser une base de donnée
    Par mic79 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/02/2005, 11h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo