MySQLDatabases/fr

From Lazarus wiki
Jump to navigationJump to search

Deutsch (de) English (en) français (fr) 日本語 (ja) polski (pl) slovenčina (sk)

Portail de la base de données

Références:

Tutoriels/articles pratiques :

Bases de données

Advantage - MySQL - MSSQL - Postgres - Interbase - Firebird - Oracle - ODBC - Paradox - SQLite - dBASE - MS Access - Zeos

Introduction

Cette page expliquera comment se connecter à un serveur MySQL en utilisant des composants visuels.

Light bulb  Remarque: Cette page a été écrite il y a longtemps et peut être dépassée. Aussi, la plupart des concepts décrits ici ne sont pas spécifiques à MySQL mais s'appliquent à tous les bases de données SQLDB. Donc suivre les tutoriels SQLDB ci-dessous pourrait être plus facile.

En complément des tutoriels listés en bas de cette de page, voir aussi mysql/fr#Tutoriels et exemple de code pour plus de tutoriels qui sont écrits depuis longtemps aussi

Dans le tutoriel de base de données nous avons vu une première tentative de connexion à un serveur MySQL. Nous n'avons utilisé aucun composant, qu'il soit visuel ou non-visuel, à ce moment là. Cette page expliquera comment se connecter à un serveur MySQL d'une façon (peut-être) plus facile.

Composants disponibles

Composants SQLdb

Dans les versions même vaguement récentes de Lazarus, les composants SQLDB sont installés par défaut.

sqldbcomponents.png

Dans l'onglet SQLDB, vous trouverez :

Si l'onglet SQLDB manque, consultez la page Installation des paquets pour le "Comment-faire de l'installation" ('Install howto').

Explication des composants utilisés

TMySQLConnection

TMySQLConnection est utilisé pour stocker des paramètres pour se connecter au serveur de base de données. Il vous permet de configurer l'hôte auquel vous vous connectez ainsi que l'userid et le password à utiliser dans la connexion. Une autre propriété de TMySQLConnection est utilisée pour indiquer la base de données que vous voulez utiliser. Le 'LoginPrompt' n'est pas encore fonctionnel, donc assurez-vous qu'à côté des HostName et DatabaseName les propriétés UserName et Password soient bien renseignées avant de tenter d'ouvrir une connexion.

Assurez-vous d'utiliser TSQLTransaction dans votre MySQLConnection en renseignant la propriété Transaction ou bien vous n'aurez pas la possibilité d'ouvrir une SQLQuery.

Note. Dans les dernières versions SVN de Lazarus vous trouverez 3 composants MySQLConnection. Il y a TMySQL40Connection, TMySQL41Connection et TMySQL50Connection. Assurez-vous d'utiliser la version correcte correspondant à votre serveur. Donc si vous utilisez un MySQL 4.1 utilisez un TMySQL41Connection.

TSQLTransaction

Une SQLTransaction est nécessaire pour certains travaux internes. Une SQLTransaction est automatiquement avtivée quand vous ouvrez un dataset l'utilisant. En fermant une connexion désactive également la transaction associée et ferme tous les datasets l'utilisant.

TSQLQuery

TSQLQuery est utilisé pour exécuter les commandes SQL sur le serveur. Vous pouvez récupérer des données en positionnant le SQL à quelque commande SELECT et en l'appelant avec la méthode Open. Ou vous pouvez manipuler les données en faisant des INSERT, DELETE or UPDATE. Dans le dernier cas, vous ne devez pas utiliser la méthode Open mais la méthode Execute.

TDataSource

Un DataSource met à disposition la connexion entre les composants 'data aware' visibles comme DBEdit, DBGrid et un dataset. Il permet aux données d'être disponibles pour l'affichage par les composants 'data aware'. Une datasource ne peut être connectée qu'à un seul dataset à la fois mais il peut y avoir plusieurs composants 'data aware' connectés dessus.

TDBGrid

Un DBGrid peut être utilisé pour présenter les données récupérées par un Dataset. Le DBGrid a besoin d'une datasource pour se connecter à un dataset. Quand le dataset est ouvert, le DBgrid sera automatiquement peuplé avec les données.

Notre programme

Les bases

Nous essaierons de réaliser un programme basé sur celui here (in Dutch) qui est basé sur original (in English) par Chris.

La fiche principale

Nous utiliserons le même écran principal et construirons toutes les fonctionnalités à partir de rien :) Comme vous le verrez il y a ici beaucoup de choses en moins à prendre en compte, parce que les composants nous débarrassent réellement du plus gros du travail! Donc commençons par faire un écran qui ressemble à ceci.

