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 :

ADO et valeur par default dans access [Base de donnée]


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 63
    Par défaut ADO et valeur par default dans access
    Bonjour,

    Alors je crée une table access via des requêtes SQL et des TADOCOmmand.
    Seulement je voudrais aussi quand je crée mes champs leur affecter une valeur par défaut.
    J'ai vu que Access n'acceptait pas le mot clef default dans les requête SQL.
    Je cherche donc un moyen de le faire via ADO mais je ne trouve pas.
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 071
    Par défaut
    Tu devrais regarder ce que propose ADOX.Catalog, Tables, Fields ou Columns pour arriver enfin à Property.Value

    le tout en OLEVariant, c'est pénible à écrire avec OlePropertyGet et OlePropertySet

    ça doit ressembler à
    [code purement théorique]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      Variant ADOXCatalog = Variant::CreateObject("ADOX.Catalog");
      ADOXCatalog.OlePropertySet("ActiveConnection", ADOConnection); // un TADOConnection
     
      Variant TablesCollection  = ADOXCatalog.OlePropertyGet("Tables");
      Variant TableItem         = TablesCollection.OlePropertyGet("Item",TableName.c_str()); // TableName est un String
      Variant ColumnsCollection = TableItem.OlePropertyGet("Columns");
      Variant ColumnItem        = ColumnsCollection.OlePropertyGet("Item",Field.Name.c_str()); // Field est un TField
      Variant Properties        = ColumnItem.OlePropertyGet("Properties");
      Variant PropertyItem      = Properties.OlePropertyGet("Item", "Value");
      ShowMessage(PropertyItem); // si le Variant l'autorise, cela converti la valeur en chaine et l'affiche
      Properties.OlePropertySet("Item", NewValue); // NewValue un variant contenant la nouvelle valeur
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 63
    Par défaut
    Merci beaucoup pour ces infos et oui effectivement j'ai chois de passer par ADOX. En fait j'ai importé le "package ADOX" et donc C++ Xe m'a génére des classe de wrappers pour pouvoir utilisé ADOX.
    Seulement j'ai un souci le code fonctionne seulement à la fin quand je regarde dans ma base sous access les tables que j'ai voulu ajouter n'existe pas!!
    Du code simplifié ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define PROVIDER_SOURCE "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    UnicodeString Provider  = PROVIDER_SOURCE + Filename; 
    Olevariant Prov = Provider;
      TADOXCatalog *Catalog = new TADOXCatalog(NULL);
      Catalog->set_ActiveConnection(Prov);
      Catalog->Connect();
     
      Catalog->Tables->Append((OleVariant)"TOTO");
      Catalog->InitServerData();
      Catalog->Disconnect();
    Je ne comprends pas pourquoi il doit me manquer quelque chose genre un Catalog->Save mais cette fonction n'existe pas !!!

  4. #4
    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
    Si tu utilise les composants ADO pour quoi ne pas faire comme ceci
    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
     
    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 DossierSociete
            Form1->ADOCommand1->CommandText = "CREATE TABLE DossierSociete";
            Form1->ADOCommand1->Execute();
    // on cree le champ ID_Ste defini comme compteur
            Form1->ADOCommand1->CommandText = "ALTER TABLE DossierSociete 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 DossierSociete (ID_Ste) WITH PRIMARY";
            Form1->ADOCommand1->Execute();
    AnsiString ChampSte;
    // on defini un champ texte TEXT(NB caracteres)
            ChampSte = "ALTER TABLE DossierSociete ADD NomRaison TEXT(50),";
            Form1->ADOCommand1->CommandText = ChampSte;
            Form1->ADOCommand1->Execute();
    // on defini un champ int
            ChampSte = "ALTER TABLE DossierSociete ADD NoClass INTEGER,";
            Form1->ADOCommand1->CommandText = ChampSte;
            Form1->ADOCommand1->Execute();
    // on defini un champ bool
            ChampSte = "ALTER TABLE DossierSociete ADD Instance YESNO,";
            Form1->ADOCommand1->CommandText = ChampSte;
            Form1->ADOCommand1->Execute();

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 63
    Par défaut
    Tout bêtement parce que les composants ADO ne permettent d’accéder aux propriétés des tables comme la valeur par défaut par ex.
    Et Access n'accepte pas le mot clef DEFAULT en SQL. Donc si je veux définir une valeur par défaut je n'ai pas le choix je dois passer par ADOX.
    Sinon pour enregistrer la table dans mon catalogue ADOX j'ai aussi essayé le code qui suit mais cela n'as pas l'air de marcher beaucoup mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      OleVariant TableOle = (IDispatch*) TableToAdd->GetDefaultInterface();
      Catalog->Tables->Append(TableOle);
      Catalog->Disconnect();
    Mais ça ne marche pas non plus aucune table n'est ajouté à la base qui pourtant est bien crée.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 071
    Par défaut
    as-tu essayé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      TADOXCatalog *Catalog = new TADOXCatalog(NULL);
      Catalog->ActiveConnection = ADOConnection1; // un TADOConnection
     
    Catalog->Tables->Item[TableName]->Columns ...
    Car la propriété ActiveConnection accete un objet Connection et non une chaine !

    Pour l'import de ADOX, as-tu suivi cette méthode de http://delphi.about.com

    To use ADOX in Delphi, you should establish a reference to the ADOX type library.
    1. Select Project | Import Type Library
    2. Choose "Microsoft ADO Ext 2.x for DDL and Security (Version 2.x)"
    3a. Change "TTable" to "TADOXTable"
    3b. Change "TColumn" to "TADOXColumn"
    3c. Change "TIndex" to "TADOXIndex"
    3d. Change "TKey" to "TADOXKey"
    3e. Change "TGroup" to "TADOXGroup"
    3f. Change "TUser" to "TADOXUser"
    3g. Change "TCatalog" to "TADOXCatalog"
    4. Press Install button (rebuilding packages)
    5. Press OK once and Yes twice
    6. File | Close All | Yes
    Sinon Append réclame comme paramètre une interface Table, il faut utiliser un TADOXTable et l'instancier avec Create et non un simple OleVariant casté !
    Tu dois en théorie pouvoir écrire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      TADOXTable TableOle = new TADOXTable();
      TableOle->Columns->Append( "Column1", adInteger);
      Catalog->Tables->Append(TableOle);
      Catalog->Disconnect();
    voir le neccessité d'un delete TableOle ou l'utilisation de DelphiInterface
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 63
    Par défaut
    Bon j'ai réussi à résoudre ce problème de nom de table tout simplement en mettant le nom dans une OleVaraint et je passe le OleVariant plutôt que le pointeur sur la chaîne.

    oui mais en fait Item n'est pas accessible.
    J'ai accès à get_item. Et là j'arrive à récupérer la Table ou le champ désiré.
    sinon pour info si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     UnicodeString ne = "TOTO3";
      // Ouverture de la connexion à la base
      Prov = Provider;
      Catalog->set_ActiveConnection(Prov);
      Catalog->Connect();
     
      TableToAdd->Name = ne.t_str();
     
      TableOle = (IDispatch*) TableToAdd->GetDefaultInterface();
      Catalog->Tables->Append(TableOle);
      Catalog->Disconnect();
    J'ai bien une table de créer, par contre mon souci c'est que au lieu de s'appeler "TOTO3" elle ne s’appelle que "TO" je ne comprends pas pourquoi cela ne prends que les deux premiers caractères.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 63
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    as-tu essayé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      TADOXCatalog *Catalog = new TADOXCatalog(NULL);
      Catalog->ActiveConnection = ADOConnection1; // un TADOConnection
     
    Catalog->Tables->Item[TableName]->Columns ...
    Je vais essayer avec un connection ADO en paramètres même si j'arrive quand même bien à accéder à la base en passant une chaine.

    Citation Envoyé par ShaiLeTroll Voir le message
    Pour l'import de ADOX, as-tu suivi cette méthode de http://delphi.about.com
    Alors oui j'ai suivi exactement ce qui est dit du moins j'ai fait la même sur C++ builder XE
    Menu Composant
    Importer un composant
    Importer une bibliothèque de types
    "Microsoft ADO ExT. 2.8 for DLL and Security"
    puis j'ai effectivement changer les noms de classe et générer les wrappers.

    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon Append réclame comme paramètre une interface Table, il faut utiliser un TADOXTable et l'instancier avec Create et non un simple OleVariant casté !
    Tu dois en théorie pouvoir écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      TADOXTable TableOle = new TADOXTable();
      TableOle->Columns->Append( "Column1", adInteger);
      Catalog->Tables->Append(TableOle);
      Catalog->Disconnect();
    Alors en fait non je ne peux pas écrire ce code car Append attend un tagVariant Item. Voilà, pourquoi je fait un cast. Car il ne sait pas transformer mon TADOXTable en variant.

    Citation Envoyé par ShaiLeTroll Voir le message
    voir le neccessité d'un delete TableOle ou l'utilisation de DelphiInterface

    La dessus je crois que je suis d'accord avec toi !!
    Je vais essayer avec un new pour chaque création de table et chaque column puis un delete.

    En tout cas merci beaucoup pour tes réponses et les différents pistes que tu me propose.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 63
    Par défaut
    Bon aprés quelques tests si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     // Création d'une Table
      OleVariant Name;
      OleVariant ColName;
      TADOXTable *TableToAdd = new TADOXTable(NULL);
      Name =  DesTab->Nom;
      TableToAdd->Name = Name;
     
      TableOle = (IDispatch*) TableToAdd->GetDefaultInterface();
      Catalog->Tables->Append(TableOle);
      delete TableToAdd;
      Catalog->Disconnect();
    J'arrive à créer toutes mes tables avec les bons noms de table.

    Par contre si je fais :
    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
     
     // Création d'une Table
      OleVariant Name;
      TADOXTable *TableToAdd = new TADOXTable(NULL);
      Name =  DesTab->Nom;
      TableToAdd->Name = Name;
     
     for(int chp=0; chp < NbChamps; chp++)
      {
    	ColName = Nom[NbChamps];
    	    TableToAdd->Columns->Append(ColName,TypeADOX,Taille);
      } 
     
      TableOle = (IDispatch*) TableToAdd->GetDefaultInterface();
      Catalog->Tables->Append(TableOle);
      delete TableToAdd;
      Catalog->Disconnect();
    Alors là cela ne fonctionne plus!!!!!!! Aucune Table n'est crée !!!!
    Je vais quand même pas être obligé de créer toutes les tables puis ensuite de récupérer ma table et de lui ajouter les champs qui vont bien !!!

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 63
    Par défaut
    Pour ceux que ça intéresse j'arrive finalement a créer mes tables et mes colonnes.
    Le problème des mes colonnes venait du fait que "je suppose" ACCESS n'accepte pas le type adBigInt de ADOX
    http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx
    En remplaçant tous les adBigInt par des adInteger là ça fonctionne !!!
    Et en regardant sous ACCESS j'ai bien des entier long!!! Va savoir Charles.

    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
     
      // Ouverture de la connexion à la base
      Prov = Provider;
      Catalog->set_ActiveConnection(Prov);
      Catalog->Connect();
     
      TableName = Nom;
      TableToAdd->Name = TableName;
      for(int chp=0; chp < ChampsCount; chp++)
      {
     
    	ColName = Nom[chp];
    	TableToAdd->Columns->Append(ColName,TypeADOX[chp],Taille[chp]);
      }
      TableOle = (IDispatch*) TableToAdd->GetDefaultInterface();
      Catalog->Tables->Append(TableOle);
      delete TableToAdd;
      Catalog->Disconnect();

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

Discussions similaires

  1. [CakePHP] [CakePHP] Valeur par default dans un champ d'un formulaire
    Par rooma dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 20/10/2009, 21h46
  2. Recuperer une "valeur par default" dans une table
    Par Conico113 dans le forum IHM
    Réponses: 7
    Dernier message: 05/03/2008, 14h13
  3. valeur par défaut dans ACCESS
    Par RogerCls dans le forum Access
    Réponses: 4
    Dernier message: 19/09/2007, 15h05
  4. Valeur par default dans ma JComboBox
    Par iutcien dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 13/04/2006, 16h19
  5. Valeur par default dans un input file ?
    Par alainme dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 11/02/2005, 14h31

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