Difference between revisions of "MySQLDatabases/fr"

From Free Pascal wiki
Jump to navigationJump to search
m (Fixed syntax highlighting)
 
(27 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 
{{MySQLDatabases}}
 
{{MySQLDatabases}}
  
'''Work in progress'''
+
{{Infobox databases/fr}}
  
==Introduction==
+
= Introduction =
 +
Cette page expliquera comment se connecter à un serveur [[mysql/fr|MySQL]] en utilisant des composants visuels.
  
Dans [[Lazarus Database Tutorial/fr#Lazarus et MySQL|Database tutorial]] 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.
+
{{Note|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.}}
  
==Composants disponibles ==
+
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
  
===Composants MySQL ===
+
Dans le [[Lazarus Database Tutorial/fr#Lazarus et MySQL|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.
Si vous regardez dans le dossier $Lazarus/components/mysql vous trouverez deux packages lazarus. Il y a un package pour la version 3.2x de MySQL (mysql3laz.lpk) et un pour la version 4.x de MySQL (mysql4laz.lpk). Si vous ne l'avez pas déjà fait, installez le package approprié dépendant de la version du serveur. Rappelez vous qu'il n'est pas possible d'utiliser le package pour la version 3 pour se connecter à un serveur faisant tourner la version 4 ou vice-versa. Quand vous aurez installé ce package, vous verrez un nouvel onglet dans la palette de composants, appellée MySQL. Sur cet onglet se trouve deux composants, TMySQLDatabase et TMySQLDataset.
 
  
NB. Avant d'essayer d'installer ces composants dans Lazarus assurez-vous de disposer des bibliothèques clientes de MySQL appropriées sinon Lazarus pourrait ne pas démarrer après l'installation.
+
= Composants disponibles =
  
===SQLdb Components===
+
== Composants SQLdb ==
Another possibility is the installation of the package in the $Lazarus/components/sqldb directory. In this directory you see a package file called sqldblaz.lpk. You need to install this package and the mysql4connlaz.lpk from the $Lazarus/components/sqldb/mysql directory. The first package contains some general components used for all databases. These component are TSQLTransaction and TSQLQuery and can be found on the new SQLdb tab. After installation of the mysql4connlaz.lpk you will find a third component on the SQLdb tab called TMySQLConnection (depicted by a dolphin).
+
Dans les versions même vaguement récentes de Lazarus, les composants SQLDB sont installés par défaut.
  
If you can't find the $Lazarus/components/sqldb/mysql directory and mysql4connlaz.lpk, then this means that you are using a newer version in which mysql4connlaz.lpk merged with sqldblaz.lpk. It is OK, if you instal sqldblaz.lpk, you will get all components mentioned in the same Lazarus IDE toolbar TAB.
+
[[File:sqldbcomponents.png‎]]
  
If you do not know how to install components / packages, have a look at this [[Install Packages/fr|page]] for an "Install Howto".
+
Dans l'onglet SQLDB, vous trouverez :
As the SQLdb components are the more general and can be used for other databases just by replacing the TMySQLConnection with for instance a TIBConnection, we will develop a program with the SQLdb components.
+
* Divers connecteurs, y compris [[TMySQL40Connection/fr|TMySQL40Connection]]..[[TMySQL56Connection/fr|TMySQL56Connection]] (ou même des versions plus récentes) et le plus polyvalent de tous [[TSQLConnector/fr|TSQLConnector]] qui pourrait charger n'importe quel pilote mysql/oracle/postgres/mssql/interbase/firebird/odbc.
 +
* [[TSQLQuery/fr|TSQLQuery]]
  
==Explanation of the used components==
+
Si l'onglet SQLDB manque, consultez la page [[Install Packages/fr|Installation des paquets]] pour le "Comment-faire de l'installation" ('Install howto').
===TMySQLConnection===
 
  
The TMySQLConnection is used to store parameters to connect to the database server. It enables you to set the host to connect to and the userid and password to use in the connection. Another property of the TMySQLConnection is used to indicate the database you want to use. The 'LoginPrompt' is not functional yet, so make sure that next to the HostName and DatabaseName the UserName and Password properties have values as well before you try to open the connection.
+
= Explication des composants utilisés =
Be sure to use a TSQLTransaction as well and connect it to your MySQLConnection by setting the Transaction property, or you will not be able to open a SQLQuery.
+
== 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.
  
Note. In latest SVN version of Lazarus you will find 3 MySQLConnection components. These are TMySQL40Connection, TMySQL41Connection and TMySQL50Connection. Make sure you use the correct one to connect to your server.
+
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.
So if you are running MySQL 4.1 use the TMySQL41Connection.
 
  
===TSQLTransaction===
+
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.
A SQLTransaction is needed for some internal housekeeping. A SQLTransaction is automatically activated when you open a dataset using it. Closing a connection also deactivates the related transaction and closes all datasets using it.
+
Donc si vous utilisez un MySQL 4.1 utilisez un TMySQL41Connection.
  
===TSQLQuery===
+
== TSQLTransaction ==
TSQLQuery is used to execute SQLstatements on the server. You can retrieve data by setting the SQL to some SELECT statement and call the Open method. Or you can manipulate data by issuing some an INSERT, DELETE or UPDATE statement. In the latter case you should not use the Open method but the ExecSQL method.
+
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.
  
===TDataSource===
+
== 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.
  
A datasource provides the connection between the visible data aware components like DBEdit, DBGrid and a dataset. It makes the data available for the data aware components to display.
+
== TDataSource ==
A datasource can only be connected to a single dataset at a time but there can be several data aware components connected.
+
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===
+
== TDBGrid ==
A DBGrid can be used to present the data retrieved by a Dataset. The DBGrid needs a datasource to connect to a dataset. When the dataset is opened, the DBgrid will automatically be populated with the data.
+
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.
  
==Our program==
+
= Notre programme =
  
===The basics===
+
== Les bases ==
We will try to make a program based on the one made [[Lazarus Database Tutorial/nl#Verbinding met MySQL vanuit een Lazarus Programma|here (in Dutch)]] which is based on the [[Lazarus Database Tutorial#Connecting to MySQL from a Lazarus Application|original (in English)]] by [[user:Kirkpatc|Chris]].
+
Nous essaierons de réaliser un programme basé sur celui [[Lazarus Database Tutorial/nl#Verbinding met MySQL vanuit een Lazarus Programma|here (in Dutch)]] qui est basé sur [[Lazarus Database Tutorial#Connecting to MySQL from a Lazarus Application|original (in English)]] par [[user:Kirkpatc|Chris]].
  
===The main form===
+
== La fiche principale ==
We will use the same main screen and build all functionality from scratch :) As you will see there is a lot less to take care of, because the components really take away all the hard stuff! So lets start by making a screen that looks like this.<br> [[image:Trymysql.png]]<br>
+
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.
From the SQLdb-tab place a TMySQLConnection, a TSQLTransaction and a TSQLQuery [[image:Components.png]] on this form. Don't change the default names given to this components. Except for the Connection component. To make this article the same for all versions of MySQL, name your MySQL??Connection component: MySQLConnection1
+
<br/><br/>[[image:Trymysql.png]]<br/>
We have to link these components together so they can do their job. So the following properties have to be set:
+
Depuis l'onglet SQLdb-tab plaçons un TMySQLConnection, un TSQLTransaction et un TSQLQuery [[image: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:
 
{|
 
{|
 
|-
 
|-
| '''Component''' || '''Property''' || '''Value'''
+
| '''Composant''' || '''Propriété''' || '''Valeur'''
 
|-
 
|-
 
| MySQLConnection1 || Transaction || SQLTransaction1
 
| MySQLConnection1 || Transaction || SQLTransaction1
Line 66: Line 69:
 
| SQLQuery1 || Transaction || SQLTransaction1
 
| SQLQuery1 || Transaction || SQLTransaction1
 
|}
 
|}
The Transaction-property of SQLQuery1 will automatically be set if you have set the Transaction property of MySQLConnection1 first. When you set this, you will notice that SQLTransaction1.Database has been set to MySQLConnection1.
+
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.
  
As said earlier: Make sure you are using the correct Connection component for your version of MySQL server.
+
Comme dit plus tôt: Assurez-vous que vous utilisez le composant Connection  correct pour la version de votre serveur MySQL.
  
===The code===
+
== 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 !" :)
  
As you can see in the screen dump the only buttons available on start of the program are "Connect to server" and "Exit". For the other buttons to work we need more information so these are disabled. We could decide to disable "Connect to Server" as well until the information for the host, username and password has been given. I decided against this because our user might think: "Nothing seems possible, so let's hit exit." :)
+
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].
  
Before I start giving you any code I would like to stress that there should be more exception handling in the code. Critical sections should be placed in
+
=== Connexion à un serveur ===
try ... finally
+
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à.
or
+
<syntaxhighlight lang=pascal>
try ... except
 
constructions.
 
 
 
====Connect to a server====
 
The first thing we have to do is get connected to our server. As when connecting we don't know what databases are available on the server we will ask for a list of databases on connecting. However there is one catch, to make the connection we have to enter a valid DatabaseName in the properties of the MySQLConnection. You will see in the code that I am using the "mysql" database. This database is used by mysql for some housekeeping so it will always be there.
 
 
  procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
 
  procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
 
  begin
 
  begin
Line 107: Line 106:
 
   end;
 
   end;
 
  end;
 
  end;
 +
</syntaxhighlight>
 +
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.''
  
The first thing we do is check to see if we are connected to a server, if we are then we call a private method "CloseConnection". In this method some more housekeeping is done. like disabling buttons and clearing comboboxes and listboxes. Then we set the necessary parameters to connect to server.
+
Avec les paramètres définis, nous pouvons nous connecter au serveur. ce qui est fait en appelant :
:''Throughout our program you may see calls to ShowString. This method adds a line to the memo on our form which acts like a kind of log.''
+
<syntaxhighlight lang=pascal>
With the parameters set, we can connect to the server. This is done by calling
 
 
  MySQLConnection1.Open;
 
  MySQLConnection1.Open;
In a proper application one would place this in an exception handling construct to present a friendly message to the user if the connection failed.
+
</syntaxhighlight>
When we are connected we want to get a list of databases from the server. To get data from the server a TSQLQuery is used. The SQL property is used to store the SQL-statement send to the server. MySQL knows the "SHOW DATABASES" command to get the list of databases. So after we have set the SQL-text, we call
+
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;
 
The result set of a SQLQuery can be examined through the fields property. As you can see we iterate through the records by calling
 
SQLQuery1.Next;
 
When we have added all available databases to our combobox, we close the SQLQuery again.
 
  
====Selecting a database====
+
<syntaxhighlight lang=pascal> SQLQuery1.Open;</syntaxhighlight>
If the user selects a database in the DatabaseComboBox we enable the "Select Database" button. In the OnClick event of this button we set the DatabaseName of MySQLConnection1, and request a list of tables. The last statement of this procedure enables the "Open Query" Button, so the user can enter a query in the "Command" Editbox and have it send to the server.
+
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 :
 +
<syntaxhighlight lang=pascal> SQLQuery1.Next;</syntaxhighlight>
 +
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.
 +
<syntaxhighlight lang=pascal>
 
  procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
 
  procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
 
  begin
 
  begin
Line 140: Line 143:
 
   OpenQueryButton.Enabled := True;
 
   OpenQueryButton.Enabled := True;
 
  end;
 
  end;
MySQL has a special command to get a list of tables, comparable to getting the list of databases, "show tables". The result of this query is handled in the same way as the list of databases and all the tables are added to the TableComboBox.
+
</syntaxhighlight>
You might wonder why we do not open the connection again before opening the query? Well, this is done automatically (if necessary) when we activate the SQLQuery.
+
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.
  
====Fields in a table====
+
=== Champs dans une table ===
In MySQL you can again use a form of "SHOW" to get the fields in a table. In this case "SHOW COLUMNS FROM <tablename>". If the user picks a table from the TableComboBox the OnChangeEvent of this ComboBox is triggered which fills the FieldListbox.
+
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.
 +
<syntaxhighlight lang=pascal>
 
  procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
 
  procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
 
  begin
 
  begin
Line 156: Line 161:
 
   SQLQuery1.Close;
 
   SQLQuery1.Close;
 
  end;
 
  end;
As well as the names of the fields, the result set contains information on the type of field, if the field is a key, if nulls are allowed and some more.
+
</syntaxhighlight>
 +
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.
  
====Showing the data====
+
=== Montrer les données ===
Well as we said we would use components to get connected to the database, lets use some components to show the data as well. We will use a second form to show a grid with the data requested by the user. This form will be shown when the user typed a SQL command in the "Command" editbox and afterwards clicks the "Open Query" button. This is the OnClick event:
+
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 :  
 +
<syntaxhighlight lang=pascal>
 
  procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 
  procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 
  begin
 
  begin
Line 170: Line 177:
 
   SQLQuery1.Close;
 
   SQLQuery1.Close;
 
  end;
 
  end;
The ShowQueryForm looks like this:
+
</syntaxhighlight>
 +
La fiche ShowQueryForm ressemble à ceci :
 
<center>[[Image:Mysqlshow.png]]</center>
 
<center>[[Image:Mysqlshow.png]]</center>
and contains a
+
et contient un :
 
{|
 
{|
 
|-
 
|-
Line 185: Line 193:
 
| TButton || Caption || Close
 
| TButton || Caption || Close
 
|}
 
|}
The button is placed on the panel.
+
Le bouton est placé que le panneau.
What happens in the "Open Query" OnClick is this. First we create an instance of TShowQueryForm. Secondly we set the DataSet property of the DataSource to our SQLQuery1. Then we set the SQLQuery SQL command to what the user entered in the "Command" editbox and open it. Then the ShowQueryForm is shown modally, this means that it will have the focus of our application until it is closed. When it is closed, we "free" it and close SQLQuery1 again.
+
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 [http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download site].
 +
<br/>Pour plus de projets de démo, voyez dans [http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359 sourceforge].
  
==Sources==
+
= Voir aussi =
The sources for this project can be downloaded [http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download here]
+
* [[mysql/fr|mysql]]
For more demo projects see [http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359 sourceforge]
 

Latest revision as of 08:39, 21 February 2020

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