I. Partie 1/2 - Première connexion à partir de DBExpress▲
I-A. La palette de DBExpress▲
Je vais d'abord tester une connexion à partir de l'IDE de Delphi 6, juste pour voir si tout fonctionne bien. Je pose donc un TSQLConnection sur la feuille de ma nouvelle application, je double clique dessus et j'obtiens un gestionnaire de connexion pour DBExpress ressemblant à celui-ci :
Le même qu'avec Kylix :-)) Rien de bien sorcier à configurer, les boutons + et -, servent à ajouter et retirer des connexions. Il suffira donc d'en créer une du genre de celle au-dessus. EasyPHP ayant configuré MySQL pour nous, nous calerons simplement notre configuration sur celle existante. Je valide, et dans l'inspecteur d'objets pour plus de souplesse, je passe le LoginPrompt du TSQLConnection à false. Instant de vérité : on double clique sur connect et… TRUE. :-))) Une remarque malgré tout, dans mon cas le répertoire « TestD6 », c'est-à-dire la base existait déjà, il semble que le nom d'une base soit nécessaire pour une connexion, il suffit donc pour la première connexion d'utiliser une base existante. MySQL semble en créer une à son nom, il faut donc l'utiliser par défaut pour une première connexion. Concrètement DataBase = C:\EasyPHP\mysql\data\mysql. Plus tard je testerai le travail en réseau, pour le moment le local suffira. Il va donc falloir créer une base, se connecter dessus, puis créer une table, et enfin insérer quelques données.
D'abord une Interface(minimaliste) pour les tests, avec un petit TMemo, un TBitBtn, et un TSQLQuery. Le composant TSQLConnection, était déjà utilisé.
Le menu fichier sert à charger des commandes externes, le bouton clear se passe de commentaire et le bouton Execute appelle la procédure Execmemo, qui nous permettra d'interagir avec MySQL
La procédure suivante permettra le changement de connexion à la volée, et nous connectera sur la base passée en paramètre
I-B. Créer une base▲
Une base pour MySQL ce n'est qu'un répertoire ! Lors de la première connexion, j'ai utilisé la base MySQL, puis à partir de cette connexion, j'ai créé la base 'TESTD6'. La commande SQL suivante CREATE
DATABASE
TESTD6 saisie dans le mémo et exécution.
I-C. Créer une table▲
Rien de spécial, mais, je vais reprendre la structure d'une table existante sous IB 6, comme cela j'aurai une quantité de données pour faire mes essais. Les index et la clé primaire seront recopiés à l'identique d'une table vers l'autre, au passage je note que MySQL ne semble pas avoir d'index descendants ?
C'est un peu monstrueux pour un test, mais je veux vraiment reprendre une table existante.
I-D. Des données▲
Pour ce qui est des données je vais les exporter de ma table Interbase vers un fichier texte, avec une structure genre 'INSERT INTO..'. La procédure suivante servira à l'importation.
Cette commande est exécutée à partir d'un menu, il s'agit d'une boucle qui charge ligne à ligne tous les enregistrements. Tout se passe très bien. J'importe donc une table de 25 000 enregistrements, sur ce genre de plaisanterie MySQL se montre plus rapide qu'Interbase. Comme la version que je possède ne gère pas les transactions, je suppose que ceci explique cela ! De toute façon, normalement la vitesse d'insertion n'est pas un critère fondamental.
Grâce à Delphi 6 et à DBExpress, nous avons donc maintenant la possibilité de nous connecter à MySQL en natif. Kylix offrant la même chose sous Linux, le choix d'Interbase ou de MySQL, devient une évidence pour le développeur Delphi/Kylix. DBExpress permet justement de rendre la méthode d'accès homogène entre Windows et Linux. C'est à prendre en considération lors d'un nouveau développement, et à mon goût il s'agit d'une grande avancée.
Des commandes simples comme des select
*
from
FICHES where
… passent sans problème. J'ajoute des DBedit pour visualiser le résultat, tout fonctionne. Jusqu'ici DBExpress remplit son contrat. Les ennuis commencent lors de la pose d'un TDBGrid… DBExpress est unidirectionnel, et les déplacements dans l'ensemble de résultats du TSQLQuery ne peuvent se faire que dans le sens de la progression. Au début j'ai trouvé cela frustrant, finalement Delphi 6 nous offre plusieurs solutions pour outrepasser cet état unidirectionnel Une des ces solutions, sort un peu du cadre de DBExpress,donc pour la partie 2, ajout d'un DBGrib et déplacement dans les données :-))
Le projet devrait à terme me fournir un substitut à PhpMyAdmin et son interface Web. À l'heure ou j'écris ses lignes l'aspect est du genre de celui de IB Expert pour ceux qui connaissent, l'aspect uniquement, malheureusement pas encore les fonctionnalités. Au passage je note que bien des choses ont changé dans Delphi, la gestion des applications MDI semble meilleure par exemple. De toute façon le constat est simple plus je passe du temps sur D6 et plus le progrès me semble essentiel.
En conclusion le vainqueur n'est pas MySQL ni même Interbase, mais bien le développeur lui-même qui a, avec Delphi 6, le meilleur outil de programmation qu'il m'a été donné de voir. Delphi 6 semble bien être un grand cru, les différences entre deux versions sont parfois ténues, cette fois il s'agit d'un fossé, du fossé de l'évolution :-) Quel développeur n'a pas rêvé d'un code réutilisable d'une plate-forme à l'autre ? C'est parfois possible, mais rarement pour les bases de données, Delphi 6 par le biais de DBExpress nous l'offre, certes des habitudes sont à oublier, d'autres à acquérir, malgré tout, le jeu me semble bien en valoir la chandelle.
II. Partie 2/2▲
Dans la première partie, j'ai expliqué comment établir une connexion sur une base MySQL à l'aide de DBExpress. Malheureusement si la connexion est simple le résultat est unidirectionnel. Ce n'est pas une fatalité, voici déjà deux façons d'obtenir un résultat plus conventionnel.
II-A. Utilisation du composant TSQLClientDataSet▲
Il est sur la palette DBExpress, très simple à l'utilisation, il faut juste référencer le TSQLConnection dans la propriété DBConnection. La commande SQL est à inscrire dans la propriété CommandText. C'est tout !
Les tests sur ma petite base MySQL semblent montrer que cela fonctionne. Finalement, c'est simple et efficace c'est la méthode la plus directe pour obtenir un ensemble de données qui soit « navigable » . Les tests avec un TDBNavigator ou TDBGrid s'avèrent très satisfaisants. Il faut noter que l'aide indique que les relations maîtres/détails ne sont pas très conseillées.
II-B. Utilisation du composant TDataSetProvider▲
Sur la Palette DataAccess, notre bon vieux TDataSource est toujours là, mais il est maintenant accompagné d'un TDataSetProvider et d'un TClientDataSet. Ces deux composants permettent apparemment d'utiliser diverses sources de données, pas seulement des bases de données, mais aussi une source XML ou des Dataset de la palette ADO ou encore Interbase, et d'effectuer la liaison avec un TDataSource. Il est donc possible de visualiser différentes sources de données comme une base et de les manipuler de la même façon, Insert, Delete, etc. Dans le cas d'un résultat de requête unidirectionnel, il est possible d'utiliser ces composants pour contourner cet état. L'utilisation et la maîtrise de cet aspect sont plus complexes, le DataSet Provider se charge d'établir la liaison et de maintenir une « bulle » de données dans un « cache ».
Cette vue montre le fonctionnement de la liaison à ma table MySQL. En partant du haut le premier composant SQLConnection établit la liaison avec le serveur MySQL. SQLQuery par le biais d'une requête, me retourne un ensemble de données unidirectionnel, non navigable donc. C'est là qu'intervient le DataSetProvider qui récupère l'ensemble de données fourni par le SQLQuery et le met en cache. Dans cette utilisation, le composant ClientDataSet1 ne permet pas l'utilisation de sa propriété CommandText, car il reprend la commande SQL du SQLQUery, mais se fournit en données auprès du DataSetProviser. Cet ensemble de données navigable et modifiable est distribué par le DataSource traditionnel que nous connaissons tous. Une remarque il s'agit donc d'un ensemble de données mis cache par le DataSetProvider, cette particularité autorise une grande souplesse d'utilisation. Les modifications auront besoin d'être validées, pour être reportées dans la base de données, ce tampon permet de simuler une transaction, pour une base de données qui ne possèderait pas cette fonctionnalité. De plus le ClientDataSet possède une propriété PacketsRecords qui permet de spécifier le volume de données qui doit être manipulé à chaque fois. Encore une fois cette façon de procéder reste compatible Kylix, c'est vraiment le côté primordial de DBExpress.
II-C. Conclusion▲
DBExpress est puissant, mais il est plus complexe qu'un accès direct à l'aide de composants spécifiques ou à travers le BDE, mais sa souplesse et sa portabilité vers Kylix méritent les petits efforts d'accoutumance qu'il demande. Delphi 6 est confortable et rapide, plus on s'en sert et moins il est possible de s'en séparer, dans mon cas j'ai eu toutes les peines du monde à rédiger ce papier, à la place j'ai fait ça, un début de projet pour administrer mes tables MySQL. Normalement, bien que je n'aie pas encore testé, cela devrait être portable vers Kylix sans problème. Quel environnement de programmation peut me permettre un accès direct à MySQL et une portabilité Windows/Linux ? Quand je pense qu'au début j'ai utilisé Delphi par hasard, cette fois-là, je peux dire que j'ai eu de la chance :-))