Les fonctions du catalogue dans ODBC Pro

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Cette note technique a pour but de vous montrer l'utilisation des commandes du plug-in 4D ODBC Pro qui décrivent le catalogue d'une base de données.

II. Fonctions du catalogue

Note : On utilisera comme synonymes les termes de champ et de colonne.

Les bases de données possèdent toutes une structure telle que des informations comme la liste des tables, les privilèges sur une table donnée, puissent être obtenues. Cette structure est appelée le catalogue de la base de données ou aussi le dictionnaire des données.

A travers les commandes ODBC Pro du catalogue, on peut décrire l'intégralité de cette structure.


L'utilité principale de ces commandes est :

  • construire des requêtes SQL dynamiques au cours de l'exécution de l'application, car la liste des tables et des colonnes (champs) peut être obtenue par les fonctions du catalogue ODBC_SQLTables et ODBC_SQLColumns
  • rendre les requêtes SQL plus efficaces en exploitant les relations entre les tables et les index sur les colonnes, via les commandes ODBC_SQLPrimaryKeys, ODBC_SQLForeignKeys, et ODBC_SQLStatistics


Voici la liste des commandes du catalogue, ainsi que leur description :

Commandes Description
ODBC_SQLTables Retourne la liste des catalogues, schémas, tables et types de tables dans la source de données ;
ODBC_SQLColumns Retourne la liste des colonnes (champs) pour une ou plusieurs tables ;
ODBC_SQLStatistics Retourne une liste de statistiques (nombre d’enregistrements de la table, nombre de valeurs uniques de l’index…) pour une table ou la liste des index associés à la table ;
ODBC_SQLSpecialColumns Retourne la liste des colonnes qui identifient de manière unique un enregistrement dans une table. Retourne aussi la liste des colonnes de la table qui sont automatiquement mises à jour lorsqu’une colonne quelconque est mise à jour lors d’une transaction ;
ODBC_SQLPrimaryKeys Retourne la liste des colonnes qui composent une clé primaire* pour une table donnée. Pour rappel, la clé primaire est une colonne ou une combinaison de colonnes qui permet d’identifier de manière unique l’enregistrement d’une table ;
ODBC_SQLForeignKeys Retourne la liste des clés étrangères* pour une table donnée ou la liste des clés étrangères dans les autres tables et qui référencent une table donnée. Pour rappel, une clé étrangère dans une table donnée référence la clé primaire d’une autre table ;
ODBC_SQLTablePrivileges Retourne la liste des tables et leurs privilèges associés, notamment l’utilisateur qui accorde le privilège et l’utilisateur à qui est accordé le privilège ;
ODBC_SQLColumnPrivileges Retourne la liste des colonnes et leurs privilèges associés pour une table donnée ;
ODBC_SQLProcedures Retourne la liste des procédures stockées dans la source de données. Le terme de procédure est générique et couvre tout à la fois les concepts de procédure et de fonction ;
ODBC_SQLProcedureColumns Retourne la liste des paramètres d’entrée et sortie de l’objet procédure aussi bien que les colonnes qui peuvent constituer l’ensemble résultant de l’exécution de la procédure. Cette commande détermine aussi le type de chaque paramètre (Entrée, Entrée/Sortie, Sortie) et si le paramètre est une colonne ;
ODBC_SQLGetTypeInfo Retourne la liste des types de données supportées par la source de données. Ces types de données sont utilisés dans les requêtes SQL de définition des données comme CREATE TABLE (création d’une table) et ALTER TABLE (modification d’une table).




* pour comprendre les notions de clé étrangère et clé primaire, voici un exemple :

Pictures 0555x0230




Dans ce cas de figure très simple, la table [Employe] contient une clé primaire Employe_ID.

La table [Service] contient la clé primaire Service_ID. La clé primaire sert à identifier de manière unique l'enregistrement de la table. Il existe des systèmes de données où la clé primaire est constituée de plusieurs colonnes.

Dans notre cas, il n'y a qu'une seule clé étrangère, Service_ID, contenue dans la table [Employe]. Cette clé étrangère référence la table [Service] dans la table [Employe]. Elle marque le lien de l'employé au service. Il existe des systèmes de données où la clé étrangère est constituée de plusieurs colonnes.

Toutes les commandes du catalogue retournent le résultat sous forme d'une liste de colonnes ordonnées. Il suffira, pour récupérer les données de ces colonnes, d'associer un champ ou une variable 4D à la colonne, en se basant sur la position de la colonne.

III. Modèle d’utilisation des fonctions du catalogue

Modèle général

`allocation du handle requête. Le handle de connexion est supposé

       `avoir déjà été alloué et valide (connexion établie)

    $vl_Status:=ODBC_SQLAllocStmt($vl_ConnexionID;$vl_StmtID)
Au cas ou
`exécution de la commande du catalogue
       : (ODBC_FonctionDuCatalogue($vl_StmtID;Param1 ;Param2...)=SQL_ERROR)
`le résultat de la commande est retourné sous forme de colonnes ordonnées.
          `On associe chaque colonne du résultat avec une variable ou champ 4D

       : (ODBC_SQLBindCol($vl_StmtID;1;->VariableouChamp1)=SQL_ERROR)
       : (ODBC_SQLBindCol($vl_StmtID;2;->VariableouChamp2)=SQL_ERROR)
       : (ODBC_SQLBindCol($vl_StmtID;3;->VariableouChamp3)=SQL_ERROR)
`.....association de la Nième colonne du résultat avec la variable ou champ N
       : (ODBC_SQLBindCol($vl_StmtID;N;->VariableouChampN)=SQL_ERROR)