Trymysql.png
Depuis l'onglet SQLdb-tab plaçons un TMySQLConnection, un TSQLTransaction et un TSQLQuery Components.png sur cette fiche. Ne changez pas les noms par défaut donnés à ces composants. Sauf pour le composant Connection. Pour que cet article puisse s'appliquer à toutes les versions de MySQL, renommez votre MySQL??Connection composant: MySQLConnection1 Nous avons à lier ces composants ensemble pour qu'ils puissent faire leur travail. Dons les proporiétés suivantes ont à être configurées:

Composant Propriété Valeur
MySQLConnection1 Transaction SQLTransaction1
SQLTransaction1 Database MySQLConnection1
SQLQuery1 Database MySQLConnection1
SQLQuery1 Transaction SQLTransaction1

La propriété Transaction de SQLQuery1 sera automatiquement configurée si vous avez configuré la propriété Transaction de MySQLConnection1 en premier. Quand vous aurez configuré ceci, vous noterez que SQLTransaction1.Database a pour valeur MySQLConnection1.

Comme dit plus tôt: Assurez-vous que vous utilisez le composant Connection correct pour la version de votre serveur MySQL.

Le code

Comme vous pouvez voir dans la capture d'écran, les seuls boutons disponibles au démarrage du programme sont "Connect to server" et "Exit". Pour les autres boutons, il nous faut plus d'information donc ils sont désactivés. Nous pouvons décider de désactiver "Connect to Server" jusqu'à ce que l'hôte, le nom d'utilisateur et le mot de passe soit renseignés. Mais j'en ai décidé autrement car notre utilisateur pourrait penser "Rien ne semble possible, donc partons !" :)

Avant que je ne commence à vous donner du code, je souligne qu'il pourrait y avoir plus de gestion des exceptions dans le code. Les sections critiques devraient être placées dans des construction [code]try ... finally[/code] ou [code]try ... except[/code].

Connexion à un serveur

La première chose que nous devons faire est de se connecter à notre serveur. Comme lors de la connexion, nous ne savons pas quelles bases de données sont disponibles sur le serveur, nous demanderons une liste de bases de données lors de la connexion. Cependant, il y a un hic, pour établir la connexion, nous devons entrer un DatabaseName valide dans les propriétés du MySQLConnection. Vous verrez dans le code que j'utilise la base de données "mysql". Cette base de données est utilisée par mysql pour quelque ménage donc elle sera toujours là.

 procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
 begin
   // Check if we have an active connection. If so, let's close it.
   if MySQLConnection1.Connected then CloseConnection(Sender);
   // Set the connection parameters.
   MySQLConnection1.HostName := HostEdit.Text;
   MySQLConnection1.UserName := UserEdit.Text;
   MySQLConnection1.Password := PasswdEdit.Text;
   MySQLConnection1.DatabaseName := 'mysql'; // MySQL is allways there!
   ShowString('Opening a connection to server: ' + HostEdit.Text);
   MySQLConnection1.Open;
   // First lets get a list of available databases.
   if MySQLConnection1.Connected then begin
     ShowString('Connected to server: ' + HostEdit.Text);
     ShowString('Retrieving list of available databases.');
     SQLQuery1.SQL.Text := 'show databases';
     SQLQuery1.Open;
     while not SQLQuery1.EOF do begin
       DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
       SQLQuery1.Next;
     end;
     SQLQuery1.Close;
     ShowString('List of databases received!');
   end;
 end;

La première chose que nous faisons est de vérifier si nous sommes connecté à un serveur, si c'est le cas alors nous appelons une méthode privée "CloseConnection". Dans cette méthode, un peu plus de ménage est fait, comme désactiver les boutons et nettoyer les Combobox et les Listbox. Ensuite, nous définissons les paramètres nécessaires pour se connecter au serveur.

Tout au long de notre programme, vous pouvez voir des appels à ShowString. Cette méthode ajoute une ligne au mémo sur notre formulaire qui agit comme une sorte de journal.

Avec les paramètres définis, nous pouvons nous connecter au serveur. ce qui est fait en appelant :

 MySQLConnection1.Open;

Dans une application propre, il faudrait placer un bloc de gestion d'exception pour montrer à l'utilisateur un message amical si la connexion a échoué. Quand nous sommes connectés, nous voulons obtenir la liste des bases de données du serveur. Pour cela, nous employons un TSQLQuery en précisant dans sa propriété SQL l'ordre "SHOW DATABASES" qui permet d'obtenir la liste des bases de données. Il suffit ensuite d'ouvrir la requête :

 SQLQuery1.Open;

