Delphipage - la reference en Delphi
Accueil - Astuces - Composants - Programmes - Tutoriaux - Livres - Liens
 Sources
- Astuces
- Composants
- Programmes
- Tutoriaux
 Rechercher
- Delphipage
- Ngscan
 Ressources
- Lexique Delphi
- Livres
- News
- Patchs Delphi
 Liens
- Borland France
- CodeGear
- Les meilleurs sites


Tutoriaux - Interfaçage Delphi / MySQL

Présentation 

MySQL étant un SGBD de plus en plus utilisé et n'ayant pas trouvé de tutoriel concernant l'interfaçage Delphi/MySQL, j'ai donc décidé d'en écrire un...
Ceci montre uniquement l'aspect interfaçage entre Delphi et MySQL. Il ne s'agit en aucun cas d'un tutoriel sur la programmation en Delphi ou sur l'administration de MySQL.

Il existe différentes méthodes et différents composants pour réaliser l'interfaçage (TMysql, ...). Cependant la grande majorité de ceux-ci se basent sur l'unité "mysql.pas".
"Mysql.pas" est une adaptation directe de "mysql.h" et de deux autres fichiers d'entête C requis pour ecrire des clients pour le serveur de base de données de MySQL.

Ainsi, j'ai décidé de montrer comment interfacer Delphi avec un serveur MySQL directement à partir de cette unité. La compréhension du fonctionnement d'autres composants se basant sur mysql.pas n'en sera que plus aisée.



De bonnes bases ...

Pour commencer, j'utilise Delphi 6 Personnal Edition.

L'unité "mysql.pas" se trouve à l'adresse : http://www.fichtner.net/delphi/mysql.delphi.phtml.


Nous utilisons la version compilée 3.23.57 du serveur MySQL pour Windows (Ceci uniquement pour avoir un serveur MySQL en local pour l'interfacage pour faire les tests. Si vous disposer déjà d'un tel serveur, quelle que soit la plateforme, inutile de le télécharger).

- La majorité des hébergeurs Web proposant une base mysql n'autorisent pas l'accés à MySQL depuis une machine extérieure. Seul le serveur  faisant tourner les scripts php y est autorisé. Il vous faut donc trouver un autre serveur MySQL (ou créer le votre, cf ci-dessus).
- La version 4 de MySQL présente des incompatibilité pour le moment avec les headers de la version 3 utilisés pour l'interfaçage. Rabattez-vous vers une version 3.

Installation du serveur MySQL  (si vous ne possédez pas de serveur MySQL) :

-Décompressez l'archive.
-Lancez le setup.exe.
-Installez mysql dans "c:\mysql" (si vous changez ce chemin par défaut, référez vous au manuel MySQL pour y adapter le fichier de configuration my.cnf).

Lancement du serveur MySQL :

-
Lancez une invite de commande MsDos
- Tapez : cd \mysql\bin

- Puis :  mysqld     (si vous êtes sous windows 95,98,Me)

    ou   
             mysqld-nt  (si vous êtes sous NT/2000/XP)
           

Création d'un programme

Commencez par créer un répertoire pour le programme que nous allons créer (exemple : "c:\testmysql")

Copiez dans ce répertoire l'unité "mysql.pas" et le fichier  "libmySQL.dll" présent sous" c:\mysql\lib\opt".
Si vous n'avez pas installé de serveur MySQL, télécharger la DLL directement sur le site http://www.mysql.com/.

Cette DLL devra obligatoirement être redistribuée avec votre programme sinon ce dernier ne pourra fonctionner sur d'autres machines.

Complétez la partie "uses" de l'unité en y ajoutant "mysql" :

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, mysql;

Ceci permet de pouvoir faire appel à l'unité mysql qui se charge d'appeler la DLL. Dans les déclarations publiques, ajoutez :


public
{ Public declarations }
mysql: PMysql;
end;

Dans le haut de l'implémentation, ajouter les deux constantes correspondant au nom de la base de données que nous allons créer ainsi que le nom de la table que nous allons créer.

implementation

CONST dbname='testdb';
table='tb';

{$R *.dfm}

Ajoutez un composant TButton. Modifiez sa propriété "Caption" par "Connexion à la base". Ajoutez un composant TLabel (Label1) à coté de celui-ci. Dans la propriété "Onclick" du bouton, ajoutez le code suivant :

procedure TForm1.Button1Click(Sender: TObject);
Var user,host,pwd:string;
portip:integer;
begin
user:='root';
pwd:='';
host:='127.0.0.1';
portip:=3306;
MySQL := mysql_init(nil);
mysql_options(mysql,MYSQL_OPT_COMPRESS,0);
if mysql_real_connect(mysql, pChar(host), pChar(user), pChar(pwd), nil, portip, nil, 0)=nil  then
Label1.Caption:='La connexion a echouée'
else
Label1.Caption:='Connexion OK';
end;

La variable "user" correspond au nom d'utilisateur sous lequel nous voulons établir la connexion et "pwd" correspond au mot de passe (en clair) de l'utilisateur.
Comme nous venons d'installer le serveur, seul l'administrateur (root) posséde un compte. Il est bien évident qu'il n'est pas judicieux de se connecter en root et encore moins de ne pas lui mettre de mot de passe mais je rappelle qu'il ne s'agit pas d'un tutoriel sur l'administration de MySQL.
"Host" correspond à l'adresse ip du serveur Mysql (ici, le serveur est sur la machine locale donc mettons l'adresse du localhost) et port correspond au port ip utilisé par le serveur Mysql (par défaut 3306).

"
MySQL := mysql_init(nil);" initialise l'objet pour pouvoir ensuite établir une connexion sur la ligne suivante.

