1 - Introduction
Cet article va vous indiquer comment gérer des données en
utiliser Interbase fourni avec Delphi 8 en utilisant dbExpress.
Notre but étant ici de vous montrer comment utiliser dbExpress en Delphi 8, nous
n'avons pas présenté un tutorial intégral. Les articles précédents contiennent aussi
des exemples plus nombreux (automatisation, script) ou programmés de façon
légèrement différente (sous procédures différentes). Parcourez-les au besoin
avant ou après cet article.
Pour cette présentation, nous allons simplement utiliser une base crée auparavant.
Nous pourrions utiliser celle installée par Borland, mais le chemin dépendant de
votre machine ("program files" avec Windows US ou "fichiers communs"
avec Windows Français), nous préférons rapatrier la base dans un chemin proche de
notre projet Delphi.
Par conséquent:
2.2 - La connection
Pour nous connecter à une base Interbase nous allons utiliser un
composant SqlConnection.
le résultat est:
fermez l'éditeur en cliquant "OK"
sélectionnez dans l'Inspecteur d'Objet la propriété LoginPrompt et basculez sa valeur sur False
Notez que:
• lorsque nous avons créé la base, nous avons choisi le "dialecte 3". C'est la
version Sql du moteur
• lorsque nous connectons la base, nous avons choisi le "dialecte 3": c'est le
dialecte du client Interbase.
• la connection est le test IMPERATIF pour vérifier que nous pouvons
travailler en Interbase. Nous recommandons d'effectuer cette connection
systématiquement avant de poser des tonnes de composants sur
la tForm ou d'écrire des milliers de lignes
• si nous connectons la base en mode conception, Delphi ouvrira aussi la base
lorsque l'exécution sera lancée. Ces deux connections sont comptabilisés
par le gestionnaire de licences Interbase comme 2 connections séparées (ce
sont bien deux processus Windows).
Pour cela nous devons envoyer une requête en langage SQL vers
le Serveur Interbase.
Il suffit donc de choisir un nom de table, et le nom de chaque colonne avec son
type.
• nous pouvons utiliser Add pour ajouter une ligne de requête, Text pour
affecter une requête, Clear pour purger tout texte antérieur, ou
même LoadFromFile pour lire un fichier .txt contenant la requête:
SqlQuery1.Sql.LoadFromFile('cree_formation.txt');
La mise en page n'a aucune importance pour le Serveur: la requête peut être
répartie en plusieurs lignes:
SqlQuery1.Sql.Add('CREATE TABLE');
SqlQuery1.Sql.Add(' formations ');
SqlQuery1.Sql.Add(' (f_numero INTEGER, f_nom CHARACTER(11))');
• nous pouvons entrer la requête en utilisant l'Inspecteur d'Objet. Si nous
cliquons sur Sql, Delphi affiche:
• nous pouvons aussi créer la String en plusieurs étapes par toutes les
primitives de String telles que la concaténation, Insert, le test par Pos ou
autre. Par exemple:
3.3 - L'application
Pour créer notre table
SqlConnection1
placez un tButton sur la Forme et créez sa méthode OnClick. Placez-y les instructions de
création:
with Sql do
begin
Clear;
Add('CREATE TABLE '+ k_table_name);
Add(' ('
+' f_numero INTEGER,');
Add(' f_nom CHAR(28),');
Add(' f_jours SMALLINT,');
Add(' f_prix NUMERIC(5, 2)');
Add(' )');
end; // with Sql
Try
SqlConnection1.Open;
ExecSql;
display(' ok');
except
on e: Exception do
display(' *** pb_create '+ e.Message);
end;
end; // with SqlQuery1
end; // create_table_Click
au moteur.
Comme les instructions pour envoyer du SQL vers le moteur sont toujours les
mêmes (SqlQuery.Sql.Clear, SqlQuery.Sql.Add, SqlQuery.ExeSql) et que seul le
texte de la requête change, nous avons crée un procédure paramétrée:
with Sql do
begin
Clear;
Add(p_sql_request);
end; // with Sql
Try
SqlConnection1.Open;
ExecSql;
display(' ok');
except
on e: Exception do
display(' *** pb_create '+ e.Message);
end;
end; // with SqlQuery1
end; // execute_sql_request
Notre requête ouvre la table, mais n'affiche rien: si notre table existe tout se passe
bien, sinon nous aurons une exception. Nous verrons d'ailleurs comment afficher
une Table SELECT en détail plus bas.
3.5 - Effacer une table
Pour supprimer une Table, il faut exécuter la requête:
Donc:
3, Interbase Delphi
De façon détaillée:
placez un tButton sur la Forme et créez sa méthode OnClick. Placez-y les instructions d'ajout:
procedure TForm2.insert_one_Click(Sender: TObject);
begin
execute_sql_request(
'INSERT INTO '+ k_table_name
+ ' (f_numero, f_nom, f_jours, f_prix)'
+ ' VALUES (6, '+ QuotedStr('Asp et Delphi')+ ', 3, 1400.40)')
end; // insert_one_Click
Nous pouvons aussi paramétrer l'insertion pour ajouter plusieurs lignes plus
facilement:
begin // fill_table_Click
insert_generic(1, 'Initiation Delphi', 3, 1400);
insert_generic(2, 'Bases de Données Delphi', 3, 1400);
insert_generic(3, 'Interbase Delphi', 3, 1400);
insert_generic(4, 'Composants Delphi', 3, 1400);
insert_generic(5, 'UML et Patterns en Delphi', 3, 1400);
insert_generic(6, 'Initiation Pascal', 4, 1900);
end; // fill_table_Click
Nous allons nous intéresser dans la suite de cet article aux lectures et
modifications de tables Interbase en utilisant le tClientDataSet.
5 - Le mode nomade
5.1 - Principe
Nous pouvons sauvegarder les données stockées dans un tClientDataset dans un
fichier disque, dans un format .XML ou un format binaire équivalent. Pour cela, il
suffit d'appeler
tClientDataset.SaveToFile(nom_fichier);
tClientDataset.LoadFromFile(nom_fichier);
Bien plus intéressant encore, les modifications apportées aux données, que celles-ci
proviennent d'un chargement depuis le Serveur ou depuis un fichier local, sont
sauvegardées en mémoire, et mémorisées sur disque. Pour modifier les données
du Serveur, il suffit d'appeler:
tClientDataset.ApplyUpdates(nombre_erreurs);
5.2 - La sauvegarde
Commençons par présenter la sauvegarde:
dans l'application précédente, posez un autre tButton sur la Forme, nommez-le "save_cds_" et
placez-y l'instruction de sauvegarde:
5.3 - Le chargement
Pour bien démontrer que le travail en mode nomade ne nécessite aucune
connexion, nous allons construire une nouvelle application qui charge, modifie, et
sauve les données, sans aucun lien avec le Serveur Interbase. Un peu comme un
commercial qui, après avoir sauvegardé le matin les données de ses clients sur son
portable, va récupérer les commandes chez ses clients durant la journée.
Pour cela:
dans l'application précédente, posez un autre tButton sur la Forme, nommez-le "load_cds_" et
placez-y l'instruction de chargement:
Le reste étant identique, nous ne ferons que l'utiliser ici. Pour cela:
ajoutez l'importation des unités u_c_net_cds_table et u_c_net_cds_analyze_cds
display_line;
l_c_table.display_formatted_line_list;
l_c_table.Free;
Free;
end; // with c_analyze_xml
end; // display_xml_Click
compilez et exécutez. Cliquez sur le bouton: les données du fichier .XML sont affichées
dans Memo1:
5.5 - Modifications
Pour pouvoir sauvegarder les modifications effectuées en mode nomade, il faut
aussi pouvoir sauvegarder:
dans l'application précédente, posez un autre tButton sur la Forme, nommez-le "save_cds_" et
placez-y l'instruction de sauvegarde, comme pour la précédente application:
lancez l'applications
chargez le fichier .XML
6.2 - ApplyUpdates
Voici une application qui effectue cette mise à jour.
sélectionnez dans la page "Data Access" de la Palette le composant ClientDataSet, posez-le sur
la tForm et dans sa propriété ProviderName sélectionnez DatasetProvider1
sélectionnez dans la page "Data Access" de la Palette le composant DataSource, posez-le sur
la tForm et dans sa propriété DataSet sélectionnez ClientDataSet1
sélectionnez dans la page "Data Controls" de la Palette le composant dbGrid, posez-le sur
la tForm et dans sa propriété DataSource sélectionnez DataSource1
Puis
ClientDataset1.LoadFromFile(k_save_dataset_name);
posez un tButton sur la Forme, nommez-le "apply_updates_", et tapez le code qui envoient les
modifications vers le Serveur:
Et finalement pour détecter les erreurs que ApplyUpdates pourrait provoquer, nous
demandons à notre application de surveiller la mise à jour:
sélectionnez ClientDataset1
procedure TForm2.ClientDataSet1ReconcileError(
DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
display('reconcile '+ e.Message);
end; // ClientDataSet1ReconcileError
A présent, en avant:
compilez et exécutez
cliquez "load_cds_"
cliquez "apply_updates_"
Nous n'avons pas traité ici la gestion des erreurs (essentiellement ce qui se passe si
quelqu'un d'autre a modifié les données avant nous) ou si nous souhaitons affiner
les règles de mise à jour. Voyez l'articles sur Interbase dbExpress à ce sujet
Comme d'habitude:
Nom :
E-mail :
Commentaires * :
• et si vous avez apprécié cet article, faites connaître notre site, ajoutez un
lien dans vos listes de liens ou citez-nous dans vos blogs ou réponses sur
les messageries. C'est très simple: plus nous aurons de visiteurs et de
références Google, plus nous écrirons d'articles.
8 - Conclusion
Lors de cette présentation de dbExpress, nous avons indiqué comment
installer Interbase, créer une base, des tables, ajouter, lire, modifier et effacer des
données.
• vous reporter au livre Delphi dBase qui présente, par le détail, la gestion
des composants visuels et les techniques de traitement des données
(formatage, vérfications, calculs...)
• pour les blobs, voyez Blobs Interbase
• pour l'utilisation d'Interbase en mode Client Serveur, sans utiliser le BDE,
voyez le Tutorial Interbase
• l'affichage du contenu d'un fichier .XML correspondant à la sauvegarde
locale d'un tClientDataset est présenté dans Affichage ClientDataset XML
• la présentation Architecture du Moteur Interbase présente l'organisation
du programme Interbase, correspondant aux sources fournies
par Borland pour la version 6.
• je présenterai à la conférence Borcon France 2004 le panorama des
techniques d'accès aux données Interbase: les API isc,
le BDE, Interbase Express, dbExpress, et pour Delphi 8, IBX.NET en
mode VCL.NET et ADO.NET en mode Windows Forms.
• vous pouvez aussi m'adresser vos questions par e-mail
à jcolibri@jcolibri.com
Nous n'avons pas essayé d'être exhaustif dans la présentation. Lors des stages que
j'anime personnellement à l'Institut Pascal, j'entre beaucoup plus dans le détail: