Utilisation de l'API mySQL avec Delphi
Date de publication : 11/11/2002
Par
LFE (autres articles)
Ce document a pour but de montrer comment exploiter une connection à une base de données mySQL, en utilisant
uniquement l'API fournie avec mySQL
Avant-Propos
1. Préparer le projet
1.1. Création du projet
1.2. Mise à jour de mySQL.pas
2. Initialiser la connection à mySQL
3. Fermer la connection
4. Se connecter à la base de données
5. Lister les tables de la base de données
6. Accéder aux données de la table
7. Lister la structure d'une table
8. Gestion des erreurs
8.1. Obtenir le code d'erreur
8.2. Obtenir un message decrivant l'erreur
9. Utiliser la version embedded du serveur mySQL
9.1. Modification du fichier de configuration de mySQL
9.2. Modification du projet
9.3. Démarrage du serveur
9.4. Arrêt du serveur
Avant-Propos
Ce document a pour but de montrer comment exploiter une connection à une base de données mySQL, en utilisant uniquement µ
l'API fournie avec mySQL.
Le code a été écrit et testé avec Delphi et mySQL version 4.0.4 beta.
Pour une description des fonctions de l'API, je vous renvoie a la documentaiton fournie avec mySQL sur
www.mysql.com
1. Préparer le projet
1.1. Création du projet
La première chose est de créer un nouveau projet et de l'enregistrer dans un répértoire.
Il faut ensuite recopier la DLL
libmySQL.dll dans ce répertoire.
Il faut aussi télécharger l'unité
mySQL.pas à l'adresse suivante :
http://www.fichtner.net/delphi/mysql/
et ajouter cette unité au projet.
Vous pouvez télécharger la version modifiée comme décrit dans ce tutoriel
ici.
1.2. Mise à jour de mySQL.pas
mySQL.pas ayant été écrit dans l'optique d'une utilisation avec une version 3.23.49. Il est probable qu'il faille effecteur
l'une ou l'autre mise à jour.
En voici déja une : le type MYSQL_FIELD doit être déclaré comme suit
type
PMYSQL_FIELD = ^TMYSQL_FIELD;
TMYSQL_FIELD = record
name: pChar;
table: pChar;
org_table : pChar;
db : pChar;
def: pChar;
length: longword;
max_length: longword;
flags: longword;
decimals: longword;
_type: enum_field_types;
end;
|
2. Initialiser la connection à mySQL
Avant tout chose il est nécessaire d'initialiser l'accès à la DLL
var
mySQLConnection : PMYSQL;
begin
mySQLConnection := mysql_init(nil);
end;
|
Au retour, mySQLConnection contient l'adresse de la structure permettant l'intefacage avec mySQL,
ou nil en cas d'erreur.
Il est tout à fait possible d'avoir plusieurs connections dans le même programme
3. Fermer la connection
var
mySQLConnection : PMYSQL;
begin
mysql_close(mySQLConnection);
end;
|
mysql_close ferme la connection à la base de données et libère les ressources allouées lors de la création de la connection
4. Se connecter à la base de données
var
mySQLConnection : PMYSQL;
begin
if mysql_real_connect(mySQLConnection, '127.0.0.1', 'root', 'root', 'test', 0, nil, 0) <> nil then begin
end else begin
end;
end;
|
mysql_real_connect ouvre la connection à la base données, et met à jour la structure mySQL en fonction de cette
connection.
Les paramètres sont
- Le handle de Connection
- l'adresse du serveur où mySQL est installé
- le nom d'utilsiateur
- le mot de passe
- le nom de la base de données
- le n° de port (0 indique que l'on utilise le port par défaut)
- le nom du pipe ou le socket qui sera utilisé (habituellement NULL)
- des status permettant de configurer la connection (habituellement 0)
Une valeur de retour de 0 indique qu'une erreur s'est produite.
Une valeur autre indique que la conenction est ouverte
5. Lister les tables de la base de données
var
mySQLConnection : PMYSQL;
myROW : PMYSQL_ROW;
myRES : PMYSQL_RES;
aStr : AnsiString;
i, j : Cardinal;
begin
myRES := mysql_list_tables(mySQLConnection, nil);
if myRES <> nil then begin
for i := 0 to myRES.row_count-1 do begin
myROW := mysql_fetch_row(myRES);
for j := 0 to mysql_num_fields(myRES) - 1 do begin
aStr := myROW^[j];
ListBox1.Items.Add(aStr);
end;
end;
mysql_free_result(myRES);
end;
end;
|
mysql_list_tables permet de lire le noms de toutes les tables de la base de données associée à mySQL.
Ses paramètres sont :
- le handle de connection
- un masque permettant de filtrer les noms de tables à lire
La valeur de retour est une structre de type PMYSQL_RES qui est un handle vers le résultat de la requête.
Si la requête échoue, la valeur de retour est nil.
La propriété row_count de myRES contient le nombre d'enregistrements contenus dans le résultat.
mysql_fetch_row renvoie l'enregistrement suivant du résultat de la requête, dans une structure de type
PMYSQL_ROW.
La fonction mysql_num_fields permet quant à elle de connaître le nombre de champs renvoyés par la requête.
Une fois que l'on n'a plus beosin du résultat de la requête, il ne faut pas oublier de libérer les ressources
en appelant la fonction mysql_free_results.
6. Accéder aux données de la table
var
mySQLConnection : PMYSQL;
myRES : PMYSQL_RES;
myROW : PMYSQL_ROW;
aStr : AnsiString;
i, j : Cardinal;
begin
if mysql_query(mySQLConnection, 'select * from testbcb') = 0 then begin
myRES := mysql_store_result(mySQLConnection);
if (myRES <> nil) then begin
for i := 0 to myRES.row_count - 1 do begin
myROW := mysql_fetch_row(myRES);
for j := 0 to mysql_num_fields(myRES) - 1 do begin
aStr := myROW^[j];
ListBox1.Items.Add(aStr);
end;
end;
mysql_free_result(myRES);
end;
end;
end;
|
La fonction mysql_query éxécute une requête.
Une valeur de retour à 0 indique que la requête a abouti. une valeur autre indique une erreur.
Pour accéder au résultat de la requête, il est nécessaire d'appeler la fonction mysql_store_results qui renvoie
un pointeur de type PMYSQL_RES.
mysql_fetch_row renvoie l'enregistrement suivant du résultat de la requête, dans une structure de type PMYSQL_ROW
7. Lister la structure d'une table
var
mySQLConnection : PMYSQL;
myRES : PMYSQL_RES;
myFields : PMYSQL_FIELDS;
aStr : AnsiString;
CountFields : Integer;
i : Cardinal;
begin
if mysql_query(mySQLConnection, 'select * from testbcb') = 0 then begin
myRES := mysql_store_result(mySQLConnection);
if (myRES <> nil) then begin
CountFields := mysql_num_fields(myRES);
myFields := mysql_fetch_fields(myRES);
for i := 0 to CountFields - 1 do begin
aStr := 'field name ' + myFields^[i].name;
ListBox1.Items.Add(aStr);
end;
end;
mysql_free_result(myRES);
end;
end;
|
La fonction mysql_fetch_fields remplit une structure de type PMYSQL_FIELDS qui contient alors un tableau contenant
toutes les informations des champs renvoyés par la requête.
8. Gestion des erreurs
8.1. Obtenir le code d'erreur
var
myErrorCode : Cardinal;
begin
myErrorCode := mysql_errno(mySQLConnection);
end;
|
mySQL_errno renvoie un n° d'erreur indiquant l'erreur survenue lors du dernier appel à l'API, pour la
connection mySQL donnée.
Une valeur de 0 indique qu'il n'y a pas eu d'erreur.
8.2. Obtenir un message decrivant l'erreur
var
myErrorMsg : AnsiString;
begin
myErrorMsg := mysql_error(mySQLConnection);
end;
|
mySQL_error renvoie un message décrivant l'erreur survenue lors du dernier appel à l'API, pour la connection
mySQL donnée.
Une message vide indique qu'il n'y a pas eu d'erreur.
9. Utiliser la version embedded du serveur mySQL
Dans la version 4, il y a la possibilité d'embarquer le serveur mySQL dans l'application.
L'utilisation de cette version implique quelques modifications au projet et au fichier de configuration de mySQL.
9.1. Modification du fichier de configuration de mySQL
Dans le fichier de configuration de mySQL, il faut ajouter au minimum:
[embedded]
basedir=e:/mysql
datadir=e:/mysql/data
|
Il s'agit en fait de la configuration du serveur, mais dans sa version embarquée.
9.2. Modification du projet
Voici la liste des modifications à apporter à mySQL.Pas afin de pouvroit utiliser la version embarquée du serveur
Dans les variables (ligne 486), ajouter les 2 lignes suivantes:
mysql_server_init: function(argc: integer; argv: pointer; groups :pointer) : integer ; stdcall;
mysql_server_end: procedure; stdcall;
|
dans la fonction libmysql_load, ajouter les 2 lignes suivantes (ligne 682)
assign_proc(@mysql_server_init, 'mysql_server_init');
assign_proc(@mysql_server_end, 'mysql_server_end');
|
Si vous utilisez la version modifiée de mySQL.pas, ajoutez le define suivant à votre projet
9.3. Démarrage du serveur
if mysql_server_init(0, nil, nil) = 0 then begin
end else begin
end;
|
La fonction mysql_server_init permet de démarrer la version embarquée de mySQL.
Les paramètres sont ceux de la ligne de commande éventuelle.
Une valeur de retour à 0 indique que le démarrage s'est bien déroulé. Une valeur autre indique une erreur.
9.4. Arrêt du serveur
La fonction mysql_server_end arrête le serveur embarqué.


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.