Sign in Join
Wiki copytemporary

Lazarus Database Tutorial/fr: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Aperçu
22
33Ce tutoriel à pour but de faire fonctionner Lazarus avec diverses bases de données existantes.
44
55A son installation, Lazarus permet l'accès à plusieurs bases de données. Cependant le développeur doit installer les paquets adéquats pour chacune d'elles. Vous pouvez avoir accès à la base de données soit par du code, soit en déposant des composants sur une fiche. Les composants données représentent des champs et sont connectés en faisant pointer la propriété DataSource vers un TDataSource. Datasource représente une table et est connecté au composant de base de données (exemples : TPSQLDatabase, TSQLiteDataSet) en configurant la propriété DataSet. On trouve les composants contrôle de données dans le tab "Data Controls". Le composant Datasource et ceux contrôlant les bases de données sont situés dans l'onglet "Data Access".
66
77## Lazarus et MySQL
88
99### Faire fonctionner MySQL dans Linux ou Windows
1010
1111Suivre les instructions dans le manuel de l'utilisateur de MySQL. Soyez sûr que le deamon mysqld fonctionne, et que tout les utilisateurs potentiels (incluant root, mysql, vous-même et n'importe qui d'autre pourrait le vouloir) ont autant de privilèges qu'ils ont besoin, depuis autant de serveurs centraux que cela pourrait être nécessaire(incluant 'localhost', le nom du serveur local, n'importe quel autre serveur sur votre réseau) aussi loin que c'est conforme avec la sécurité. Il est préférable que tous les utilisateurs incluant root aient des mots de passe. Tester l'action du système de base de donnée en utilisant les exemples donnés dans le manuel, et vérifier que tous les utilisateurs ont réellement des accès fiables.
1212
1313### Faire fonctionner MySQL pour FPC en mode texte
1414
1515Il y a un répertoire avec un exemple de programme dans \$(fpcsrcdir)/packages/base/mysql/. Vous pouvez trouver le répertoire source de fpc dans lazarus: menu Configurations-\> Options d'environment... -\> Onglet Fichier -\> Répertoire des sources de FPC. Les chemins possibles pour le répertoire mysql sont /usr/share/fpcsrc/packages/base/mysql/ (rpm install) ou C:\lazarus\fpcsrc\packages\base\mysql\\ (windows). Ce répertoire contient aussi les unités mysql.pp, mysql_com.pp et mysql_version.pp. Avant d’exécuter le script de test, vous devez créer une base de données appelée testdb: faire ceci en vous connectant dans le moniteur mysql (comme root avec tous les privilèges ) et en émettant la commande SQL suivante
1616
17-`CREATE DATABASE testdb;`
17+```text
18+CREATE DATABASE testdb;
19+```
1820
1921ensuite soyez sur que tous les utilisateurs appropriés ont les privilèges d'accès appropriés
2022
21-`GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; `
23+```text
24+GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';
25+```
2226
2327Il y a un script appelé mkdb que vous devriez maintenant essayer d'exécuter :
2428
25-`sh ./mkdb`
29+```text
30+sh ./mkdb
31+```
2632
2733Ceci échouera probablement , car le système ne permettra pas à un utilisateur anonyme d'accéder à la base de données . Aussi changer script en utilisant éditeur de sorte que la ligne appelant mysql lise:
2834
29-`mysql -u root -p  ${1-testdb} << EOF >/dev/null`
35+```text
36+mysql -u root -p ${1-testdb} << EOF >/dev/null
37+```
3038
3139et essayez de l'exécuter à nouveau, en entrant votre mot de passe quand on vous y invite. Avec de la chance vous pourriez être parvenus à créer la base de donnée de test: testez le (alors que vous êtes logué dans le moniteur de mysql) en émettant la commande mysql
3240
33-`select * from FPdev;`
41+```text
42+select * from FPdev;
43+```
3444
3545Vous devriez voir une table listant ID, username et email address de certains des développeurs de FPC .
3646
3747Maintenant essayez d'exécuter le programme de test testdb.pp (ceci peut devoir être compilé , et échouera presque certainement sur la première tentative !!).
3848
3949J'ai constaté que le programme ne pourrait pas se connecter to mysql pour plusieurs raisons :
4050
4151- Mon système (SuSE Linux v9.0) installe mysql v4.0.15, pas la version 3 pour laquelle le paquet a été conçu .
4252
4353- Le programme doit avoir des noms d'utilisateur et des mots de passe pour obtenir l'accès à la base de données .
4454
4555- Le compilateur doit savoir où trouver les bibliothèques de mysql (SI VOUS N'AVEZ PAS INSTALLÉ LES BIBLIOTHÈQUES DE DÉVELOPPEMENT DE MYSQL , FAITES LE MAINTENANT!)
4656
4757J'ai créé une copie de testdb.pp appelé trydb.pp, plutôt que d'éditer l'original - ceci signifie que les fichiers originaux restent toujours fixes dans les mises à jour suivantes CVS. J'ai également copié les fichiers trouvés dans le sous-répertoire mysql/ver40/ dans le sous répertoire principal mysql/ , en les renommant mysql_v4.pp, mysql_com_v4.pp et mysql_version_v4.pp, Soyez sur de renommer les unités dans chaque fichier également. J'ai changé l'usage des instructions dans trydb.pp pour utiliser
4858
49-`uses mysql_v4`
59+``` pascal
60+uses mysql_v4
61+```
5062
5163et l'instruction dans mysql_v4.pp pour
5264
53-`use mysql_com_v4`
65+```text
66+use mysql_com_v4
67+```
5468
5569J'ai ajouté une ligne à /etc/fpc.cfg pour pointer vers mes librairies:
5670
57-`-Fl/lib;/usr/lib`
71+```text
72+-Fl/lib;/usr/lib
73+```
5874
5975L'étape suivante pourrait ne pas être nécessaire si les librairies de développement sont installés car les liens seront créés pour toi , mais il ne blesse jamais de vérifier . J'ai dû trouver le vrai nom de la librairie mysqlclint dans le répertoire /usr/lib et dans mon cas j'ai du émettre la commande shell:
6076
61-`ln -s libmysqlclient.so.12.0.0 lmysqlclient`
77+```text
78+ln -s libmysqlclient.so.12.0.0 lmysqlclient
79+```
6280
6381pour faire un lien symbolique permettant à FPC de trouver la bibliothèque . Pour de bonne mesure J'ai également créé le lien
6482
65-`ln -s libmysqlclient.so.12.0.0 mysqlclient`
83+```text
84+ln -s libmysqlclient.so.12.0.0 mysqlclient
85+```
6686
6787et placé des liens semblables dans autres répertoires variés: pas strictement nécessaire , mais juste au cas où ...! Quelques utilisateurs pourraient devoir ajouter le lien suivant :
6888
69-`ln -s libmysqlclient.so.12.0.0 libmysqlclient.so`
89+```text
90+ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
91+```
7092
7193J'ai modifié trydb.pp pour inclure les détails d'utilisateur, au commencement en ajoutant un serveur central(host), l'utilisateur et le mot de passe comme constantes:
7294
73-`const`\
74-`  host : Pchar= 'localhost';`\
75-`  user : Pchar= 'myusername';`\
76-`  passwd: Pchar = 'mypassword';`
95+``` pascal
96+const
97+ host : Pchar= 'localhost';
98+ user : Pchar= 'myusername';
99+ passwd: Pchar = 'mypassword';
100+```
77101
78102J'ai également trouvé que je ne pourrais pas me connecter à mysql en utilisant l'appel à mysql_connect() , mais j'ai dû employer mysql_real_connect() lequel a beaucoup plus de paramètres. Pour compliquer des choses un peu plus, le nombre de paramètres semble avoir changé entre la version 3 (où il y en a sept) et la version 4 (où il y en a huit). Avant d'utiliser mysql_real_connect J'ai dû employer mysql_init() lequel n'est pas trouvé dans le mysql.pp d'origine mais est trouvé dans mysql_v4.pp.
79103
80104Ainsi le code pour se connecter à la base de données est maintenant :
81105
82-`{ a few extra variables}`\
83-`var`\
84-`  alloc : PMYSQL;`\
85-` `\
86-`{main program fragment}`\
87-` `\
88-`begin`\
89-` if paramcount=1 then`\
90-`   begin`\
91-`   Dummy:=Paramstr(1)+#0;`\
92-`   DataBase:=@Dummy[1];`\
93-`   end;`\
94-` `\
95-`Writeln ('Allocating Space...');`\
96-` alloc := mysql_init(PMYSQL(@qmysql));`\
97-` Write ('Connecting to MySQL...');`\
98-` sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);`\
99-` if sock=Nil then`\
100-`   begin`\
101-`   Writeln (stderr,'Couldn''t connect to MySQL.');`\
102-`   Writeln (stderr, 'Error was: ', mysql_error(@qmysql));`\
103-`   halt(1);`\
104-`   end;`\
105-` Writeln ('Done.');`\
106-` Writeln ('Connection data:');`\
107-`{$ifdef Unix}`\
108-` writeln ('Mysql_port      : ',mysql_port);`\
109-` writeln ('Mysql_unix_port : ',mysql_unix_port);`\
110-`{$endif}`\
111-` writeln ('Host info       : ',mysql_get_host_info(sock));`\
112-` writeln ('Server info     : ',mysql_stat(sock));`\
113-` writeln ('Client info     : ',mysql_get_client_info);`\
114-` `\
115-` Writeln ('Selecting Database ',DataBase,'...');`\
116-` if mysql_select_db(sock,DataBase) < 0 then`\
117-`   begin`\
118-`   Writeln (stderr,'Couldn''t select database ',Database);`\
119-`   Writeln (stderr,mysql_error(sock));`\
120-`   halt (1);`\
121-`   end;`\
122-`{... as original contents of testdb.pp}`
106+``` pascal
107+{ a few extra variables}
108+var
109+ alloc : PMYSQL;
110+
111+{main program fragment}
112+
113+begin
114+ if paramcount=1 then
115+ begin
116+ Dummy:=Paramstr(1)+#0;
117+ DataBase:=@Dummy[1];
118+ end;
119+
120+Writeln ('Allocating Space...');
121+ alloc := mysql_init(PMYSQL(@qmysql));
122+ Write ('Connecting to MySQL...');
123+ sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
124+ if sock=Nil then
125+ begin
126+ Writeln (stderr,'Couldn''t connect to MySQL.');
127+ Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
128+ halt(1);
129+ end;
130+ Writeln ('Done.');
131+ Writeln ('Connection data:');
132+{$ifdef Unix}
133+ writeln ('Mysql_port : ',mysql_port);
134+ writeln ('Mysql_unix_port : ',mysql_unix_port);
135+{$endif}
136+ writeln ('Host info : ',mysql_get_host_info(sock));
137+ writeln ('Server info : ',mysql_stat(sock));
138+ writeln ('Client info : ',mysql_get_client_info);
139+
140+ Writeln ('Selecting Database ',DataBase,'...');
141+ if mysql_select_db(sock,DataBase) < 0 then
142+ begin
143+ Writeln (stderr,'Couldn''t select database ',Database);
144+ Writeln (stderr,mysql_error(sock));
145+ halt (1);
146+ end;
147+{... as original contents of testdb.pp}
148+```
123149
124150Maintenant - prêt pour commencer à compiler trydb.pp?
125151
126-` fpc trydb`
152+```text
153+ fpc trydb
154+```
127155
128156succès ! Exécutez le maintenant :
129157
130-` ./trydb`
158+```text
159+ ./trydb
160+```
131161
132162whoopee! J'ai obtenu le listing des développeurs de FPC !
133163
134164Quelques améliorations supplémentaires : rendre l'entrée des détails d'utilisateur et les commandes mysql interactives , en utilisant des variables plutôt que des constantes , et en autorisant plusieurs commandes SQL a être entrées, jusqu'à ce que nous émettions la commande quit: voir le [[Lazarus Database Tutorial/TryDbpp|listing complet de programme]], où les détails d'utilisateur sont entrés via la console , et le programme entre dans une boucle où les commandes SQL sont entrés depuis la console(sans point-virgule terminal ) et les réponses sont imprimées , jusqu'à ce que 'quit' soit entré au clavier .
135165
136166Voir [[Lazarus Database Tutorial/SampleListing|Exemple de listing sur la console]].
137167
138168### Se connecter à MySQL à partir d'une application Lazarus
139169
140170Ce tutoriel montre comment connecter Lazarus à la base de donnée MySQL, et exécuter des requêtes simples , en employant seulement les composants de base de Lazarus; il n'utilise aucun composants Data Aware, mais illustre les principes d' interfaçage à la base de données .
141171
142172NB : Les paquets ZeosLib ou SqlDb fournissent des composants qui permettent d'utiliser MySql bien plus simplement qu'avec la méthode proposée ci-dessous.
143173
144174Créer un nouveau projet dans Lazarus:
145175
146-`Project -> New Project -> Application`
176+```text
177+Project -> New Project -> Application
178+```
147179
148180Une nouvelle forme générée automatiquement apparaîtra.
149181
150182Agrandir la forme pour remplir environ la moitié de l'écran , renommer alors la forme et son Caption avec 'TryMySQL'.
151183
152184A partir de l'onglet de composants standard placer trois boites d'édition sur le côté gauche supérieur de la fiche, et immédiatement au-dessus de chaque boite placez un label . Changer les noms et les captions en 'Host' (et HostLLabel,HostEdit), 'UserName' (et UserLabel, UserEdit) et 'Password' (avec PasswdLabel et PasswdEdit). Alternativement vous pourriez employer les composants LabelledEdit à partir de l'onglet additionnel.
153185
154186Sélectionnez la boite d'édition Passwd et trouver la propriété PasswordChar: changer ceci en * ou un autre caractère, de sorte que quand vous saisissez un mot de passe les caractères n'apparaissent pas sur votre écran mais se font écho par une série de *s. Assurer vous que la propriété Text de chaque boite d'édition est blanche.
155187
156188Placer maintenant une autre boite Edit et un label au dessus du côté droit de la fiche. Changer le label en 'Enter SQL Command' et nommez le CommandEdit.
157189
158190Placer trois boutons sur la fiche : deux du côté gauche dessous les boites Edit, et un du côté droit dessous la boite de commande.
159191
160192Etiqueter les boutons du côté gauche 'Connect to Database' (ConnectButton) et 'Exit' (ExitButton) et celui du côté droit 'Send Query' (QueryButton).
161193
162194Placer un grand Memo Box étiqueté et nommé 'Results' (ResultMemo) sur la droite en bas , pour remplir majeure partie de l'espace disponible. Trouver sa propriété ScrollBars et choisir ssAutoBoth de sorte que les barres de défilement apparaissent automatiquement si le texte remplit l'espace. Rendre la propriété WordWrap à la valeur True.
163195
164196Placer une barre de Status (à partir de l'onglet de Contrôle commun) au bas de la fiche, et appeler sa propriété SimpleText 'TryMySQL'.
165197
166198Une copie d'écran de la fiche peut être vue ici: [Exemple de copie d'écran Mysql](http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png)
167199
168200Maintenant nous devons écrire quelques procédures de traitement d’événement.
169201
170202Les trois boites d'édition du côté gauche sont pour l'entrée du hostname , du username et mot de passe . Quand ceux-ci ont été entrés de manière satisfaisante, le bouton de connexion est cliqué. Le traitement de l’événement OnCLick pour ce bouton est basé sur une partie du programme FPC en mode texte ci-dessus .
171203
172204Les réponses de la base de données ne peut pas maintenant être écrites en employant les instructions Pascal write ou writeln: plutôt, les réponses doivent être converties en chaînes de caractères et affiché dans la boîte Mémo . Considérant que les instructions Pascal write et writeln sont capable d'exécuter beaucoup de type conversion 'à la volée', l'utilisation d'une boîte Mémo pour la sortie de textes rend nécessaire la conversion explicite des types de données à la forme correcte de chaînes de caractères , ainsi les variables Pchar doivent être converties en chaînes de caractères en utilisant StrPas , et les nombres entiers doivent être convertis avec IntToStr.
173205
174206Les chaînes de caractères sont affichées dans la boite Mémo en utilisant
175207
176-`procedure ShowString (S : string);`\
177-`(* display a string in a Memo box *)`\
178-`begin`\
179-`       trymysqlForm1.ResultsMemo.Lines.Add (S)`\
180-`end;`
208+``` pascal
209+procedure ShowString (S : string);
210+(* display a string in a Memo box *)
211+begin
212+ trymysqlForm1.ResultsMemo.Lines.Add (S)
213+end;
214+```
181215
182216L'évent hantler ConnectButton devient ainsi:
183217
184-`procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);`\
185-`(* Connect to MySQL using user data from Text entry boxes on Main Form *)`\
186-`var strg: string;`\
187-` `\
188-`begin`\
189-` `\
190-` dummy1 :=  trymysqlForm1.HostEdit.text+#0;`\
191-` host := @dummy1[1];`\
192-` dummy2 := trymysqlForm1.UserEdit.text+#0;`\
193-` user := @dummy2[1] ;`\
194-` dummy3 := trymysqlForm1.PasswdEdit.text+#0;`\
195-` passwd := @dummy3[1] ;`
218+``` pascal
219+procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
220+(* Connect to MySQL using user data from Text entry boxes on Main Form *)
221+var strg: string;
222+
223+begin
224+
225+ dummy1 := trymysqlForm1.HostEdit.text+#0;
226+ host := @dummy1[1];
227+ dummy2 := trymysqlForm1.UserEdit.text+#0;
228+ user := @dummy2[1] ;
229+ dummy3 := trymysqlForm1.PasswdEdit.text+#0;
230+ passwd := @dummy3[1] ;
231+```
196232
197-` alloc := mysql_init(PMYSQL(@qmysql));`\
198-` sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);`\
199-` if sock=Nil then`\
200-`   begin`\
201-`     strg :='Couldn''t connect to MySQL.'; showstring (strg);`\
202-`     Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);`\
203-`  end`\
204-`   else`\
205-`   begin`\
206-`     trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';`\
207-`     strg := 'Now choosing database : ' + database; showstring (strg);`\
208-`{$ifdef Unix}`\
209-`     strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);`\
210-`     strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);`\
211-`{$endif}`\
212-`     Strg :='Host info       : ' + StrPas(mysql_get_host_info(sock));`\
213-`     showstring (strg);`\
214-`     Strg :='Server info     : ' + StrPas(mysql_stat(sock)); showstring (strg);`\
215-`     Strg :='Client info     : ' + Strpas(mysql_get_client_info);  showstring (strg);`\
216-` `\
217-`     trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';`\
218-` if mysql_select_db(sock,DataBase) < 0 then`\
219-` begin`\
220-`   strg :='Couldn''t select database '+ Database; ShowString (strg);`\
221-`   Strg := mysql_error(sock); ShowString (strg);`\
222-` end`\
223-` end;`\
224-`end;`
233+``` pascal
234+ alloc := mysql_init(PMYSQL(@qmysql));
235+ sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
236+ if sock=Nil then
237+ begin
238+ strg :='Couldn''t connect to MySQL.'; showstring (strg);
239+ Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
240+ end
241+ else
242+ begin
243+ trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';
244+ strg := 'Now choosing database : ' + database; showstring (strg);
245+{$ifdef Unix}
246+ strg :='Mysql_port : '+ IntToStr(mysql_port); showstring (strg);
247+ strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
248+{$endif}
249+ Strg :='Host info : ' + StrPas(mysql_get_host_info(sock));
250+ showstring (strg);
251+ Strg :='Server info : ' + StrPas(mysql_stat(sock)); showstring (strg);
252+ Strg :='Client info : ' + Strpas(mysql_get_client_info); showstring (strg);
253+
254+ trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';
255+ if mysql_select_db(sock,DataBase) < 0 then
256+ begin
257+ strg :='Couldn''t select database '+ Database; ShowString (strg);
258+ Strg := mysql_error(sock); ShowString (strg);
259+ end
260+ end;
261+end;
262+```
225263
226264La boîte de textes du côté droit permet l'entrée d'instructions SQL, sans point-virgule terminal ; quand vous êtes satisfaits de son contenu ou syntaxe , le bouton SendQuery est appuyé , et la requête est traitée , avec les résultats écrit dans la boîte ResultsMemo .
227265
228266Le traitement de l'évènement SendQuery est de nouveau basé sur la version FPC en mode texte, sauf que de nouveau un type de conversion explicite doit être fait avant que les châines de caractère soient montrées dans la boîte .
229267
230268Une différence avec le programme FPC en mode texte est que si une condition d'erreur est détectée, le programme ne stoppe pas et MySQL n'est pas fermé; au lieu de cela, la commande est retournée à la fiche principale et une occasion est donnée de corriger l'entrée avant la commande ne soit resoumis. L'application existe finalement(avec la fermeture de MySQL ) quand le bouton de sortie est cliqué .
231269
232270Le code pour SendQuery suit :
233271
234-`procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);`\
235-`var`\
236-` dumquery, strg: string;`\
237-`begin`\
238-`     dumquery := TrymysqlForm1.CommandEdit.text;`\
239-`     dumquery := dumquery+#0;`\
240-`     query := @dumquery[1];`\
241-`     trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';`\
242-`     strg := 'Executing query : ' + dumQuery; showstring (strg);`\
243-`     if (mysql_query(sock,Query) < 0) then`\
244-`     begin`\
245-`       Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);`\
246-`     end`\
247-`     else`\
248-`     begin`\
249-`       recbuf := mysql_store_result(sock);`\
250-`       if RecBuf=Nil then`\
251-`       begin`\
252-`         Strg :='Query returned nil result.'; showstring (strg);`\
253-`       end`\
254-`       else`\
255-`       begin`\
256-`         strg :='Number of records returned  : ' + IntToStr(mysql_num_rows (recbuf));`\
257-`         Showstring (strg);`\
258-`         Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));`\
259-`         showstring (strg);`\
260-`         rowbuf := mysql_fetch_row(recbuf);`\
261-`         while (rowbuf <>nil) do`\
262-`         begin`\
263-`              Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +`\
264-`               rowbuf[2] +')';`\
265-`              showstring (strg);`\
266-`              rowbuf := mysql_fetch_row(recbuf);`\
267-`         end;`\
268-`       end;`\
269-`     end;`\
270-`end;`
272+``` pascal
273+procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
274+var
275+ dumquery, strg: string;
276+begin
277+ dumquery := TrymysqlForm1.CommandEdit.text;
278+ dumquery := dumquery+#0;
279+ query := @dumquery[1];
280+ trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';
281+ strg := 'Executing query : ' + dumQuery; showstring (strg);
282+ if (mysql_query(sock,Query) < 0) then
283+ begin
284+ Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);
285+ end
286+ else
287+ begin
288+ recbuf := mysql_store_result(sock);
289+ if RecBuf=Nil then
290+ begin
291+ Strg :='Query returned nil result.'; showstring (strg);
292+ end
293+ else
294+ begin
295+ strg :='Number of records returned : ' + IntToStr(mysql_num_rows (recbuf));
296+ Showstring (strg);
297+ Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));
298+ showstring (strg);
299+ rowbuf := mysql_fetch_row(recbuf);
300+ while (rowbuf <>nil) do
301+ begin
302+ Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +
303+ rowbuf[2] +')';
304+ showstring (strg);
305+ rowbuf := mysql_fetch_row(recbuf);
306+ end;
307+ end;
308+ end;
309+end;
310+```
271311
272312Enregistrez votre projet, et appuyez sur Run -\> Run
273313
274314#### Télécharger le code source MYSQL
275315
276316Un listing complet du programme est disponible ici [Exemple de code source](http://lazarus-ccr.sourceforge.net/kbdata/mysqldemo.tar.gz)
277317
278318## Lazarus et PostgreSQL
279319
280320C'est un tutoriel très court pour obliger Lazarus 0.9.12 ou ultérieur à se relier à une base de données PostgreSQL, en local ou à l'extérieur, en employant TPQConnection.
281321
282322Après une installation correcte, suivre ces étapes :
283323
284324- Placer un PQConnection depuis l'étiquette SQLdb
285325- Placer un SQLQuery depuis l'étiquette SQLdb
286326- Placer un SQLTransaction depuis l'étiquette SQLdb
287327- Placer un DataSource depuis l'étiquette DataAccess
288328- Placer un DBGrid depuis l'étiquette DataControls
289329
290330- Dans la PQConnection compléter:
291331 - La propriété transaction avec l'objet respectif SQLTransaction
292332 - Nom de la base de données
293333 - Nom de l'hôte
294334 - Nom de l'utilisateur + mot de passe
295335
296336- Vérifier que SQLTransaction a été automatiquement changé pour pointer vers PQConnection
297337
298338- Dans la SQLQuery compléter:
299339 - la propriété transaction avec l'objet respectif
300340 - la propriété database avec l'objet respectif
301341 - SQL (quelque chose comme 'select * from anytable')
302342
303343- Dans l'objet DataSource compléter la propriété DataSet avec l'objet SQLQuery
304344
305345- Dans DBGrid compléter la source de donnée comme l'objet DataSource
306346
307347Mettez tout sur connecté et actif et la DBGrid devrait être complété à la conception. TDBText et TDBEdit sembler fonctionner mais (pour moi ) ils montrent seulement des données.
308348
309349Pour changer le contenu dans la base de données , j'ai appelé le moteur DB directement avec le code suivant :
310350
311-` try`\
312-`   sql:= 'UPDATE table SET setting=1';`\
313-`   PQDataBase.Connected:=True;`\
314-`   PQDataBase.ExecuteDirect('Begin Work;');`\
315-`   PQDataBase.ExecuteDirect(sql);`\
316-`   PQDataBase.ExecuteDirect('Commit Work;');`\
317-`   PQDataBase.Connected:=False;`\
318-` except`\
319-`   on E : EDatabaseError do`\
320-`     MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);`\
321-`   on E : Exception do`\
322-`     MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);`\
323-` end;`
351+``` pascal
352+ try
353+ sql:= 'UPDATE table SET setting=1';
354+ PQDataBase.Connected:=True;
355+ PQDataBase.ExecuteDirect('Begin Work;');
356+ PQDataBase.ExecuteDirect(sql);
357+ PQDataBase.ExecuteDirect('Commit Work;');
358+ PQDataBase.Connected:=False;
359+ except
360+ on E : EDatabaseError do
361+ MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
362+ on E : Exception do
363+ MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
364+ end;
365+```
324366
325367- Notes:
326368 - Testé sur windows, Lazarus 0.9.12 + PgSQL 8.3.1
327369 - Quelques tests dans linux, Lazarus 0.9.12 et PgSQL 8.0.x
328370
329371- Installation et erreurs :
330372 - Dans la version testée de Lazarus 0.9.12, Les champs de type "text" et "numeric" ont des bugs
331373 - J'ai utilisé sans problème des caractères de taille fixe, int et float8
332374 - Parfois la remise en marche de Lazarus résout des erreurs stupides ...
333375 - Après quelques erreurs , les transactions demeurent actives et devraient être désactivées mannuellement
334376 - Les changements faits dans Lazarus être naturellement non visible jusqu'à ce que la transaction soit effectuée
335377 - Le debugger intégré semble buggé (au moins dans windows) - parfois une exécution en dehors de l'ide peut aider à trouver des erreurs
336378 - Dans linux certains messages d'erreur sont imprimés dans la console -- exécuter votre programme en ligne de commande , parfois il y a certaine information utile supplémentaire de correction
337379 - Erreur : "Can not load Postgresql client. Is it installed (libpq.so) ?"
338380 - Ajouter le chemin pour rechercher libpq* à partir de l'installation de PostgreSQL.
339381 - Dans le linux ajouter le chemin au fichier libpq.so à la section bibliothèques de votre fichier /etc/fpc.cfg. Par exemple : -Fl/usr/local/pgsql/lib
340382 - Dans windows, ajouter ces bibliothèques n'importe où dans la variable d'environnement Path ou dans le répertoire projet
341383 - Dans windows, J'ai copié tout DLLs dans le mon répertoire C:\Program Files\PostgreSQL\8.1\bin ver un autre répertoire dans le PATH
342384 - Ou ajouter ce répertoire postgres\bin vers le path
343385
344386## Lazarus et SQLite
345387
346388par Luiz Américo
347389
348390Aller sur la page d'accueil [sqlite](http://www.sqlite.org/) pour plus d'information .
349391
350392### Introduction
351393
352394TSqliteDataset et TSqlite3Dataset sont des descendants de TDataset qui accèdent, respectivement, aux bases de données sqlite version 2.8.x et 3.2.x. Ci-dessous une liste des principaux avantages et inconvénients :
353395
354396Avantages :
355397
356398- Flexible : les programmeurs peuvent choisir d'employer ou de ne pas employer le langage SQL, leur permettant de travailler avec les dispositions simples de tables ou n'importe quelle disposition complexe que SQL/sqlite permet
357399- Mise à jour automatique de la base de données : aucun besoin de mettre à jour manuellement la base de données avec des instructions SQL, une méthode simple s'occupe de ça
358400- Rapide : il cache les données en mémoire, rendant la navigation dans le jeux de données rapide
359401- Aucune installation/configuration de serveur : simplement fournir la bibliothèque sqllite avec l'exe
360402
361403Inconvénients
362404
363405- Exige des fichiers externes (Bibliothèque sqlite)
364406
365407### Exigences
366408
367409- Pour les bases de données sqlite2 :
368410 - fpc 2.0.0
369411 - Lazarus 0.9.10
370412 - la bibliothèque d'exécution sqlite 2.8.15 ou au-dessus (l'obtenir de www.sqlite.org)
371413
372414- Pour les bases de données sqlite3:
373415 - fpc 2.0.2
374416 - Lazarus 0.9.11 (svn revision 8443 ou au-dessus)
375417 - la bibliothèque d'exécution sqlite 3.2.1 ou au-dessus (l'obtenir de www.sqlite.org)
376418
377419**Avant le lancement d'un projet Lazarus , assurez vous que :**
378420
379421- la bibliothèque sqlite est dans le PATH système ou dans le répertoire de l'exécutable
380422- sous Linux, mettre cmem comme première unité dans la clause uses du programme principal
381423
382424### Comment l'employer (Utilisation de base )
383425
384426Installer le paquet trouvé dans le répertoire /components/sqlite (voir les instructions [[Install Packages/fr|ici]])
385427
386428Pendant la conception fixer les propriétés suivantes:
387429
388430- FileName: chemin du fichier sqlite \[requis \]
389431- TableName: nom de la table utilisée dans la phrase sql \[requis \]
390432- Sql: une phrase de sélection SQL\[facultatif \]
391433
392434**Créer un Table (jeux de donnée)**
393435
394436Double cliquez sur l'icone du composant ou employer l'item 'Create Table' du menu automatique qui apparaît en cliquant le bouton de souris droit . Un simple éditeur de table parlant de lui-même sra montré.
395437
396-` Voici tous les types de champ soutenus par TSqliteDataset et TSqlite3Dataset: `\
397-` `\
398-` Integer`\
399-` AutoInc`\
400-` String`\
401-` Memo`\
402-` Bool `\
403-` Float`\
404-` Word`\
405-` DateTime`\
406-` Date`\
407-` Time`\
408-` LargeInt`\
409-` Currency`\
410-` `
438+```text
439+ Voici tous les types de champ soutenus par TSqliteDataset et TSqlite3Dataset:
440+
441+ Integer
442+ AutoInc
443+ String
444+ Memo
445+ Bool
446+ Float
447+ Word
448+ DateTime
449+ Date
450+ Time
451+ LargeInt
452+ Currency
453+```
411454
412455**Recherche des données**
413456
414457Après avoir créé la table ou avec une table précédemment créée ,ouvrir l'ensemble des données avec la méthode ouvrir . Si la propriété SQL n'était fixée alors tous enregistrements de tous les champs seront recherchés, la même chose si vous fixiez le SQL à :
415458
416-` SQL:='Select * from TABLENAME'; `
459+``` pascal
460+ SQL:='Select * from TABLENAME';
461+```
417462
418463**Application des changements au fichier de donnée sous-jacent**
419464
420465Pour utiliser la fonction ApplyUpdates, l'ensemble de données doit contenir au moins un champ qui remplit les conditions pour une clef primaire (les valeurs doivent être UNIQUES et NON NULLES )
421466
422467C'est possible de faire cela de deux manières :
423468
424469- Fixer la propriété PrimaryKey avec le nom du champ clef primaire
425470- Ajouter un champ AutoInc (C'est plus facile puisque TSqliteDataSet le manipule automatiquement comme clef primaire )
426471
427472Si une des deux conditions est fixée alors appeler juste
428473
429-` ApplyUpdates;`
474+```text
475+ ApplyUpdates;
476+```
430477
431478PS1: Si les deux conditions sont fixées, le champ correspondant à PrimaryKey est employé pour appliquer les mises à jour .
432479
433480PS2: Le réglage de PrimaryKey à un champ qui n'est pas une clef primaire mènera à la perte de données si ApplyUpdates est appellé, aussi assurez vous que le champ choisi contient des valeurs non nulles et uniques avant de l'employer .
434481
435482### Remarques
436483
437484- Bien que cela ait été testé avec 10000 enregistrements et très bien fonctionné, TSqliteDataset conserve toutes données en mémoire, aussi rappelez-vous de rechercher seulement les données nécessaires (principalement avec les champs Mémo).
438485- Le même fichier de donnée (propriété Filename) peut accueillir plusieurs tables/ensembles de données
439486- Plusieurs ensembles de données (combinaisons differentes des champs )peuvent être créés en utilisant la même table simultanément .
440487- Il est possible de filtrer les données en utilisant les instructions WHERE dans sql, en fermant et en réouvrant l'ensemble de données(ou en appelant la méthode RefetchData). Mais dans ce cas-ci, l'ordre et le nombre de champs doivent demeurer le même.
441488- Il est également possible d'employer des instructions complexes de SQL en utilisant des alias, jointures, vues dans des tables multiples (se rappeler qu'ils doivent résider dans le même ficihier de données), mais dans ce cas-ci ApplyUpdates ne fonctionnera pas. Si quelqu'un veut employer des requêtes complexes et appliquer les mises à jour au fichier de données, expédiez-moi un mail et je donnerai quelques conseils sur comment à faire cela.
442489- fixer un nom de fichier à un fichier de données sqlite2.x non créé par TSqliteDataset et l'ouvrir est possible mais quelques champs n'auront pas le type de champ correct détecté. Ceux-ci seront traités comme champs de chaîne de caractère.
443490
444491Des exemples génériques peuvent être trouvés dans le répertoire CVS fpc/fcl/db/sqlite
445492
446493Luiz Américo pascalive(at)bol(dot)com(dot)br
447494
448495## Lazarus et MSSQL
449496
450497Cela fonctionne avec Zeoslib (dernier cvs), voir les liens sur le bas de la page .
451498
452499## Lazarus et Interbase / Firebird
453500
454501Voir [[Install Packages/fr|Installer les paquets]]. Sur cette page est un premier petit exemple d'explication à propos de la manière de se relier à un serveur IB ou FB .
455502
456503fonctionne aussi avec le dernier Zeoslib (du cvs).
457504
458505### Librairie Firebird FBLib
459506
460507[1](http://fblib.altervista.org/%7CFBLib) est une bibliothèque open Source No Data Aware for direct access to Firebird Relational Database from Borland Delphi / Kylix, Freepascal and Lazarus.
461508
462509Les fonctionnalités actuelles incluent:
463510
464511- Accès direct classique ou superserveur à Firebird 1.0.x 1.5.x
465512- Multiplatforme \[Win32,Gnu/Linux,FreeBSD)
466513- Bibliothèque avec choix automatique de client 'fbclient' ou 'gds32'
467514- Requête avec des param
468515- Support du dialecte SQL 1/3
469516- Accord de licence LGPL
470517- Extration de Méta-données
471518- Analyseur simple de manuscrit
472519- Seulement 100-150 KB sont ajoutés dans l'EXE final
473520- Support des champs BLOB
474521- Exporte des données au Script HTML SQL
475522- manageur de Service (backup,restore,gfix...)
476523- Alerte d'évènements
477524
478525Vous pouvez télécharger la documentation sur [le site FBLib](http://fblib.altervista.org/).
479526
480527## Lazarus et dBase
481528
482529Tony Maro
483530
484531Vous pourriez également vouloir visiter les commencements de la [[Lazarus Tdbf Tutorial/fr|page de tutoriel TDbf]]
485532
486533FPC inclut un composant simple de base de données qui est semblable dans la fonction au composant TTable de Delphi appelé "TDbf" ([Site Web de TDbf](http://tdbf.sourceforge.net/)) qui supporte un sous ensemble très basique de possibilités sur les fichiers dBase. Il n'est pas installé par défaut , ainsi vous devrez d'abord installer le paquet Lazarus à partir du répertoire "lazarus/components/tdbf" et reconstruire votre IDE Lazarus. Il apparaîtra alors à côté du composant TDatasource dans votre palette de composant.
487534
488535Le composant TDbf a un avantage par rapport à d'autres composants de base de données parce qu'il n'exige aucune sorte de moteur d'exécution de base de données, cependant ce n'est pas la meilleure option pour des applications avec de grandes base de données.
489536
490537Il est très facile d'emploi. Simplement, mettre, déposer un composant TDbf sur votre fiche, placer le chemin d'exécution dans le répertoire dans lequel seront vos fichiers de base de donnée, fixer le nom de la table, et liez le à votre composant TDatasource .
491538
492539Une vraie fonctionnalité exige un peu plus d'effort , cependant . Si une table n'existe pas déjà , vous devrez la créer programmatiquement , à moins qu'il y ait un progammeur de table compatible Je ne suis pas familié avec . Note: La version courante d'OpenOffice (2.0x) contient la base d'OpenOffice, ce qui peut créer des fichiers dbf d'une manière quelque peu facile à utiliser .
493540
494541Essayer d'ouvrir une table non-existante produira une erreur. Des Tables peuvent être créés programmatiquement au travers de composant après le chemin et le nom de la table soient fixé.
495542
496543Par exemple , pour créer une table appelée « dvds » pour stocker votre collection de dvd vous devriez le déposer sur votre fiche, fixer le chemin d'exécution, et fixer le nom de table à « dvds » . Le fichier résultant s'appellera « dvds.dbf » .
497544
498545Dans votre code, insérer le suivant :
499546
500-`   Dbf1.FilePathFull := '/path/to/my/database';`\
501-`   Dbf1.TableName := 'dvds';`\
502-`   With Dbf1.FieldDefs do begin`\
503-`       Add('Name', ftString, 80, True);`\
504-`       Add('Description', ftMemo, 0, False);`\
505-`       Add('Rating', ftString, 5, False);`\
506-`   end;`\
507-`   Dbf1.CreateTable;`
547+``` pascal
548+ Dbf1.FilePathFull := '/path/to/my/database';
549+ Dbf1.TableName := 'dvds';
550+ With Dbf1.FieldDefs do begin
551+ Add('Name', ftString, 80, True);
552+ Add('Description', ftMemo, 0, False);
553+ Add('Rating', ftString, 5, False);
554+ end;
555+ Dbf1.CreateTable;
556+```
508557
509558Quand ce code est exécuté , votre table de collection DVD sera créée. Après cela, tous les composants avertis de données lié par TDatasource à ce composant permettra un accès facile aux données.
510559
511560Ajouter des index est peu un différent de votre TTable typique. Il doit être fait après que la base de données soit ouverte . C'est également la même méthode que vous employez pour reconstruire les index. Par exemple :
512561
513-`   Dbf1.Exclusive := True;`\
514-`   Dbf1.Open;`\
515-`   Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);`\
516-`   Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);`\
517-`   Dbf1.Close;`
562+``` pascal
563+ Dbf1.Exclusive := True;
564+ Dbf1.Open;
565+ Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);
566+ Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
567+ Dbf1.Close;
568+```
518569
519570Le premier index (primaire) sera un fichier appelé "dvdsname.mdx" et le second sera un fichier appelé "rating.ndx" ainsi dans une base de donnéesde table multiple vous devez faire attention à ne pas employer encore le même nom de fichier.
520571
521572J'essayerai d'ajouter un exemple plus détaillé à une date ultérieure, mais si tout va bien cela mettra ces vieux programmeurs en Delphi à jour avec des bases de données dans Lazarus !
522573
523574## Liens relatifs
524575
525576- [[Databases/fr|Créer des applications de bases de données avec Lazarus en employant DB-unit]]\
526577- [[MySQLDatabases/fr|Créer une application de base de données en utilisant MySQL]]\
527578- [[Zeos tutorial/fr|Créant une application de base de données en utilisant les composants Zeos]]
528579- Pascal Data Objects est une base de données API qui fonctionne pour à la fois FPC et Delphi et utilise des librairies MySQL natives pour les versions 4.1 et 5.0. Il est inspiré par les classes PHP's PDO .
529580
530581<https://trac.synsport.com:8000/index.php/pdo/wiki> (username/password est guest/guest)
531582
532583---
533584*From the Free Pascal wiki, page "Lazarus Database Tutorial/fr", as it stood on 2016-05-26 after a change by Tintinux, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
534585Category: Databases/fr

Back to history