|
Fermer
Requêtes paramétrées SQL
Utilisation des composants DbExpress pour
lire une base MySQL (D6 et plus).
Retour au
sommaire
Introduction :
Bon, j'ai pas mal galéré pour réussir à faire
quelque chose qui donne satisfaction. Les composants DBExpress
sont relativement nouveaux pour moi. L'aide n'est pas très
explicite et je n'ai rien trouvé de satisfaisant sur le net.
Bref, pas mal de tâtonnements. Il faut donc considérer ce
tutorial comme étant en BétaTest. Je suis preneur de toutes les
observations. Je m'interroge en particulier sur 2 trucs (voir en
fin de cette page).
Depuis la version 6 (pro et +), Borland a
introduit des composants DbExpress. Ces composants permettent
entre autres d'attaquer des bases MySQL.
Le site http://phidels.com étant entièrement
basé sur du PHP + MySQL, j'ai voulu tester la chose.
Pré-requis :
Avoir une version de Delphi qui possède
les composants DbExpress (D6 pro et +)
Avoir MySQL installé sur votre poste.
Personnellement, je l'avais installé via le
"pack" EasyPHP (gratuit) sur http://www.easyphp.org/
Pour télécharger uniquement MySQL : http://www.mysql.com/
Avoir créé une base de données qui
vous servira de support à l'exemple suivant.
Personnellement, pour ce genre de manip, j'utilise
phpMyAdmin livré avec EasyPHP.
Lecture d'une base MySQL existante :
Connexion à la base :
Comme d'habitude, on va construire un exemple.
Ouvrez Delphi, commencez un nouveau
projet.
Allez, on va prendre de bonnes habitudes,
on va ouvrir un DataModule. (Fichier, Nouveau, Module de
données).
Sur ce Module de données, placez un
composant SQLConnection.
Dans la "vue arborescente des objets", on voit
notre SQLConnection mais avec un point d'interrogation
devant. Normal, il n'est pour l'instant connecté à
aucune base.
Vérifiez que votre votre serveur MySQL
est lancé.
Double cliquez sur votre SQLConnection
Cliquez sur pour créer une
nouvelle connexion
Donnez MYSQL comme nom de pilote.
Choisissez un nom pour votre connexion (ici : testmysql)
Dans le champ Database, placez le nom de
votre base de donnée (ici MaBaseMySQL). Il faut se
rappeler que le nom d'une base de données en MySQL est
en réalité le nom du dossier dans lequel sont placés
ses fichiers.
Dans le champ HostName, entrez le nom
réseau de l'ordi qui contient la base. Si c'est l'ordi
sur lequel tourne le programme, vous pouvez mettre
localhost comme nom.
Effacez la valeur qui se trouve dans le
champ LocaleCode. (à noter qu'un lecteur m'a fait la
remarque suivante : Sans
mettre un nom de user, la manip plante, alors qu'en
mettant simplement le user à root, la connexion se fait.
Chez moi, pas besoin...
-
Cliquez sur afin de tester la
connexion. Vous devez obtenir :
A noter que le point d'interrogation a
disparu et que Delphi a
rempli pour vous, entre autres, les champs
ConnectionName, DriverName... de votre SQLConnection.
Si vous n'en avez pas besoin et si vous
ne souhaitez pas voir s'afficher la boite de dialogue
demandant l'utilisateur et le mot de passe, mettrez à
False sa propriété LoginPrompt.
Connection d'un ensemble de données (DataSet)
à l'aide d'un SQLClientDataSet
Placez un SQLClientDataSet sur le DataModule
Indiquez-lui, via sa propriété
DBConnection, qu'il doit utiliser votre SQLConnection
pour se connecter à la base .
Placez un SELECT dans la propriété
CommandText du SQLClientDataSet. Par exemple : SELECT *
FROM unetable
où unetable est une table de votre base.
Accéder aux données.
Là, on en est à un stade déjà vu dans les
autres tutoriaux BDD :
Actuellement, le diagramme de nos connexions
correspond à ceci :
Sur votre fiche (Form1) placez un DBGrid
et un DBNavigator.
Dans le uses de la form1, ajoutez le nom
de l'unit corespondant à votre DataModule2 (Unit2 si
vous n'avez rien renommé)
Dans la propriété DataSource du
DBNavigator, sélectionez votre DataSource.
Dans la propriété DataSource du DBGrid,
sélectionez votre DataSource.
Testez.
Vérifiez que la propriété Connected de votre
SQLConnection est à True. Placez la propriété Active de votre
SQLDataSet à True. Vous devez voir vos DBEdit se remplir.
i vous avez un message d'erreur du style ,
vérifiez la clef LocaleCode en double cliquant sur le
SQLConnection (l'effacer). Vérifiez également la valeur de
LocaleCode dans la propriété Params du SQLConnection
(l'effacer).
Pour être plus propre, et prendre de
bonnes habitudes, remettez Connected du SQLConnection à
False. Cela fait également passer la propriété Active
du SQLDataSet à False.
Dans l'événement OnShow de la fiche
Form1, placez le code suivant :
procedure TForm1.FormShow(Sender: TObject);
begin
DataModule2.SQLConnection1.Connected:=True;
DataModule2.SQLClientDataSet1.Active:=True;
end;
|
Rendre les données modifiables.
Actuellement, si vous modifiez une donnée dans
votre DBGrid, vous aurez beau cliquer sur le V (validation) du
DBNavigate, lorsque vous fermez le programme et que vous l'ouvrez
de nouveau, vous voyez que vos modifications n'ont pas été
écrites dans la base.
Ajoutez un bouton sur votre fiche. Implémentez
son événement OnClick comme suit :
procedure TForm1.Button1Click(Sender: TObject);
var MaxErrors:integer;
begin
MaxErrors:=1;
{extrait de l'aide : MaxErrors indique le nombre maximum d'erreurs tolérées
par le fournisseur avant d'interrompre l'opération d'actualisation.
Initialisez MaxErrors à 1 pour indiquer qu'il n'y a pas de limite
au nombre d'erreurs.}
{Pour MySQL, à ce que l'on m'a dit, MySQL ne tolère qu'une seule erreur.}
DataModule2.SQLClientDataSet1.ApplyUpdates(MaxErrors);
end;
|
En cliquant sur le bouton, les éléments
modifiés iront vers la base de données.
Nota :
Dans cette configuration, si vous voulez ajouter
un DBEdit ou autres DBMemo sur votre fiche, pour le connecter, il
faudra, comme pour le DBGrid, sélectionner le datasource pour sa
propriété DataSource. Il faudra aussi sélectionner le champ
que vous voulez voir, et ce via sa propriété DataField.
Attention, vous ne pourez voir les champs sélectionnables dans
la liste de choix et donc vous ne pourrez sélectionner ce champ
que si le SQLConnection1.connected est à true et le
SQLClientDataSet1.Active est à true (les modifier dans
l'inspecteur d'objet. Une fois la manip faite, les remettre à
False.)
Questions a qui a une réponse... :
Je l'ai dit au départ, il faut donc considérer
ce tutorial comme étant en BétaTest. Je suis preneur de toutes
les observations. Je m'interroge en particulier sur 2 trucs :
Pourquoi, dans le DBNavigator, lorsque
l'on clique sur , on a un message
d'erreur :
A quoi sert exactement la clef LocalCode
?
|