Une mini base de données intégrée dans Delphi
Par Dany Leblanc le samedi 30 août 2008, 09:12 - Delphi - Lien permanent
Il n'est pas rare d'avoir à stocker quelques informations nécessaires à notre application. On serait bien tenté d'utiliser une base de données pour profiter de sa structuration, mais alors cela nous obligerait à installer un serveur Firebird, MySQL ou autre lors du déploiement de notre travail ce qui n'est pas forcément intéressant, surtout si notre application n'est pas une application de gestion et/ou n'a pas déjà recours à une base de données. C'est là qu'intervient une fonctionnalité bien intéressante, apparue avec Delphi 7 : MyBase.
Qu'est-ce que MyBase ? C'est un petit moteur de base de données mémoire dont les données peuvent être sauvegardées, soit au format XML, soit dans un format Binaire. Selon les spécifications annoncées, la limite de ces tables mémoire serait de 15000 enregistrements tout de même. En fait il n'y a pas de réelle limite de taille de fichier, hormis celle éventuellement imposée par l'OS, mais à partir de 15000 enregistrements les temps de réponses se dégradent trop pour être une solution acceptable. Mieux vaut donc réserver cette base de données à une utilisation limitées, elle ne remplacera jamais une vraie Base de données comme Firebird.
I - Mise en oeuvre de Mybase
Creation de la structure de notre table
Cette fonction se trouve incluse dans le composant TClientDataset de la palette "Accès aux données". Posons le sur un module de données (par exemple), double-cliquons dessus, la fenêtre contenant la liste des champs s'affiche, vide pour le moment. Appuyons sur la touche Inser, le dialogue de création de champs apparaît alors :
Ajoutons donc trois champs : Nom, Prénom et EMail :
Il ne reste plus qu'à renommer le composant, à effectuer un click droit dessus, et à choisir l'option "Créer un ensemble de données" :
Voilà, nous avons indiqué à Delphi que ce ClientDataset serait une table Mybase.
Ajouter des données à notre table
Nous allons maintenant écrire une petite méthode pour ajouter des enregistrements à cette table :
procedure TDataModule2.AjouterEnregistrement(Nom, Prenom, eMail: string); begin carnet.Open; //-> On ouvre la table carnet.Insert; //-> On indique qu'on va faire un ajout CarnetNom.Value := Nom; // CarnetPrenom.Value := Prenom; //--> On affecte les données dans les champs CarnetEMail.Value := eMail; Carnet.Post; //--> et Enfin on Valide l'enregistrement end;
Revenons maintenant à notre formulaire, posons un bouton dessus et ajoutons ces 2 lignes dans son évennement OnClick :
procedure TForm1.btnRemplirClick(Sender: TObject); begin DataModule2.AjouterEnregistrement( 'Kifoui', 'Yamamoto', 'yamamoto@kifoui.com'); DataModule2.AjouterEnregistrement( 'Bertrand', 'Labevue', 'bertrand@labevue.com'); end;
Voilà nous avons ajouté deux enregistrements à notre table MyBase. Notez qu'il aurait été préférable de faire une petit formulaire pour permettre à l'utilisateur d'ajouter lui même ses valeurs dans la table, mais là n'était pas le sujet de ce tutoriel.
Visualisons notre table
Tout cela est bien joli, mais comment pouvons nous voir le contenu de la table que nous venons de créer ?
Et bien le TClientDataset hérite de TDataset, il en a donc tous les comportements. Donc pour visualiser le contenu de notre table, rien de plus simple : Posons un TDataSource, relions le à notre Table MyBase. Puis ajoutons un TDBGrid et enfin un bouton. Sur l'évennement OnClick de ce bouton, ajoutons juste cette petite ligne de code :
procedure TForm1.btnVoirClick(Sender: TObject); begin grdCarnet.DataSource := dsCarnet; end;
Voilà, c'est fait ! Executons notre application, cliquons sur le bouton Remplir, puis sur le bouton Voir, voici le résultat :
Que se passe-t-il, mes données ne sont pas conservées ?
Aïe ! j'e viens de quitter l'application, et lorsque je la relance, les données ne sont plus là, qu'avons nous donc oublié ?
Pas de panique, comme nous l'avons vu au début le TClientDataset est une table mémoire, nous avons donc bien ajouté des enregistrements à notre table, mais dans son espace mémoire. Donc une fois l'application quittée cet espace est liberé et hop, plus de données dans notre table.
Il va donc nous falloir enregistrer ce que nous avons inséré. Pour cela rien de plus simple : posons un nouveau bouton Enregistrer, et ajoutons ce code dans son évennement OnClick :
procedure TForm1.btnEnregistrerClick(Sender: TObject); begin with TSaveDialog.Create( Application) do begin try if Execute then DataModule2.Carnet.SaveToFile( FileName, dfXML); finally Free; end; end; end;
Le TClientDataSet a donc une méthode SaveToFile permettant de rendre persistantes les données de notre table. Dans l'exemple ci dessus, j'ai choisi le format XML car il est pratique et offre la possibilité d'être facilement visualisé dans n'importe quel bon éditeur, et même dans notre navigateur préféré. Mais il existe aussi un format binaire (dfBinary) qui est non lisible mais plus léger, donc plus rapide à charger en cas de volume important de données.
De même ce composant possède une propriété LoadFromFile qui permet de recharger le contenu du fichier dans la table mémoire.
Il ne nous reste plus qu'à déployer l'application
Rien de bien particulier pour cela, sinon qu'il faut penser à joindre la librairie Midas.dll avec notre projet. Voilà, c'est tout.
2 - Conclusion
Voilà un composant bien pratique qui peut servir dans bien des cas, mais il faut tout de même garder en tête qu'il faut le réserver à de petits volumes et lorsque nous ne voulons pas déployer un SGBD. Pour les détenteurs d'une version récente de Delphi (D2007 et supérieur), je pense qu'il sera même préférable d'utiliser blackfishSQL, ce dernier offrant la possibilité d'utiliser du SQL et étant performant avec des volumes de données plus importants.
Vous pouvez télécharger les sources du projet ici : Carnet.zip