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 :

Probleme pour creer les champs d'une table OleADO


Sujet :

C++Builder

  1. #1
    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 Probleme pour creer les champs d'une table OleADO
    bonjours:
    Je rencontre un probleme lors de la creation d'une table complexe au niveau des parametres, je n'ai pas reussi a trouver d'explication dans les differentes documentations disponibles sur le site chez nos amis Delphinotes
    Le 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
    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
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include <ComObj.hpp>
    #include "Ouvrir_Base_Vide.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // ne pas oublier d'inclure #include <comobj.hpp>
    Variant vADO;
    AnsiString Filename = "C:\\Documents and Settings\\blondelle\\Mes documents\\BASES\\maBdd26.mdb";
    if (FileExists(Filename.c_str()))
      {
    DeleteFile(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 ADOConnection
            ADOConnection1->ConnectionString = provider;
            ADOConnection1->LoginPrompt = false;
            ADOCommand1->Connection = ADOConnection1;
    // on cree une table vide au Nom Essai
            AnsiString nom_table = "CREATE TABLE Essai (VALEUR TEXT(50))";
            ADOCommand1->CommandText = nom_table;
            ADOCommand1->Execute();
    // on cree les entetes de trois colonnes authorname, email, web dans une table au nom Authors
            AnsiString nomTable_colonnes = "CREATE TABLE Authors (authorname TEXT(50),email TEXT(50),web TEXT(50))";
            ADOCommand1->CommandText = nomTable_colonnes;
            ADOCommand1->Execute();
    // on cree une clef primaire dans la table Essai VALEUR contient la clef primaire
            AnsiString clef = "CREATE INDEX idxPrimary ON Essai (VALEUR) WITH PRIMARY";
            ADOCommand1->CommandText = clef;
            ADOCommand1->Execute();
    // on cree une clef primaire dans la table Authors authorname contient la clef primaire
            AnsiString clef1 = "CREATE INDEX idxPrimary ON Authors (authorname) WITH PRIMARY";
            ADOCommand1->CommandText = clef1;
            ADOCommand1->Execute();
    // ici erreur
    // on cree une nouvelle table avec des paramettres
    AnsiString parametres = "CREATE TABLE Applications (Name TEXT(50),Description TEXT(50),Author TEXT(50) CONSTRAINT idxauthor REFERENCES Authors (authorname), Type TEXT(50) CONSTRAINT idxtype REFERENCES Types (typename),[Size] FLOAT,Cost CURRENCY, DateUpl DATETIME, Picture LONGBINARY)";
    ADOCommand1->CommandText = parametres;
    ADOCommand1->Execute();
    // en quittant on libere les Variant
    vADO = Unassigned;
    }
    L'erreur arrive lors de l'execution de "ADOCommand1->Execute();" et j'ai le message Table ou contrainte non trouvee je met le code Delphi qui me sert de modele.
    Le 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
     
     cs:='CREATE TABLE Applications ('+
         '  Name TEXT(50),'+
         '  Description TEXT(50),'+
         '  Author TEXT(50) CONSTRAINT idxauthor '+
         'REFERENCES Authors (authorname),'+
         '  Type TEXT(50) CONSTRAINT idxtype '+
         'REFERENCES Types (typename),'+
         '  [Size] FLOAT,'+
         '  Cost CURRENCY,'+
         '  DateUpl DATETIME,'+
         '  Picture LONGBINARY)';
     ADOCommand1.CommandText := cs;
     ADOCommand1.Execute;

  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
    Normalement c'est une requête donc Delphi ou C++ c'est pareil ??

    Méfis toi des types, cet exemple est sur quelle base de donnée ??

    car à vérifier mais DATETIME n'est plus supporté sous Access.

    Fais ta requête sous Access (si c'est le cas) et ce sera plus simple à trouver ou cela pêche..

    Bientôt tu nous fait un Tutoriel/Faq ADO toi ...

  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
    Merci pour ta reponse Fbartolo:
    La base est cree sans Access est ce que DateTime peut etre quand meme supporte?
    Je ne sais pas me servir d'Access quand a tester une requette
    Je me sert essentiellement des exemples pour travailler.

  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
    Bon après vérification sous Access pas de Pb de type de données mais de lien avec les Index (car moi j'ai pas créer les autres table avant),
    La syntaxe semble correcte mais vérifie bien que tes autres champs sont indexé dans les autres tables avant de lancer cette resquête; pour info:
    Syntaxe
    Contrainte monochamp :

    CONSTRAINT name {PRIMARY KEY | UNIQUE | NOT NULL |
    REFERENCES tableétrangère [(champétranger1, champétranger2)]
    [ON UPDATE CASCADE | SET NULL]
    [ON DELETE CASCADE | SET NULL]}

    Contrainte multichamp :

    CONSTRAINT nom
    {PRIMARY KEY (primaire1[, primaire2 [, ...]]) |
    UNIQUE (unique1[, unique2 [, ...]]) |
    NOT NULL (nonnull1[, nonnull2 [, ...]]) |
    FOREIGN KEY [NO INDEX] (ref1[, ref2 [, ...]]) REFERENCES tableétrangère [(champétranger1 [, champétranger2 [, ...]])]
    [ON UPDATE CASCADE | SET NULL]
    [ON DELETE CASCADE | SET NULL]}

    La clause CONSTRAINT se compose des éléments suivants :

    Élément Description
    nom Nom de la contrainte à créer.
    primaire1, primaire2 Nom du ou des champs à spécifier commeclé primaire.
    unique1, unique2 Nom du ou des champs à spécifier comme clé unique.
    nonnull1, nonnull2 Nom du ou des champs ne devant pas contenir la valeurNull.
    ref1, ref2 Nom du ou des champs declé étrangère faisant référence à des champs d'une autre table.
    tableétrangère Nom de latable étrangère contenant le ou les champs spécifiés par champétranger.
    champétranger1, champétranger2 Nom du ou des champs de la table_étrangère spécifiée(s) par réf1, réf2. Vous pouvez omettre cette clause si le champ faisant l'objet de la référence constitue la clé primaire de table_étrangère.


    Notes
    Utilisez la syntaxe d'une contrainte monochamp dans la clause de définition de champ d'une instruction ALTER TABLE ou CREATE TABLE immédiatement après la spécification du type de données du champ.

    Utilisez la syntaxe d'une contrainte multichamp chaque fois que vous utilisez lemot reservé CONSTRAINT hors d'une clause de définition de champ dans une instruction ALTER TABLE ou CREATE TABLE.

    CONSTRAINT permet de définir un des types de contraintes suivants pour un champ :

    Vous pouvez utiliser le mot réservé UNIQUE pour définir un champ comme clé unique. Cela signifie que deux enregistrements de la table ne peuvent pas avoir la même valeur dans ce champ. Vous pouvez contraindre n'importe quel champ ou liste de champs à être unique. Si un index multichamp est défini comme clé unique, les valeurs combinées de tous les champs de l'index doivent être uniques, même si plusieurs enregistrements ont la même valeur dans un seul des champs.
    Vous pouvez utiliser les mots réservésPRIMARY KEY pour définir un champ ou une plage de champs sur une table comme clé primaire. Toutes les valeurs de la clé primaire doivent être uniques et non Null et vous ne pouvez définir qu'une seule clé primaire par table.
    --------------------------------------------------------------------------------

    Remarque Ne définissez pas une contrainte PRIMARY KEY sur une table disposant déjà d'une clé primaire; cette opération provoque une erreur.
    Au pire si tu ne t'en sort pas envoie ta base déja créée avec les autres table et je te ferais un debug sous accès pour cette requête.

  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
    Si j'ai bien compris en creeant cette table, je fais reference aux deux autres tables crees precedement
    Pour ce qui est de la base, tu a tout le code dans le Post, la base est recree a chaque lancement, et vide elle ne sert que pour tester le code.

  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
    C'est ça en mettant des liens entres les index, si tu retire ça, cela marche, je considère donc que l'erreur est là dedant (ce qui n'est pas très explicite dans le code erreur, mais Access donne le même)

  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
    Le but recherche c'est de creer cette base, puis d'y sauvegarder une base de travail suite a ton post, dans la semaine je vais chercher un livre sur ADO, afin de voir s'il y a quelque chose sur les transferts de Table.

  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
    Points : 3 766
    Points
    3 766
    Par défaut
    Grace a tes explications Fbartolo j'ai reussi a trouver mon erreur, j'ai modifie des nom de champ lors des testes, et evidemment c'est la que se trouvait l'erreur, je n'avais pas compris qu'en creant cette nouvelle table je faisait reference aux autres tables.
    Le code fonctionnel:
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include <ComObj.hpp>
    #include "Ouvrir_Base_Vide.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // ne pas oublier d'inclure #include <comobj.hpp>
    Variant vADO;
    AnsiString Filename = "C:\\Documents and Settings\\blondelle\\Mes documents\\BASES\\maBdd26.mdb";
    if (FileExists(Filename.c_str()))
      {
    DeleteFile(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 ADOConnection
            ADOConnection1->ConnectionString = provider;
            ADOConnection1->LoginPrompt = false;
            ADOCommand1->Connection = ADOConnection1;
    // on cree une table vide au Nom Essai
            AnsiString nom_table = "CREATE TABLE Essai (VALEUR TEXT(50))";
            ADOCommand1->CommandText = nom_table;
            ADOCommand1->Execute();
    // on cree les entetes de trois colonnes authorname, email, web dans une table au nom Authors
            AnsiString nomTable_colonnes = "CREATE TABLE Authors (authorname TEXT(50),email TEXT(50),web TEXT(50))";
            ADOCommand1->CommandText = nomTable_colonnes;
            ADOCommand1->Execute();
    // on cree une clef primaire dans la table Essai VALEUR contient la clef primaire
            AnsiString clef = "CREATE INDEX idxPrimary ON Essai (VALEUR) WITH PRIMARY";
            ADOCommand1->CommandText = clef;
            ADOCommand1->Execute();
    // on cree une clef primaire dans la table Authors authorname contient la clef primaire
            AnsiString clef1 = "CREATE INDEX idxPrimary ON Authors (authorname) WITH PRIMARY";
            ADOCommand1->CommandText = clef1;
            ADOCommand1->Execute();
    // on cree une nouvelle table avec des paramettres et en faisant reference
    // au deux autres tables crees precedemment
    AnsiString parametres = "CREATE TABLE Applications (Name TEXT(50),Description TEXT(50),Author TEXT(50) CONSTRAINT Author REFERENCES Authors (authorname), Type TEXT(50) CONSTRAINT Type REFERENCES Essai (VALEUR),[Size] FLOAT,Cost CURRENCY, DateUpl DATETIME, Picture LONGBINARY)";
    ADOCommand1->CommandText = parametres;
    ADOCommand1->Execute();
    // en quittant on libere les Variant
    vADO = Unassigned;

  9. #9
    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
    Il me reste un petit probleme comment peut on faire pour que la chaine soit plus lisible si possible sur plusieurs lignes comme le code Delphi.

  10. #10
    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
    de la même façon, après la virgule tu vas à la ligne (t'es pas obligé de fermer ta chaine et rajouter un +)

    Ou sinon tu fais une concaténation de chaine avec <Parametre += " xxx", n'oublis pas les espaces..

  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
    j'ai utilise "Parametre += " je n'ai pas su autrement
    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // on cree une nouvelle table avec des paramettres et en faisant reference
    // au deux autres tables crees precedemment
    AnsiString parametres = "CREATE TABLE Applications (Name TEXT(50),";
    parametres += "Description TEXT(50),";
    parametres += "Author TEXT(50) CONSTRAINT Author REFERENCES Authors (authorname),";
    parametres += "Type TEXT(50) CONSTRAINT Type REFERENCES Essai (VALEUR),";
    parametres += "[Size] FLOAT,";
    parametres += "Cost CURRENCY,";
    parametres += "DateUpl DATETIME,";
    parametres += "Picture LONGBINARY)";
    ADOCommand1->CommandText = parametres;
    ADOCommand1->Execute();
    J'ai trouve un lien qui semble interressant sur MSND "dommage en anglais"
    Le lien:

  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
    Effectivement, il y a bien un exemple dessus, je téléchargerais demain MDAC 2.8 pour voir cet exemple

  13. #13
    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
    Bon, c'est très intéressant mais complexe et en plus je ne possède pas Visual C++ pour tester leurs exemples.

    J'en reste là pour l'instant, ma methode loin d'être parfaite est plus simple.

  14. #14
    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:
    Apres mes recherches sur MSND j'ai trouve un site ou il y a des exemples je place trois liens qui me semblent interressent mais en anglais.
    Ce site parait bien fourni en exemples.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/02/2014, 15h22
  2. [AC-2003] Modifier un champ pour tous les enregistrement d'une table
    Par Meph-Dev dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 15/06/2009, 08h41
  3. Réponses: 8
    Dernier message: 29/06/2006, 15h37
  4. Probleme de requete pour remplir les champs d'une table
    Par Jim_Nastiq dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/04/2006, 14h56
  5. afficher tous les champs d'une table
    Par julio84 dans le forum ASP
    Réponses: 8
    Dernier message: 19/01/2005, 10h31

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