Nous allons maintenant voir comment créer une base de données.
Ajoutez un deuxième composant "TButton" dont la propriété "Caption" est "Creer une database" et un deuxième composant TLabel (Label2). Dans l'évenement "OnClick" de ce dernier bouton, complétez par :


if mysql_create_db(mysql, pChar(dbname))<>0  then
Label2.Caption:='La création a echouée'
else
Label2.Caption:='Création OK';

La fonction "mysql_create" permet de créer une base de données et retourne 0 si la création est correcte.

Une fois la base créée, nous allons créer une table.
Ajoutez un composant TButton dont la propriété "Caption" est "créer la table" et un composant TLabel (Label3). Dans l'évenement "OnClick" de ce dernier bouton, complétez par :


if mysql_select_db(mysql, pChar(dbname)) <> 0 then
Label3.Caption:='Selection de la base impossible';
if mysql_query(mysql, pChar('CREATE TABLE '+table+' (id TINYINT(0) NOT NULL AUTO_INCREMENT PRIMARY KEY,nom CHAR(25) NOT NULL,UNIQUE (id))')) <> 0 then
Label3.Caption:='Creation de table impossible'
else
Label3.Caption:='Table OK';

La fonction "mysql_select_db" permet de travailler sur la base que nous venons de créer
Pour créer une table, nous voyons alors qu'il s'agit simplement d'une requête SQL appelée par la fonction "mysql_query".
C'est cette même fonction que nous allons utiliser pour remplir la table de valeurs fictives.
Ajoutez un composant TButton dont la propriété "Caption" est "Remplir la table" et un composant TLabel (Label4). Dans l'évenement "OnClick" du bouton, ajoutez :


procedure TForm1.Button4Click(Sender: TObject);
Var boucle:byte;
erreur:boolean;
begin
if mysql_select_db(mysql, pChar(dbname)) <> 0 then
Label4.Caption:='Selection de la base impossible';
erreur:=false;
for boucle:=1 to 127 do
if mysql_query(mysql, pChar('INSERT INTO '+table+' (id,nom) VALUES ("'+inttostr(boucle)+'", "Nom '+inttostr(boucle)+' ")')) <> 0 then
erreur:=true;
if (erreur) then
Label4.Caption:='Erreur'
else
Label4.Caption:='Ok';
end

Pour vérifier le bon fonctionnement des requêtes, éxecuter le programme et cliquez successivement (et dans l'ordre) sur les 4 boutons
.
Quittez le programme et éxecuter la commande c:\mysql\bin\mysql -u root.

Ceci permet d'avoir un client mysql.
Effectuer la vérification en tapant :

use testdb;
select * from tb;


Ceci permet de lister le contenu de la table td.
Quittez le client en tapant :

quit;

Nous allons maintenant effectuer cette même requête, mais directement depuis notre programme Delphi.
Ajoutez un composant TButton dont la propriété "Caption" est "lister le contenu de la table" et un composant TMemo (Memo1). Sur l'évenement "OnClick" du bouton, ajoutez le code suivant :


procedure TForm1.Button5Click(Sender: TObject);
Var Resultat: PMYSQL_RES;
Compteurchamps:Longword;
row: PMYSQL_ROW;
ligne:string;
I: Word;
begin
mysql_select_db(mysql, pChar(dbname));
mysql_query(mysql, pChar('SELECT * FROM '+table));
Resultat:=mysql_use_result(MySQL);
if Resultat = nil then
Form1.Caption:='Erreur table vide';
Compteurchamps := mysql_num_fields(Resultat);
row:= mysql_fetch_row(Resultat);
while Row <> nil do
begin
ligne:='|';
for I := 0 to Compteurchamps - 1 do
begin
ligne:=ligne+row[i]+' | ';
end;
Memo1.Lines.Add(ligne);
Row := mysql_fetch_row(Resultat);
end;
end;

La requête SQL est la même que celle tapée sous le client MySQL. Toute autre requête SQL aurait pu convenir. Comme nous l'avons vu, les requétes SQL sont
appelées par la fonction mysql_query.
La fonction mysql_use_result permet de récuperer le résultat de la requéte, la fonction mysql_num_fields pemet de connaitre le nombre de champs contenus
dans le resultat de la requete et la fonction mysql_fetch_row  permet de récuperer un enregistrement (une ligne) du résultat de la requete. Ainsi, pour
avoir toute les resultats, il faut executer la fonction mysql_fetch_row  autant de fois qu'il y a d'enregistrement dans le résultat de la requete.

Les lignes suivantes servent à formatter la sortie des résultats.

Le dernier point important à voir concerne la déconnexion au serveur.
Ajoutez un composant TButton et mettez la propriété "Caption" à "Deconnexion". Sur l'evenement Onclick, completez avec le code suivant :


procedure TForm1.Button6Click(Sender: TObject);
begin
mysql_close(MySQL);
end;

Executer ensuite le programme.
Cliquez sur "connexion", puis sur "lister le contenu de la table' puis sur 'deconnexion".
Si vous essayez de recréer la base ou la table à nouveau, les labels vous signaleront des erreurs car ces dernières sont déjà créées.



Pour aller plus loin ...

Il est intéressant de consulter le manuel MySQL (partie API) pour connaître l'ensemble des fonctions et méthodes présentent dans la DLL :
http://www.mysql.com/documentation/mysql/bychapter/index.html#Clients.


Interfaçage Delphi - MySQL
   [ 12-08-2003 ]
 Exemple d'interfaçage Delphi-MySQL grâce à l'unité mysql.pas.
Télécharger :  [152 Ko] [Télécharger mysql.zip]

Auteur : Shogun

Tous droits réservés - Contacts
Haut de la page