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

Bases de données Delphi Discussion :

Meta-data BDD Access


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut Meta-data BDD Access
    Bonjour,

    j'aimerai savoir comment récupérer les types des champs d'une base de données Access. J'utilise le composant ZeosLib avec le module ZSQLMetadata mais il semble que celà ne fonctionne pas avec ce type de BDD

  2. #2
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par sam-sam Voir le message
    Bonjour,

    j'aimerai savoir comment récupérer les types des champs d'une base de données Access. J'utilise le composant ZeosLib avec le module ZSQLMetadata mais il semble que celà ne fonctionne pas avec ce type de BDD
    Pourquoi ne pas utiliser les composants ADO ?

    Avec un simple ADOCommand tu pourrais facilement récupéré ces infos et plein d'autre.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut
    Je voulais éviter d'utiliser plusieurs composants (car je dois aussi me connecter à une base Firebird) mais je vais regarder du côté du composant ADO si tu me dis que c'est possible

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut
    J'ai pas mal recherché sur Internet mais je n'ai pas trouvé la solution pour extraire les metadata de ma base Access via ADO...est-ce que tu serais le faire BuzzLeclaire ?

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par sam-sam Voir le message
    J'ai pas mal recherché sur Internet mais je n'ai pas trouvé la solution pour extraire les metadata de ma base Access via ADO...est-ce que tu serais le faire BuzzLeclaire ?
    Oui biensur attention ce n'est pas simple, cela m'a pris quelques jours voir semaine avant de sortir cela, je comprends que tu ne trouve pas facilement.

    Il faut utiliser les schemas pour y arriver, ici j'affiche le résultat dans un StringGrid
    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
    With ADOCnx do
      Begin
        Try
          Try
            Screen.Cursor := crHourGlass; // On fait patienter
            Provider := 'Microsoft.Jet.OLEDB.4.0';
            LoginPrompt := False;
            ConnectionString :='Data Source='
            + TonCheminEtTaBaseMDB + ';Persist Security Info=False';
    
    // On envoi sur un ADOTable1 les informations des champs d'indexes
            OpenSchema(siIndexes, emptyparam, emptyparam, TADODataSet(ADOTable1));
            ADOTable1.Open;
    
    // On envoi sur un ADOTable d'autres informations sur les colonnes (les champs)
            OpenSchema(siColumns, emptyparam, emptyparam, TADODataSet(ADOTable));
            ADOTable.Open;
      {Récupération des informations sur les champs Access et Remplissage du StringGridChamps}
    
            With ADODataSet1 do
            Begin
              CommandText := 'Select TOP 1 * From [' + TaTable +']'; // Top 1 inutile d'en prendre plus ici
              Active := True;
    
              StringGridChamps.RowCount := FieldList.Count + 1;
              For i:= 0 to FieldList.Count-1 do
              Begin
                StringGridChamps.Cells[1,i+1] := IntToStr(i+1); // Numero de ligne
                StringGridChamps.Cells[2,i+1] := Fields[i].FieldName; // Nom du champs en texte
                StringGridChamps.Cells[3,i+1] := FieldTypeNames[FieldDefs[i].DataType]; // Type de Champs
                StringGridChamps.Cells[5,i+1] := Inttostr(Fields[i].Size); // Taille du champs
                With ADOTable1 do // est-ce un champs indexé ?
                Begin
                  Filtered := False;
                  Filter :=
                  'TABLE_NAME = '+ QuotedStr(TaTable) +
                  ' And COLUMN_NAME = ' + QuotedStr(ADODataSet1.Fields[i].FieldName);
                  Filtered := True; // Donc on filtre sur le champ en cours de lecture
                  If (FieldByName('PRIMARY_KEY').AsBoolean) // est-il une clé principal ?
                  then StringGridChamps.Cells[6,i+1] := 'True'
                  else StringGridChamps.Cells[6,i+1] := '';
    
                  if (FieldByName('UNIQUE').AsBoolean) // non ou sans doublons autorisée ?
                  then StringGridChamps.Cells[7,i+1] := 'True'
                  else StringGridChamps.Cells[7,i+1] := '';
                end;
    
    
                With ADOTable do
                Begin
                  Filtered := False;
                  Filter :=
                  'TABLE_NAME = '+ QuotedStr(TaTable) +
                  ' And COLUMN_NAME = ' + QuotedStr(ADODataSet1.Fields[i].FieldName);
                  Filtered := True; // Donc on filtre sur le champ en cours de lecture
                  StringGridChamps.Cells[4,i+1] := Fields.Fields[11].AsString;  // Type de champ en nombre 
                  StringGridChamps.Cells[8,i+1] := Fields.Fields[10].AsString; // Est-t-il Nullable ?
                end;
              end;
            Active := False;
      //      Close;
            end;
    
          Except
            on E : Exception do
            Begin
              // Gestion des erreurs;
            end;
          end;
        Finally
          Screen.Cursor := crDefault;
        end;
    end;
    J'ai testé pas mal d'autre schema ces 2 schemas sont les plus renseignés.
    N'oublis pas de remplacer :
    TaTable par le nom véritable de la table
    TonCheminEtTaBaseMDB par le chemin et le nom de ta base access ex : c:\essai\trucdeouf.MDB


  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut
    Merci beaucoup pour ton code, ça marche impec

    Par contre, est-ce que tu sais s'il est possible de récupérer la valeur par défaut de chaque champ ??

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par sam-sam Voir le message
    Merci beaucoup pour ton code, ça marche impec

    Par contre, est-ce que tu sais s'il est possible de récupérer la valeur par défaut de chaque champ ??
    A ce jour je n'ai pas réussi à le faire, même avec ADOx.

Discussions similaires

  1. [VB.NET] Gestion en temps réel d'une bdd access
    Par qwiskas dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/02/2005, 19h37
  2. BDD Access et importation de fichier excel!
    Par Zetmurin dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/02/2005, 11h34
  3. DBchart et BDD access
    Par bigfoot dans le forum Bases de données
    Réponses: 13
    Dernier message: 22/12/2004, 18h48
  4. Problème d'ajout multiples dans un BDD Access
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/05/2004, 13h34
  5. Comment créer une Table dans 1 Bdd ACCESS avec Builder??
    Par makandja dans le forum C++Builder
    Réponses: 6
    Dernier message: 17/03/2004, 20h21

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