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 :

Connexion ADO avec Access sous C++ Builder XE3 [Base de donnée]


Sujet :

C++Builder

  1. #1
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut Connexion ADO avec Access sous C++ Builder XE3
    Bonjour à tous

    J'essaye de créer une base de données Acess directement dans mon programme si celle-ci n'existe pas et de me connecter dessus ou alors de me connecter directement dessus si celle-ci existe déjà.

    J'utilise ce qu'on m'avait conseillé dans un autre Post ;

    http://www.developpez.net/forums/d92...2009-p-pb-ado/

    Seulement depuis ce post j'ai évoluer en version de C++ builder et maintenant sous XE3 j'ai un message d'erreur me disant Base de données déjà existante alors que le fichier mdb n'existe pas

    Est-ce que quelqu'un aurait une solution

    Merci d'avance pour votre aide

  2. #2
    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
    Par défaut
    Salut kurul1
    Quelle version d'Access utilise tu, si je ne me trompe pas la Version 2010 n'a plus le meme provider, mais Access peut acceder aux versions Anciennes,
    Avec X3 il ne faut pas oublier l'Unicode qui donne des soucis lors du passage des chaines, essaie avec ( WideString( ma chaine) )

  3. #3
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Merci pour ta réponse blondelle

    Tu as surement trouvé la solution, C'est avec Access 2010, j'ai changé de C++ Builder mais aussi d'acess

    Après normalement on est pas obligé d'avoir Access sur son PC pour ce que cela fonctionne non ?

    Je vais essayer avec ce que tu m'as proposé

  4. #4
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Après la modification, j'ai une Fatal Erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ilink32 Erreur] Fatal: Impossible d'ouvrir le fichier 'VID窞瘨獲Ƿ웢E.OBJ'
    avec ce 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
    17
    18
    19
     
    // Méthode chargée de la création de la base
    void __fastcall TBaseDonnees::CreationBaseDonnees(void)
    {
    	// Provider
    	String Provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + CheminAcces +";";
     
    	ShowMessage("Provider : " + Provider);
     
    	// Variable pour la création de la base de données
    	Variant vADO;
     
    	// On crée la base de données
    	vADO = Variant::CreateObject("ADOX.Catalog");
    	vADO.OleFunction("create", WideString(Provider));
     
    	// on termine
    	vADO = Unassigned;
    }
    CheminAcces est connu par la fonction car c'est une variable de classe

  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
    Par défaut
    J'ai eu quelques probleme a la creation d'une base avec Access 2010,mais je ne me souviens plus de la solution trouvee, mais j'avais galeré un bon moment, si tu cree une base avec l'ancien provider tu pourra lire ta base sur les anciennes version d'Access, mais ce n'est pas possible avec le nouveau provider qui ne reconnait que 2010, regarde dans l'aide d'Access

  6. #6
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Après moi si je ne lit pas la base dans access 2010 ca ne me gène pas, moi je veux travailler sur la base dans mon logiciel.

    Mais avec l'ancien provider ca ne fonctionne pas non plus car comme je te dit plus haut, ca me marque la base existe déjà et le fichier mdb n'est pas créé alors qu'il n'existe pas

    Je vais regarder si je trouve le chemin du nouveau provider

  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
    Par défaut
    J'ai retrouve mon code teste
    le .h
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ADODB.hpp>
    #include <DB.hpp>
    #include <DBGrids.hpp>
    #include <Grids.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
            TButton *Button1;
            TADOConnection *ADOConnection1;
            TADOCommand *ADOCommand1;
            TADOTable *ADOTable1;
            TEdit *Edit1;
            TEdit *Edit2;
            TADOQuery *ADOQuery1;
            TDataSource *DataSource1;
            TEdit *Edit3;
            TEdit *Edit4;
            TDBGrid *DBGrid1;
            TEdit *Edit5;
            TEdit *Edit6;
            void __fastcall Button1Click(TObject *Sender);
    private: // User declarations
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    le .cpp
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //dabord tester si la base existe, si non creer la base
     
    // "INITIALISATION DE LA BASE DE DONNEES DOSSIERS DE SOCIETE";
    Variant vADO;
    // chemin de la base extension jusque 2003 .mdb extension apres 2003 .accdb
    AnsiString FileName = ExtractFilePath(Application->ExeName)+"maBdd.mdb";
    // teste d'existance de la base
    if (FileExists(FileName.c_str()))
      {
    Form1->ADOConnection1->Connected = false;
    Form1->ADOConnection1->Close();
    DeleteFile(FileName);
      }
    // "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+FileName+";";   jusque 2003
    // "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+FileName+";";  apres 2003
    // on cree une base Access sans Access vide
    //AnsiString provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+FileName+";";
    AnsiString provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+FileName+";";
    vADO = Variant::CreateObject("ADOX.Catalog");
    vADO.OleFunction("create", provider.c_str());
    //===========================
    // on connecte avec ADOConnection
            Form1->ADOConnection1->ConnectionString = provider;
            Form1->ADOConnection1->LoginPrompt = false;
            Form1->ADOCommand1->Connection = Form1->ADOConnection1;
    //===========================
    // on cree une Table vide au nom de Dossier
            Form1->ADOCommand1->CommandText = "CREATE TABLE Dossier";
            Form1->ADOCommand1->Execute();
    //===========================
    // on cree le champ ID_Ste defini comme compteur
            Form1->ADOCommand1->CommandText = "ALTER TABLE Dossier ADD ID_Ste COUNTER";
            Form1->ADOCommand1->Execute();
    // on defini le champ compteur ID_Ste en clef primaire
            Form1->ADOCommand1->CommandText = "CREATE UNIQUE INDEX idxPrimary ON Dossier (ID_Ste) WITH PRIMARY";
            Form1->ADOCommand1->Execute();
    // on groupe les champs par Bevel
    // pour le type BOOLEAN utiliser YESNO
            AnsiString ChampSte;
            ChampSte = "ALTER TABLE Dossier ADD Instance YESNO,";
            ChampSte += "Gestdos YESNO";
            Form1->ADOCommand1->CommandText = ChampSte;
            Form1->ADOCommand1->Execute();
            ChampSte = "ALTER TABLE Dossier ADD nom TEXT(15)";
            Form1->ADOCommand1->CommandText = ChampSte;
            Form1->ADOCommand1->Execute();
    // types de champs INTEGER YESNO TEXT(15)
    // connecte DBGrid
    // DBGrid1->Columns->Add();
    DBGrid1->DataSource = DataSource1;
    //TColumn *ColumnA = new TColumn();
    //ColumnA = DBGrid1.Columns.Add;
    // ecrire dans la table
    Form1->ADOTable1->Connection = Form1->ADOConnection1;
            Form1->ADOConnection1->Connected = true;
            Form1->ADOTable1->TableName = "Dossier";
            Form1->ADOTable1->Active = true;
            Form1->DataSource1->DataSet = Form1->ADOTable1;
    // on se place sur le dernier enregistrement
    Form1->ADOTable1->Last();
    //Form1->ADOQuery1->Last();
    // on insert un enregistrement
    Form1->ADOTable1->Insert();    // Form1->ADOTable1->Append();
    //Form1->ADOQuery1->Insert();
    Form1->ADOTable1->FieldByName("Instance")->Value = Edit1->Text;
    //Form1->ADOQuery1->FieldByName("Instance")->Value = Edit1->Text;
    Form1->ADOTable1->FieldByName("Gestdos")->Value = Edit2->Text;
    //Form1->ADOQuery1->FieldByName("Gestdos")->Value = Edit2->Text;
    Form1->ADOTable1->FieldByName("nom")->Value = Edit5->Text;
    //Form1->ADOQuery1->FieldByName("nom")->Value = Edit5->Text;
    // on ecrit dans la table
    Form1->ADOTable1->Post();
    //Form1->ADOQuery1->Post();
    // on affiche un enregistrement
    Form1->Edit3->Text = (Form1->ADOTable1->FindField("Instance")->AsString);
    Form1->Edit4->Text = (Form1->ADOTable1->FindField("Gestdos")->AsString);
    Form1->Edit6->Text = (Form1->ADOTable1->FindField("nom")->AsString);
    }
    //---------------------------------------------------------------------------
    ca fonctionne avec BCB6, Access 2010, Window7

  8. #8
    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
    Par défaut
    Attention l'extension de ta base doit etre " .accdb " et non " .mdb "

  9. #9
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Merci pour ton aide

    La création de la base se passe bien et il fallait bien utiliser WideString pour passer le provider.
    Mon erreur venait du fait que j'ai testé autre chose comme connexion et que je ne l'avais pas enlevé.

    Maintenant mon souci, c'est la création des tables.
    Je cherche à créer une table avec une clé Primaire entière auto incrémentée et cela ne passe pas. Vive Microsoft qui n'en fait qu'a sa sauce et ne respecte pas les standards SQL. Pourquoi faire simple alors qu'on peut faire compliqué.

    Dans mon logiciel précédent pour créer une table j'utilisais cette syntaxe pour les requêtes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE TABLE Groupe (idGroupe COUNTER, Groupe TEXT(10))
    Ca ne passe pas sous Access 2010 j'ai une erreur sur le COUNTER.

    en cherchant un peut j'ai trouvé qu'on pouvait mettre AUTONUMBER mais sans résultat, erreur également.

    Aurais-tu une solution

  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
    Par défaut
    Dans le code propose il y a ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // on defini le champ compteur ID_Ste en clef primaire
            Form1->ADOCommand1->CommandText = "CREATE UNIQUE INDEX idxPrimary ON Dossier (ID_Ste) WITH PRIMARY";
            Form1->ADOCommand1->Execute();
    le code poste cree les tables et les champs
    ca t'aidera peut etre

  11. #11
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Qu'est ce que c'est pénible de devoir chercher une syntaxe alors que cela pourrait être tellement simple

    Pour ceux que cela intéresse pour créer une table avec un id Auto-incrémenter, voici la syntaxe en SQL pour acess 2010

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      CREATE TABLE Groupe(idGroupe AUTOINCREMENT, Groupe  TEXT(10), CONSTRAINT HemiparesiePk PRIMARY KEY (idHemiparesie))
    Merci pour ton aide Blondelle

  12. #12
    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
    Par défaut
    Pas de quoi
    Si c'était facile programmer perdrait tout son interet

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

Discussions similaires

  1. connexion ado avec acces et besoin d'aide pour code vb svp
    Par essse dans le forum Visual Studio
    Réponses: 0
    Dernier message: 06/03/2009, 09h57
  2. Delphi 7 avec Access sous Vista
    Par tomy29 dans le forum EDI
    Réponses: 4
    Dernier message: 19/12/2007, 13h25
  3. connexion PostgreSql avec Access et VB
    Par Jertho dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 19/08/2007, 22h35
  4. Executer une procédure Access sous C++Builder
    Par kmaniche dans le forum C++Builder
    Réponses: 38
    Dernier message: 19/12/2006, 14h27
  5. Plantage requete SQL simple sous Delphi7/ADO avec Access
    Par tomy29 dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/08/2005, 11h09

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