Les fonctions du catalogue dans ODBC Pro

Noreddine MARGOUM

- Titre : Les fonctions du catalogue dans ODBC Pro

- Auteur : Noreddine MARGOUM

- Parution : 1 août 2005

- Licence : Ce document est issu de https://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.

Sommaire

- I. Introduction ♪

- II. Fonctions du catalogue

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

- Modèle général

- Exemple d’implémentation

- IV. Utilisation de la base de test

- V. Conclusion

- VI. Base exemple

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.

À 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 :

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 où
`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. À 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.

À 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 :

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.

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

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