Recherche
1 connecté

  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 :

  • Placez un DataSource sur notre dataModule et le connecter à notre SQLClientDataSet via sa propriété DataSet.

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 ?


Retour au sommaire