L'ensemble résultat d'une requête peut être examiné à travers la propriété Fields. Comme vous pouvez le voir, nous itérons les enregistrements en appelant :

 SQLQuery1.Next;

Quand nous avons ajouté toutes les bases de données disponibles dans notre Combobox, nous fermons à nouveau le SQLQuery.

Sélection d'une base de données

Si l'utilisateur sélectionne une base de données dans le DatabaseComboBox, nous activons le bouton "Select Database". Dans l'événement OnClick du bouton, nous définissons la propriété DatabaseName du composant MySQLConnection1, et interrogeons la liste des tables. La dernière instruction de la procédure active le bouton "Open Query" donc l'utilisateur peut entrer une requête dans l'EditBox "Command" et l'envoyer au serveur.

 procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
 begin
   // A database has been selected so lets get the tables in it.
   CloseConnection(Sender);
   if DatabaseComboBox.ItemIndex <> -1 then begin
     with DatabaseComboBox do
       MySQLConnection1.DatabaseName := Items[ItemIndex];
     ShowString('Retreiving list of tables');
     SQLQuery1.SQL.Text := 'show tables';
     SQLQuery1.Open;
     while not SQLQuery1.EOF do begin
       TableComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
       SQLQuery1.Next;
     end;
     SQLQuery1.Close;
     ShowString('List of tables received');
   end;
   OpenQueryButton.Enabled := True;
 end;

MySQL a une commande spéciale pour obtenir la liste des tables, comparable à celle pour obtenir les bases de données, "Show tables". Le résultat de cette requête est traité de la même façon comme une liste de bases de données et toutes les tables sont ajoutées au TableComboBox. Vous pourriez vous demander pourquoi nous n'ouvrons pas la connexion à nouveau avant d'ouvrir la requête ? Eh bien, ceci est fait automatiquement (si nécessaire) quand nous activons le SQLQuery.

Champs dans une table

Dans MySQL, vous pouvez encore utiliser une forme de "SHOW" pour obtenir les champs dans une table. Dans ce cas, "SHOW COLUMNS FROM <tablename>". Si l'utilisateur choisit une valeur dans le TableComboBox, le OnChangeEvent de cette ComboBox est déclenché, ce qui remplit le FieldListbox.

 procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
 begin
   FieldListBox.Clear;
   SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text;
   SQLQuery1.Open;
   while not SQLQuery1.EOF do begin
     FieldListBox.Items.Add(SQLQuery1.Fields[0].AsString);
     SQLQuery1.Next;
   end;
   SQLQuery1.Close;
 end;

Aussi bien que pour les noms des champs, l'ensemble résultat contient de l'information sur le type des champs, si le champ fait partie de la clé, si le Null est permis et quelques autres encore.

Montrer les données

Comm nous le disions, nous utiliserons des composants pour nous connecter à la base de données, utilisons alors des composants pour montrer les données. Nous utiliserons une seconde fiche pour montrer une grille avec les données demandées par l'utilisateur. cette fiche sera montrée quand l'utilisateur aura entré un ordre SQL dans l'EditBox "Command" et ensuite cliqué sur le bouton "Open Query". Ceci est le gestionnaire de l'événement OnClick :

 procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 begin
   ShowQueryForm := TShowQueryForm.Create(self);
   ShowQueryForm.Datasource1.DataSet := SQLQuery1;
   SQLQuery1.SQL.Text := CommandEdit.Text;
   SQLQuery1.Open;
   ShowQueryForm.ShowModal;
   ShowQueryForm.Free;
   SQLQuery1.Close;
 end;

La fiche ShowQueryForm ressemble à ceci :

Mysqlshow.png

et contient un :

TPanel Align alBottom
TDataSource
TDBGrid Align alClient
DataSource DataSource1
TButton Caption Close

Le bouton est placé que le panneau. Ce qui se passe dans le OnClick du bouton "Open Query" est ceci : en premier, nous créons une instance de TShowQueryForm. En second, nous définissons la propriété DataSet dans le DataSource par SQLQuery1. Ensuite nous définissons l'ordre SQL du SQLQuery avec ce qu'a entré l'utilisateur dans l'EditBox "Command" et l'ouvrons. Puis la fiche ShowQueryForm est ouverte modalement, ce qui veut dire qu'elle aura le focus de notre application jusqu'à ce qu'elle soit fermée. Quand elle est fermée, nous la libérons et fermons SQLQuery1 à nouveau.

Sources

Les sources de ce projet peuvent être téléchargées depuis ce site.
Pour plus de projets de démo, voyez dans sourceforge.

Voir aussi