Sinon
          $vl_Status:=ODBC_SQLFetch($vl_StmtID)
Tant que (($vl_Status#SQL_NO_DATA ) & ($vl_Status#SQL_ERROR))
`Traitement dans les variables ou champs 4D des données remontées
             $vl_Status:=ODBC_SQLFetch ($vl_StmtID)
Fin tant que
Fin de cas
`fermeture et liberation du handle-requête
    $vl_Status:=ODBC_SQLFreeStmt ($vl_StmtID; SQL_CLOSE)

    $vl_Status:=ODBC_SQLFreeStmt ($vl_StmtID;SQL_DROP)



Les appels de commandes du catalogue suivent la structure du programme donné ci-dessus.

  1. On alloue un handle (entier long) de requête, à partir du handle connexion (ODBC_SQLAllocStmt) ;

  2. On effectue l’appel à la commande du catalogue, en passant en premier paramètre le handle de requête, suivi des paramètres propres à la commande ;

  3. L’exécution de la commande du catalogue, en cas de succès, aboutit à la création d’un ensemble résultat, qui se présente sous forme d’une liste ordonnée de colonnes ;

  4. A chaque colonne de l’ensemble résultat, on associe une variable ou un champ 4D. La position de la colonne dans l’ensemble-résultat étant significative, elle doit impérativement être indiquée au moment de l’association. L’association Colonne/Champ ou variable 4D est donc réalisée par l’appel suivant : ODBC_SQLBindCol(HandleRequete;PositionColonne;->VariableouChamp4D) ;

  5. On remonte les données résultant de la commande avec la commande ODBC_SQLFetch.
    Les conditions d’arrêt de cette commande sont la production d’une erreur ou la fin de la remontée des données ;

  6. Fermeture et libération de la requête.

Exemple d’implémentation

C_ENTIER LONG($0)   `Code retour de la méthode

C_ENTIER LONG($1;$vl_ConnectionID)   `Identifiant de la connection
C_TEXTE($2)   `Nom de la Table
C_POINTEUR(${3})   `pointeurs sur les tableaux des noms colonnes, types et tailles des colonnes
C_ENTIER LONG($vl_StmtID)   `handle requête
C_TEXTE($vt_CatalogName)   `nom du catalogue
C_TEXTE($vt_SchemaName)   `nom du schéma
C_TEXTE($vt_TableName)   `nom de la table
C_TEXTE($vt_ColumnName)   `nom de la colonne

    $vl_ConnectionID:=$1
    $vt_CatalogName:=""
    $vt_SchemaName:=""
    $vt_TableName:=$2
    $vt_ColumnName:=""

`allocation du handle requête
    vl_Status:=ODBC_SQLAllocStmt($vl_ConnectionID;$vl_StmtID)
    vl_Status:=ODBC_SQLColumns($vl_StmtID;$vt_CatalogName;$vt_SchemaName;$vt_TableName;$vt_ColumnName)
Si ((vl_Status=SQL_SUCCESS) | (vl_Status=SQL_SUCCESS_WITH_INFO))
       vl_Status:=ODBC_SQLBindCol($vl_StmtID;4;$3)   `noms des colonnes
       vl_Status:=ODBC_SQLBindCol($vl_StmtID;6;$4)   `types des colonnes
       vl_Status:=ODBC_SQLBindCol($vl_StmtID;8;$5)   `tailles des colonnes
Tant que ((vl_Status#SQL_NO_DATA) & (vl_Status#SQL_ERROR))
          vl_Status:=ODBC_SQLFetch($vl_StmtID)
Fin tant que
Sinon
       $0:=SQL_ERROR
Fin de si
    vl_Status:=ODBC_SQLFreeStmt($vl_StmtID;SQL_CLOSE)

    vl_Status:=ODBC_SQLFreeStmt($vl_StmtID;SQL_DROP)



Commentaires sur la méthode :

Cette méthode retourne la liste des colonnes d'une table, ainsi que leur type et leur taille.

A cette fin, elle utilise la commande ODBC_SQLColumns. On voit que cette méthode suit le modèle présenté dans la partie précédente.

IV. Utilisation de la base de test

La base de test contient l'implémentation de toutes les commandes du catalogue, listées dans la seconde partie de cette note.

Au lancement de la base, ou par l'intermédiaire du menu « //Fichier/Demo... », le dialogue principal apparaît :

Pictures 0542x0378




En choisissant le bouton « Connecter... », vous pouvez sélectionner la source de données à laquelle vous voulez vous connecter. La source de données devra avoir été préalablement configurée dans l'administrateur ODBC de Windows.

Pictures 0384x0368




Maintenant que la connexion est établie avec la source de données, vous pouvez utiliser les diverses fonctions du catalogue. Par exemple :

Pictures 0542x0379




L'image montre l'utilisation de la commande ODBC_SQLColumns telle que présentée dans l'exemple d'implémentation décrit plus haut.

V. Conclusion

Cette note vous a montré l'utilisation des commandes 4D ODBC Pro du thème du catalogue, pour décrire structurellement une source de données.

VI. Base exemple

Téléchargez la base exemple :

base exemple

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.