Difference between revisions of "MySQLDatabases/fr"
LazarusBob (talk | contribs) |
LazarusBob (talk | contribs) |
||
Line 49: | Line 49: | ||
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. | 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 [[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]]. | |
− | === | + | ===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> | 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> | ||
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 | 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 |
Revision as of 13:40, 6 August 2008
│
Deutsch (de) │
English (en) │
français (fr) │
日本語 (ja) │
polski (pl) │
slovenčina (sk) │
Work in progress
Introduction
Dans 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.
Composants disponibles
Composants MySQL
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 SQLdb
Une autre possibilité est l'installation du package su dossier $Lazarus/components/sqldb. Dans ce dossier vous trouverez un package appelé sqldblaz.lpk. Vous devez installer ce package et le mysql4connlaz.lpk du dossier $Lazarus/components/sqldb/mysql. Le premier package contient quelques composants génériques utilisés par toutes les bases de données. Ces composants sont TSQLTransaction et TSQLQuery et peuvent être trouvés dans le nouvel onglet SQLdb. Après installation du mysql4connlaz.lpk vous trouverez un troisième composant sur l'onglet SQLdb appelé TMySQLConnection (représenté par un dauphin).
Si vous ne pouvez pas trouver le dossier $Lazarus/components/sqldb/mysql ni mysql4connlaz.lpk, cela signifie que vous utilisez une version plus récente dans laquelle mysql4connlaz.lpk est incluse danssqldblaz.lpk. C'est Ok, si vous installez sqldblaz.lpk, vous aurez tous els composants mentionnés dans le même onglet de l'IDE.
Si vous ne savez pas comment installer des composants/packages, jetez un oeil à ceci page pour un "Install Howto".
Etant donné que les composants SQLdb son,t bien plus génériques et qu'ils peuvent être utilisés avec d'autres bases de données en remplaçant simplement la TMySQLConnection avec par exempke une TIBConnection, nous développerons un programme avec les composants SQLdb.
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 SECLECT 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
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.
From the SQLdb-tab place a TMySQLConnection, a TSQLTransaction and a TSQLQuery 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
We have to link these components together so they can do their job. So the following properties have to be set:
Component | Property | Value |
MySQLConnection1 | Transaction | SQLTransaction1 |
SQLTransaction1 | Database | MySQLConnection1 |
SQLQuery1 | Database | MySQLConnection1 |
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.
As said earlier: Make sure you are using the correct Connection component for your version of MySQL server.
The code
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." :)
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
try ... finally
or
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); 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;
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.
- 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.
With the parameters set, we can connect to the server. This is done by calling
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. 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
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
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.
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 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. 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.
Fields in a 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.
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;
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.
Showing the data
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:
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;
The ShowQueryForm looks like this:
and contains a
TPanel | Align | alBottom |
TDataSource | ||
TDBGrid | Align | alClient |
DataSource | DataSource1 | |
TButton | Caption | Close |
The button is placed on the panel. 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.
Sources
The sources for this project can be downloaded here For more demo projects see sourceforge