Sign in Join
Wiki copytemporary

Lazarus Database Tutorial/de: what changed

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

OldNewLine
11Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].\
22
33== Überblick ==
44
55Das Thema dieses Tutorial ist, wie Lazarus mit einer Auswahl von existierenden Datenbanken zusammenarbeiten kann.
66
77Bitte erweitern sie diesen Bereich.
88
99## Lazarus und MySQL
1010
1111### MySQL unter Linux oder Windows zum Laufen bringen
1212
1313Folgen sie den Anweisungen im MySQL Benutzerhandbuch. Stellen sie sicher, dass der mysqld Daemon zuverlässig läuft (zumindest bei Linux), und dass alle potentiellen Benutzer (inclusive root, mysql, sie selbst und jeder sonst, der es benötigen könnte) so viele Rechte (privileges) wie nötig hat, von so vielen Hosts wie nötig (inclusive 'localhost', dem lokalen Host Namen, jedem anderen Host in ihrem Netzwerk) so weit es mit der Sicherheit vereinbar ist. Auch haben viele benötigte Dateien im fpcsrc- und im lazarus-Ordner stark eingeschränkte Schreibrechte, die root erst ändern muss, wenn andere User damit arbeiten sollen. Mangelnde Schreibrechte in Units zeigt Lazarus durch die Fehlermeldung "Error while linking" an. Es ist wünschenswert, dass alle Benutzer inclusive root Passwörter haben. Testen sie die Wirkung des Datenbanksystems bei der Benutzung der Beispiele aus dem Handbuch, und prüfen sie, dass alle Benutzer wirklich einen zuverlässigen Zugriff haben.
1414
1515### MySQL für FPC im Textmodus zum Laufen bringen
1616
1717**MySQL-Sourcen einbinden** Es gibt ein Verzeichnis mit einem Beispielprogramm in \$(fpcsrcdir)/packages/base/mysql/. Sie können das FPC Quellverzeichnis in Lazarus wie folgt finden: Werkzeuge -\> Einstellungen -\> Umgebung -\> Dateien -\> FPC-Quelltextverzeichnis. Mögliche Pfade für das mysql Verzeichnis sind /usr/share/fpcsrc/packages/base/mysql/ (rpm Installation) oder C:\lazarus\fpcsrc\packages\base\mysql\\ (Windows). Dieses Verzeichnis enthält auch die Units mysql.pp, mysql_com.pp und mysql_version.pp.
1818
1919**Datenbank vorbereiten** Bevor sie das Testscript starten, müssen sie eine Datenbank mit dem Namen testdb anlegen: Tun sie dies, indem sie sich in den mysql Monitor einloggen (als root mit allen Rechten (privileges)) und das folgende SQL Statement eingeben
2020
21-`CREATE DATABASE testdb;`
21+```text
22+CREATE DATABASE testdb;
23+```
2224
2325Dann müssen sie sicherstellen, dass alle relevanten Benutzer einen passenden Zugriff darauf haben
2426
25-`GRANT ALL ON testdb TO johnny@localhost IDENTIFIED BY 'johnnyspassword'; `
27+```text
28+GRANT ALL ON testdb TO johnny@localhost IDENTIFIED BY 'johnnyspassword';
29+```
2630
2731Es gibt ein Script namens mkdb, welches sie nun starten sollten:
2832
29-`sh ./mkdb`
33+```text
34+sh ./mkdb
35+```
3036
3137Dies wird wahrscheinlich fehlschlagen, weil das System keinem anonymen Benutzer den Zugriff auf die Datenbank erlauben wird. Ändern sie deshalb das Script mit einem Editor, so dass die Zeile, in der mysql aufgerufen wird, wie folgt aussieht:
3238
33-`mysql -u root -p  ${1-testdb} << EOF >/dev/null`
39+```text
40+mysql -u root -p ${1-testdb} << EOF >/dev/null
41+```
3442
3543und versuchen sie, es erneut zu starten. Geben sie ihr Passwort ein, wenn danach verlangt wird. Mit etwas Glück ist es ihnen gelungen, die Testdatenbank anzulegen: testen sie es (während sie im mysql Monitor eingeloggt sind) unter Verwendung der mysql Anweisung
3644
37-`select * from FPdev;`
45+```text
46+select * from FPdev;
47+```
3848
3949Sie sollten eine Tabelle sehen, welche die ID, den Benutzernamen und die Emailadresse von einem der FPC Entwickler enthält.
4050
4151**Testprogramm starten** Versuchen sie nun, das Testprogramm testdb.pp zu starten (dieses muss evtl. noch kompiliert werden, und wird beinahe sicher beim ersten Versuch fehlschlagen!!).
4252
4353Ich habe herausgefunden, dass das Programm aus verschiedenen Gründen nicht mit mysql verbinden konnte:
4454
4555- Mein System (SuSE Linux v9.0) installiert mysql v4.0.15, nicht die Version 3, für welche das Package bestimmt war.
4656
4757- Das Programm benötigt Benutzernamen und Passwörter, um Zugriff auf die Datenbank zu erhalten.
4858
4959- Der Compiler muss wissen, wo die mysql Bibliotheken zu finden sind. (Wenn sie die mysql Entwicklungs-Bibliotheken nicht installiert haben, dann tun sie es jetzt!)
5060
5161Ich erzeugte eine Kopie von testdb.pp mit dem Namen trydb.pp, eher als das Original zu bearbeiten - das bedeutet, dass die originalen Dateien in späteren CVS Updates noch bereinigt werden. Ich kopierte auch die Dateien aus dem Unterverzeichnis mysql/ver40/ in das Haupt- mysql/ Unterverzeichnis, benannte sie in mysql_v4.pp, mysql_com_v4.pp und mysql_version_v4.pp um, um sicher zu sein, die Units mit jeder Datei entsprechend umzubenennen. Ich änderte die uses Anweisung in trydb.pp zu
5262
53-`uses mysql_v4`
63+``` pascal
64+uses mysql_v4
65+```
5466
5567und die Anweisung in mysql_v4.pp zu
5668
57-`uses mysql_com_v4`
69+``` pascal
70+uses mysql_com_v4
71+```
5872
5973Ich fügte eine Zeile zu /etc/fpc.cfg hinzu, um auf meine Bibliotheken zu zeigen:
6074
61-`-Fl/lib;/usr/lib`
75+```text
76+-Fl/lib;/usr/lib
77+```
6278
6379Der folgende Schritt mag nicht notwendig sein, wenn die devel-Biblitheken installiert sind wie die Links für sie erzeugt sind, aber es kann nie schaden, es zu prüfen. Ich musste den tatsächlichen Namen der mysqlclint Bibliothek im /usr/lib Verzeichnis finden und in meinem Fall das folgende shell-Kommando eingeben:
6480
65-`ln -s libmysqlclient.so.12.0.0 lmysqlclient`
81+```text
82+ln -s libmysqlclient.so.12.0.0 lmysqlclient
83+```
6684
6785um einen symbolischen Link zu erstellen, um FPC zu erlauben, die Bibliothek zu finden. Für ein gutes Maß erzeugte ich auch den Link
6886
69-`ln -s libmysqlclient.so.12.0.0 mysqlclient`
87+```text
88+ln -s libmysqlclient.so.12.0.0 mysqlclient
89+```
7090
7191und plazierte einfache Links in verschiedenen anderen Verzeichnissen: nicht unbedingt notwendig, aber für alle Fälle ...! Einige Benutzer müssen evtl. den folgenden Link hinzufügen:
7292
73-`ln -s libmysqlclient.so.12.0.0 libmysqlclient.so`
93+```text
94+ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
95+```
7496
7597Ich modifizierte trydb.pp, um Benutzerdetails einzubeziehen, zunächst indem ich host, Benutzer und Passwort als Konstanten hinzufügte:
7698
77-`const`\
78-`  host : Pchar= 'localhost';`\
79-`  user : Pchar= 'myusername';`\
80-`  passwd: Pchar = 'mypassword';`
99+``` pascal
100+const
101+ host : Pchar= 'localhost';
102+ user : Pchar= 'myusername';
103+ passwd: Pchar = 'mypassword';
104+```
81105
82106Ich habe auch herausgefunden, dass ich keine Verbindung zu mysql mit der Benutzung des mysql_connect() Aufrufs bekam, aber mit mysql_real_connect(), das mehr Parameter hat. Um die Dinge weiter zu komplizieren, scheint die Anzahl der Parameter zwischen Version3 (wo es sieben sind) und Version4 (wo es acht sind) geändert werden zu müssen. Vor der Benutzung von using mysql_real_connect musste ich mysql_init() verwenden, das nicht in der originalen mysql.pp zu finden ist, aber in mysql_v4.pp.
83107
84108Daher ist der Code für die Verbindung zur Datenbank jetzt:
85109
86110``` pascal
87111 { einige extra Variablen}
88112 var
89113 alloc : PMYSQL;
90114
91115 {Teil des Hauptprogramms}
92116
93117 begin
94118 if paramcount=1 then
95119 begin
96120 Dummy:=Paramstr(1)+#0;
97121 DataBase:=@Dummy[1];
98122 end;
99123
100124 Writeln ('Allocating Space...');
101125 alloc := mysql_init(PMYSQL(@qmysql));
102126 Write ('Connecting to MySQL...');
103127 sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
104128 if sock=Nil then
105129 begin
106130 Writeln (stderr,'Couldn''t connect to MySQL.');
107131 Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
108132 halt(1);
109133 end;
110134 Writeln ('Done.');
111135 Writeln ('Connection data:');
112136 {$ifdef Unix}
113137 writeln ('Mysql_port : ',mysql_port);
114138 writeln ('Mysql_unix_port : ',mysql_unix_port);
115139 {$endif}
116140 writeln ('Host info : ',mysql_get_host_info(sock));
117141 writeln ('Server info : ',mysql_stat(sock));
118142 writeln ('Client info : ',mysql_get_client_info);
119143
120144 Writeln ('Selecting Database ',DataBase,'...');
121145 if mysql_select_db(sock,DataBase) < 0 then
122146 begin
123147 Writeln (stderr,'Couldn''t select database ',Database);
124148 Writeln (stderr,mysql_error(sock));
125149 halt (1);
126150 end;
127151 {... wie die Originalinhalte von testdb.pp}
128152```
129153
130154Jetzt - sind sie bereit, um die Kompilierung von trydb.pp zu starten?
131155
132-` fpc trydb`
156+```text
157+ fpc trydb
158+```
133159
134160Erfolg! Jetzt starten sie es:
135161
136-` ./trydb`
162+```text
163+ ./trydb
164+```
137165
138166whoopee! Ich erhielt die Auflistung der FPC Entwickler!
139167
140168Einige zusätzliche Feinheiten: Machen sie die Eingabe der Benutzerdetails und der mysql Befehle interaktiv; benutzen sie eher Variablen als Konstanten und erlauben sie die Eingabe verschiedener SQL Befehle, bis wir den quit Befehl geben: schauen sie in der [[Lazarus Database Tutorial/TryDbpp|vollen Programmauflistung]] nach, wo Benutzerdetails von der Konsole aus eingegeben werden und das Programm in eine Schleife geht; wo SQL-Befehle von der Konsole aus eingegeben werden (ohne das abschließende Semikolon) und die Antworten ausgedruckt werden, bis 'quit' über die Tastatur eingegeben wird.
141169
142170Siehe [[Lazarus Database Tutorial/SampleListing|Einfaches Konsole Listing]] .
143171
144172### Verbindung zu MySQL von einer Lazarus Anwendung aus
145173
146174Dieses Tutorial zeigt, wie man Lazarus bei einer MySQL Datenbank anmelden und einfache Abfragen ausführen kann, lediglich unter Verwendung der Lazarus Grundkomponenten; es benutzt keine datensensitiven Komponenten, aber es illustriert die Prinzipien der Kopplung mit der Datenbank.
147175
148176**Achtung bei Windows:** wir benötigen die libmysql.dll in der rightigen Version. Welche version benötigt wird erfahren Sie aus den Sourcen (üblicherweise aus der mysql_version.pp).
149177
150178Erzeugen sie ein neues Projekt in Lazarus:
151179
152-`Projekt -> Neues Projekt -> Anwendung`
180+```text
181+Projekt -> Neues Projekt -> Anwendung
182+```
153183
154184Ein neues automatisch erzeugtes Formular wird erscheinen.
155185
156186Vergrößern sie das Formular bis es etwa die Hälfte ihres Bildschirms ausfüllt, dann benennen sie das Formular und seine Titelzeile (caption) in 'TryMySQL' um.
157187
158188Von der Standard Komponentenpalette platzieren sie drei Edit Felder oben links auf dem Formular, und platzieren sofort über jedem Feld ein Label. Ändern sie die Namen und Captions zu 'Host' (und HostLLabel,HostEdit), 'UserName' (und UserLabel, UserEdit) und 'Password' (mit PasswdLabel und PasswdEdit). Alternativ können sie LabelledEdit Komponenten von der Additional Palette benutzen.
159189
160190Wählen sie das Passwd Editfeld und finden sie die PasswordChar Eigenschaft: ändern sie diese dies auf * oder ein anderes Zeichen, so dass ihrer Eingaben in diesem Feld nicht erscheinen, sondern nur eine Reihe von * erscheint. Stellen sie sicher, dass die Eigenschaft Text für jedes Editfeld leer ist.
161191
162192Nun platzieren sie eine neues Edit Feld und Label oben rechts auf ihrem Formular. Ändern sie die Label Caption zu 'Enter SQL Command' und nennen sie es CommandEdit.
163193
164194Platzieren sie drei Buttons auf dem Formular: zwei links unter den Edit Feldern, und einen rechts unter dem command Feld.
165195
166196Benennen sie die Buttons auf der linken Seite 'Connect to Database' (ConnectButton) und 'Exit' (ExitButton) und den auf der rechten Seite 'Send Query' (QueryButton).
167197
168198Platzieren sie ein großes Memo Feld mit Label und Namen 'Results' (ResultMemo) unten rechts, um den meisten verfügbaren Platz auszufüllen. Finden sie seine ScrollBars Eigenschaft und wählen sie ssAutoBoth, so dass die Bildlaufleisten automatisch erscheinen wenn Text die Leerstellen füllt. Setzen sie die WordWrap Eigenschaft auf True.
169199
170200Platzieren sie eine Status Bar (von der Common Controls Palette) am unteren Ende des Formulars, und setzen seine SimpleText Eigenschaft auf 'TryMySQL'.
171201
172202Ein Bildschirmfoto des Formulars ist hier zu sehen: [Mysql Beispiel Screenshot](http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png)
173203
174204Nun müssen wir einige Ereignis-Handler schreiben.
175205
176206Die drei Edit-Boxen auf der linken sind für die Eingabe von Hostnamen, Benutzernamen und Passwort. Wenn diese zufriedenstellend eingegeben wurden, wird der Connect Button angeklickt. Der OnCLick Ereignis handler für diesen Button beruht auf Teilen des Textmodus FPC Programms oberhalb.
177207
178208Die Antworten von der Datenbank können jetzt nicht mit den Pascal *write* oder *writeln* Anweisungen geschrieben werden. Stattdessen müssen die Antworten in Strings konvertiert und in einem Memo Feld angezeigt werden. Wohingegen die Pascal *write* und *writeln* Anweisungen geeignet sind, eine Menge von Typumformungen 'on the fly' durchzuführen, die Benutzung eines Memo Felds für die Textausgabe erfordert die explizite Konvertierung von Datentypen in die korrekte Form eines string, daher müssen Pchar Variablen in Strings konvertiert werden mit *StrPas*, und Integers müssen mit *IntToStr* konvertiert werden.
179209
180210Strings werden im Memo Feld angezeigt unter Verwendung von
181211
182-`procedure ShowString (S : string);`\
183-`(* zeigt einen String in einem Memo Feld an *)`\
184-`begin`\
185-`       trymysqlForm1.ResultsMemo.Lines.Add (S)`\
186-`end;`
212+``` pascal
213+procedure ShowString (S : string);
214+(* zeigt einen String in einem Memo Feld an *)
215+begin
216+ trymysqlForm1.ResultsMemo.Lines.Add (S)
217+end;
218+```
187219
188220Der ConnectButton Ereignis-handler wird daher:
189221
190222``` pascal
191223 procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
192224 (* Verbinden zu MySQL unter Verwendung der Benutzerdaten von den Texteingabefeldern auf Main Form *)
193225 var strg: string;
194226
195227 begin
196228
197229 dummy1 := trymysqlForm1.HostEdit.text+#0;
198230 host := @dummy1[1];
199231 dummy2 := trymysqlForm1.UserEdit.text+#0;
200232 user := @dummy2[1] ;
201233 dummy3 := trymysqlForm1.PasswdEdit.text+#0;
202234 passwd := @dummy3[1] ;
203235
204236 alloc := mysql_init(PMYSQL(@qmysql));
205237 sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
206238 if sock=Nil then
207239 begin
208240 strg :='Couldn''t connect to MySQL.'; showstring (strg);
209241 Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
210242 end
211243 else
212244 begin
213245 trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';
214246 strg := 'Now choosing database : ' + database; showstring (strg);
215247 {$ifdef Unix}
216248 strg :='Mysql_port : '+ IntToStr(mysql_port); showstring (strg);
217249 strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
218250 {$endif}
219251 Strg :='Host info : ' + StrPas(mysql_get_host_info(sock));
220252 showstring (strg);
221253 Strg :='Server info : ' + StrPas(mysql_stat(sock)); showstring (strg);
222254 Strg :='Client info : ' + Strpas(mysql_get_client_info); showstring (strg);
223255
224256 trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';
225257 if mysql_select_db(sock,DataBase) < 0 then
226258 begin
227259 strg :='Couldn''t select database '+ Database; ShowString (strg);
228260 Strg := mysql_error(sock); ShowString (strg);
229261 end
230262 end;
231263 end;
232264```
233265
234266Das Textfeld rechts erlaubt die Eingabe einer SQL-Anweisung, ohne abschließendes Semikolon. Wenn sie mit seinem Inhalt oder Schreibweise zufrieden sind, drücken sie den SendQuery-Button, und die Abfrage wird abgearbeitet, mit den Ergebnissen, die in das ResultsMemo-Feld geschrieben sind.
235267
236268Der SendQuery Ereignis-Handler basiert wieder auf der FPC Textmodus Version, abgesehen davon, dass eine explizite Typenkonversion erfolgen muss bevor Strings in der Box angezeigt werden.
237269
238270Ein Unterschied zu dem Textmodus FPC Programm ist, dass das Programm nicht stoppt und MySQL nicht geschlossen wird, wenn eine Fehlerbedingung entdeckt wird. Stattdessen geht die Kontrolle an das Hauptformular zurück und eine Gelegenheit wird gegeben, den Eintrag zu berichtigen, bevor das Kommando neu eingereicht wird. Die Anwendung wird schließlich beendet (mit Schliessen von MySQL), wenn der Exit-Button angeklickt wird.
239271
240272Der Code für SendQuery folgt:
241273
242274``` pascal
243275 procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
244276 var
245277 dumquery, strg: string;
246278 begin
247279 dumquery := TrymysqlForm1.CommandEdit.text;
248280 dumquery := dumquery+#0;
249281 query := @dumquery[1];
250282 trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';
251283 strg := 'Executing query : ' + dumQuery; showstring (strg);
252284 if (mysql_query(sock,Query) < 0) then
253285 begin
254286 Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);
255287 end
256288 else
257289 begin
258290 recbuf := mysql_store_result(sock);
259291 if RecBuf=Nil then
260292 begin
261293 Strg :='Query returned nil result.'; showstring (strg);
262294 end
263295 else
264296 begin
265297 strg :='Number of records returned : ' + IntToStr(mysql_num_rows (recbuf));
266298 Showstring (strg);
267299 Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));
268300 showstring (strg);
269301 rowbuf := mysql_fetch_row(recbuf);
270302 while (rowbuf <>nil) do
271303 begin
272304 Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +
273305 rowbuf[2] +')';
274306 showstring (strg);
275307 rowbuf := mysql_fetch_row(recbuf);
276308 end;
277309 end;
278310 end;
279311 end;
280312```
281313
282314Speichern sie ihr Projekt, und drücken Start -\> Start
283315
284316#### Download des MYSQL Quelltextes
285317
286318Eine volle Auflistung des Programms gibt es hier [Beispiel Quellcode](http://lazarus-ccr.sourceforge.net/kbdata/mysqldemo.tar.gz)
287319
288320### Lazarus, MySQL und UTF-8
289321
290322*Das folgende könnte auch für andere Codepages/Zeichensätze erforderlich sein.*
291323
292324UTF-8 Unicode ist eine praktische Kodierung eines Multibyte-Zeichensatzes, der es gestattet, mit mehrsprachigen Texten zu arbeiten, ohne dazu WideStrings einzusetzen. Er wird von den Lazarus-SQLdb-Komponenten und von MySQL seit Version 4.1 unterstützt durch die Auswahl eines geeigneten Zeichensatzes.
293325
294326Allerdings gilt: ein einfaches Setzen dieser Kodierung als Vorgabe für Ihre Tabellen und die MySQL-Connection-Komponente resultiert in inkorrekter Speicherung und Rückgabe von UTF-8 Strings, wenn bestimmte akzentuierte/internationale Zeichen als Fragezeichen (?) angezeigt werden. Offensichtlich liegt die Ursache dafür darin, dass die MySQL-Client-Bibliothek mit dem Zeichensatz 'Latin1' als Vorgabe kompiliert wurde.
295327
296328Um eine korrekte Kommunikation zwischen Lazarus, der MySQL-Client-Bibliothek und dem MySQL-Server zu aktivieren, müssen zwei zusätzliche Abfragen **jedes Mal** ausgeführt werden, wenn eine Verbindung zur Datenbank aufgebaut wird:
297329
298330``` sql
299331SET CHARACTER SET `utf8`
300332```
301333
302334und
303335
304336``` sql
305337SET NAMES 'utf8'
306338```
307339
308340Die erste Abfrage stellt sicher, dass Ihre Anwendung die Zeichenketten in korrekter Kodierung empfängt. Und die zweite weist MySQL an, nicht die Strings zu konvertieren, die es von Ihrer Anwendung erhält.
309341
310342## Simple MySQL Demo Using the TMySQL50Connection Component
311343
312344Here is code that functions as a quick demo to get up and running simply (tested on Win XP with Lighty2Go, though xampp would be just as suitable). libmysql.dll was put in the project and lazarus.exe directories (available from a directory in Lighty2Go or xampp - but ensure that you use the correct version of libmysql.dll to match the chosen TMySQL5xxConnection Component - for TMySQL50Connection use the version for MySQL 5.0 (1484kB) and this can connect fine to both MySQL 5.0 and MySQL 5.1 DBMSs. The 5.1 version of libmysql.dll will not function with TMySQL50Connection). There is no requirement to place any components on the form other than the three edit boxes, a memo box and a few buttons. You need to add mysql50conn and sqldb to the uses statement. The Lazarus component directory must be rw for the programmer. The mysql dbms here has a user 'root' with no password, and a database test1 with table tPerson which has three fields: personid (int), surname (varchar(40)) and dob (datetime). phpMyAdmin (in Lighty2Go) was used to create the db, table and fields and insert some sample data. Note that dates in phpMyAdmin should be entered YYYY-MM-DD, though the program created below will accept dates in the usual formats. The button btnTest must be clicked first as it creates the connection with the dbms. Note the line that applies updates - without this the changed or new data will not be written back to the db though they will be in memory and can be viewed using btnFirst and btnNext.
313345
314346``` pascal
315347unit unt_db;
316348// Example based on:
317349// http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&t=5761
318350// from tpglemur on that forum
319351{$mode objfpc}{$H+}
320352interface
321353uses
322354 Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
323355 mysql50conn, sqldb, StdCtrls;
324356type
325357 { TForm1 }
326358 TForm1 = class(TForm)
327359 btnTest: TButton;
328360 btnNext: TButton;
329361 btnFirst: TButton;
330362 btnNew: TButton;
331363 edtPersonID: TEdit;
332364 edtSurname: TEdit;
333365 edtDOB: TEdit;
334366 Memo1: TMemo;
335367 procedure btnFirstClick(Sender: TObject);
336368 procedure btnNewClick(Sender: TObject);
337369 procedure btnNextClick(Sender: TObject);
338370 procedure btnTestClick(Sender: TObject);
339371 private
340372 { private declarations }
341373 conn : TMySQL50Connection;
342374 query : TSQLQuery;
343375 transaction : TSQLTransaction;
344376 procedure Display;
345377 public
346378 { public declarations }
347379 end;
348380var
349381 Form1: TForm1;
350382implementation
351383{ TForm1 }
352384procedure TForm1.btnTestClick(Sender: TObject);
353385var
354386 S: String;
355387begin
356388 conn := TMySQL50Connection.Create(nil);
357389 query := TSQLQuery.Create(nil);
358390 transaction := TSQLTransaction.Create(nil);
359391 try
360392 try
361393 conn.HostName := '127.0.0.1';
362394 conn.UserName := 'root';
363395 conn.Password := '';
364396 conn.DatabaseName := 'test1';
365397 conn.Connected := True;
366398 conn.Transaction := transaction;
367399 query.DataBase := conn;
368400 //query.ParseSQL := true; //line not needed - this is the default anyway
369401 //query.ReadOnly := false; //line not needed - this is the default anyway
370402 query.SQL.Text := 'select * from tperson';
371403 query.Open;
372404
373405 query.Last;
374406 S := IntToStr(query.RecordCount) + #13#10;
375407 query.First;
376408
377409 while not query.EOF do
378410 begin
379411 S := S + query.FieldByName('surname').AsString + #13#10;
380412 query.Next;
381413 end;
382414 finally
383415 //query.Free;
384416 //conn.Free;
385417 end;
386418 except
387419 on E: Exception do
388420 ShowMessage(E.message);
389421 end;
390422 Memo1.Text:= S;
391423end;
392424
393425procedure TForm1.Display;
394426begin
395427 edtPersonID.Text := query.FieldByName('personid').AsString;
396428 edtSurname.Text := query.FieldByName('surname').AsString;
397429 edtDOB.Text := query.FieldByName('dob').AsString;
398430end;
399431
400432procedure TForm1.btnFirstClick(Sender: TObject);
401433begin
402434 query.First;
403435 Display;
404436end;
405437
406438procedure TForm1.btnNewClick(Sender: TObject);
407439begin
408440 query.Append;
409441 query.FieldValues['personid'] := edtPersonID.Text;
410442 query.FieldValues['surname'] := edtSurname.Text;
411443 query.FieldValues['dob'] := edtDOB.Text;
412444 query.Post;
413445 query.ApplyUpdates; //to apply update
414446 //transaction.Commit; //line not needed
415447end;
416448
417449procedure TForm1.btnNextClick(Sender: TObject);
418450begin
419451 query.Next;
420452 Display;
421453end;
422454
423455initialization
424456 {$I unt_db.lrs}
425457end.
426458```
427459
428460Here is a version using the TMySQL50Connection, TSQLQuery, TSQLTransaction, TDatasource and TDBGrid components that have been placed on the form:
429461
430462``` pascal
431463unit unt_mysql2;
432464{$mode objfpc}{$H+}
433465interface
434466uses
435467 Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
436468 mysql50conn, sqldb, StdCtrls, db, DBGrids, DbCtrls;
437469type
438470 { TForm1 }
439471 TForm1 = class(TForm)
440472 btnConnect: TButton;
441473 btnSave: TButton;
442474 btnNext: TButton;
443475 btnPrior: TButton;
444476 Datasource1: TDatasource;
445477 DBGrid1: TDBGrid;
446478 Memo1: TMemo;
447479 MySQL50Connection1: TMySQL50Connection;
448480 SQLQuery1: TSQLQuery;
449481 SQLTransaction1: TSQLTransaction;
450482 procedure btnConnectClick(Sender: TObject);
451483 procedure btnNextClick(Sender: TObject);
452484 procedure btnPriorClick(Sender: TObject);
453485 procedure btnSaveClick(Sender: TObject);
454486 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
455487 procedure FormCreate(Sender: TObject);
456488 private
457489 { private declarations }
458490 public
459491 { public declarations }
460492 end;
461493var
462494 Form1: TForm1;
463495implementation
464496{ TForm1 }
465497
466498procedure TForm1.FormCreate(Sender: TObject);
467499begin
468500 //Set properties of components:
469501 //(could be done in the Object Inspector)
470502 MySQL50Connection1.HostName := '127.0.0.1';
471503 MySQL50Connection1.UserName := 'root';
472504 MySQL50Connection1.Password := '';
473505 MySQL50Connection1.DatabaseName := 'test1';
474506 MySQL50Connection1.Transaction := SQLTransaction1;
475507 //SQLQuery1.ParseSQL := true; //line not needed - this is the default
476508 //SQLQuery1.ReadOnly := false; //line not needed - this is the default
477509 SQLQuery1.SQL.Text := 'select * from tperson';
478510 SQLQuery1.Transaction := SQLTransaction1;
479511 SQLQuery1.UpdateMode := upWhereChanged;
480512 Datasource1.Dataset := SQLQuery1;
481513 DBGrid1.DataSource := Datasource1;;
482514end;
483515
484516procedure TForm1.btnConnectClick(Sender: TObject);
485517var
486518 S : string;
487519begin
488520 try
489521 MySQL50Connection1.Connected := true;
490522 SQLQuery1.Open;
491523
492524 //Tests to see if all is OK:
493525 SQLQuery1.Last;
494526 S := IntToStr(SQLQuery1.RecordCount) + #13#10;
495527 SQLQuery1.First;
496528 while not SQLQuery1.EOF do
497529 begin
498530 S := S + SQLQuery1.FieldByName('surname').AsString + #13#10;
499531 SQLQuery1.Next;
500532 end;
501533 except
502534 on E: Exception do
503535 ShowMessage(E.message);
504536 end;
505537 Memo1.Text:= S;
506538end;
507539
508540procedure TForm1.btnNextClick(Sender: TObject);
509541begin
510542 SQLQuery1.Next;
511543end;
512544
513545procedure TForm1.btnPriorClick(Sender: TObject);
514546begin
515547 SQLQuery1.Prior;
516548end;
517549
518550procedure TForm1.btnSaveClick(Sender: TObject);
519551begin
520552 SQLQuery1.ApplyUpdates;
521553end;
522554
523555procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
524556begin
525557 //Required or get EDatabase error on close:
526558 MySQL50Connection1.Connected := false;
527559end;
528560
529561initialization
530562 {$I unt_mysql2.lrs}
531563end.
532564```
533565
534566## Lazarus und PostgreSQL
535567
536568Dies ist ein sehr kurzes Tutorial, wie man mit Lazarus 0.9.12 oder höher eine Verbindung zu einer PostgreSQL-Datenbank aufbaut, lokal oder entfernt, mittels TPQConnection. Diese Komponente wird zu Lazarus hinzugefügt, wenn das Package 'lazarus/components/sqldb/sqldblaz.lpk' installiert wird.
537569
538570Nach erfolgreicher Installation, befolgen Sie diese Schritte:
539571
540572- Nehmen Sie eine PQConnection aus dem Fach SQLdb
541573- Nehmen Sie eine SQLQuery aus dem Fach SQLdb
542574- Nehmen Sie eine SQLTransaction aus dem Fach SQLdb
543575- Nehmen Sie eine DataSource aus dem Fach DataAccess
544576- Nehmen Sie ein DBGrid aus dem Fach DataControls
545577
546578- In der PQConnection setzen Sie ein:
547579 - die Eigenschaft 'transaction' mit dem jeweiligen SQLTransaction-Object
548580 - den Datenbanknamen
549581 - HostName
550582 - UserName + password
551583
552584- Überprüfen Sie, ob die SQLTransaction automatisch geändert wurde und jetzt auf die PQConnection zeigt
553585
554586- In der SQLQuery setzen Sie ein:
555587 - die Eigenschaft 'transaction' mit dem jeweiligen Object
556588 - die Eigenschaft 'database' mit dem jeweiligen Object
557589 - SQL (irgendetwas wie 'select * from anytable')
558590
559591- Im Objekt 'DataSource' setzen Sie die Eigenschaft 'DataSet' mit dem jeweiligen SQLQuery-Object
560592
561593- Im DBGrid setzen Sie die Datenquelle als DataSource-Object
562594
563595Stellen Sie alles auf verbunden und aktiviert und das DBGrid sollte zur Entwurfszeit gefüllt werden. TDBText und TDBEdit scheinen zu funktionieren, aber zeigen (bei mir) nur die Daten.
564596
565597Um die Inhalte der Datenbank zu ändern, rief ich die DB-Engine direkt mit dem folgenden Code auf:
566598
567599``` pascal
568600try
569601 sql:= 'UPDATE table SET setting=1';
570602 PQDataBase.Connected:=True;
571603 PQDataBase.ExecuteDirect('Begin Work;');
572604 PQDataBase.ExecuteDirect(sql);
573605 PQDataBase.ExecuteDirect('Commit Work;');
574606 PQDataBase.Connected:=False;
575607except
576608 on E : EDatabaseError do
577609 MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
578610 on E : Exception do
579611 MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
580612end;
581613```
582614
583615- Anmerkungen:
584616 - Getestet unter Windows, Lazarus 0.9.12 + PgSQL 8.3.1
585617 - Einige Tests unter Linux, Lazarus 0.9.12 and PgSQL 8.0.x
586618
587619- Installation und Fehler:
588620 - In der getesteten Version of Lazarus .12, haben die Felder vom Typ "text" und "numeric" Fehler
589621 - Ich verwendete problemlos: char fixed size, int und float8
590622 - Manchmal beseitigt ein Neustart von Lazarus dumme Fehler...
591623 - Nach einigen Fehlern bleiben die Transaktionen aktiv und sollten manuell deaktiviert werden
592624 - Von Lazarus gemachte Änderungen werden natürlich erst dann sichtbar, wenn die Transaktionen abgewickelt sind
593625 - Der integrierte Debugger scheint fehlerbehaftet (zumindest unter Windows) - manchmal hilft es, ihn außerhalb der IDE zu starten, um Fehler zu finden
594626 - Unter Linux werden bestimmte Fehlermeldungen über die Konsole ausgegeben -- starten Sie Ihr Programm in der Befehlszeile, manchmal finden Sie dort einige zusätzliche nützliche Infos zu Debuggen
595627 - Error: "Can not load Postgresql client. Is it installed (libpq.so) ?"
596628 - Erweitern Sie den Pfad um die Suche nach libpq* aus der PostgreSQL-Installation.
597629 - Unter Linux fügen Sie den Pfad zur Datei 'libpq.so' zum Abschnitt 'libraries' in Ihrer Datei /etc/fpc.cfg. Zum Beispiel: -Fl/usr/local/pgsql/lib
598630 - Es ist vielleicht nötig einen symbolischen Link zu erzeugen: ln -s /usr/lib/pqsql.so.5 /usr/lib/pqsql.so
599631 - Unter Windows fügen Sie diese Bibliotheken irgendwo in der Umgebungsvariablen PATH oder project dir ein
600632 - Unter Windows kopierte ich alle DLLs aus meinem Verzeichnis 'C:\Program Files\PostgreSQL\8.1\bin' in ein anderes Verzeichnis im Pfad
601633 - Oder fügen Sie dieses Verzeichnis 'postgres\bin' Ihrem Pfad hinzu
602634
603635Ein gutes Beispiel darüber, wie man unter Windows Lazarus mit PostgreSQL verbindet ist [easyDB](http://paginas.fe.up.pt/~asousa/wiki/doku.php?id=proj:lazarus_projects#easy_db).
604636
605637## Lazarus und SQLite
606638
607639von Luiz Américo
608640
609641Besuchen sie die [sqlite4fpc Homepage](http://sqlite4fpc.yolasite.com/). Dort finden sie die API-Referenz und weitere Tutorials.
610642
611643### Einführung
612644
613645TSqliteDataset und TSqlite3Dataset sind TDataset Abkömmling-Klassen, die jeweils auf sqlite 2.8.x und 3.x.x Datenbanken zugreifen. Nachstehend befindet sich eine Liste der wichtigsten Vor- und Nachteile:
614646
615647Vorteile:
616648
617649- Flexibilität: Programmier können wählen, ob sie die SQL Sprache verwenden oder nicht, erlaubt ihnen mit einfachen Tabellenlayouts zu arbeiten oder jedem komplexen Layout, welches SQL ermöglicht.
618650- Automatisches Datenbank Update: Kein Bedarf, die Datenbank manuell mit SQL Anweisungen zu updaten, eine einzelne Methode erledigt dies.
619651- Schnelligkeit: Es puffert die Daten im Arbeitsspeicher, was das Browsen im Datenbestand schnell macht.
620652- Keine Server Installation/Konfiguration: einfach zusammen verfrachten mit der sqlite dynamic Bibliothek.
621653
622654Nachteile
623655
624656- Benötigt externe Datei (sqlite Bibliothek)
625657
626658### Voraussetzungen
627659
628660- Für sqlite2 Datenbanken:
629661 - fpc 2.0.0
630662 - Lazarus 0.9.10
631663 - sqlite Laufzeitbibliothek 2.8.15 oder höher (von [www.sqlite.org](http://www.sqlite.org))
632664
633665- Für sqlite3 Datenbanken:
634666 - fpc 2.0.2
635667 - Lazarus 0.9.11 (SVN Revision 8443 oder höher)
636668 - sqlite Laufzeitbibliothek 3.2.1 oder höher (von [www.sqlite.org](http://www.sqlite.org))
637669
638670**Bevor sie ein Lazarus Projekt beginnen, stellen sie sicher, dass:**
639671
640672- die sqlite Bibliothek im Systempfad (PATH) ist oder im Verzeichnis des executable
641673- unter Linux, bringen sie cmem als erste Unit in den uses-Abschnitt des Hauptprogramms
642674
643675### Anwendung (grundlegende Verwendung)
644676
645677Installieren sie das Package aus dem /components/sqlite Verzeichnis (siehe Instruktionen [[Install Packages/de|hier]])
646678
647679Zur Entwicklungszeit setzen sie die folgenen Eigenschaften:
648680
649681- FileName: Pfad der sqlite Datei \[benötigt\]
650682- TableName: Name der Tabelle, die in der SQL Anweisung benutzt wird \[benötigt\]
651683- Sql: eine SQL *select* Anweisung \[optional\]
652684
653685**Erzeugen einer Tabelle (Dataset)**
654686
655687Klicken sie doppelt auf das Komponenten-Icon oder benutzen sie den 'Create Table' Punkt im Popup-Menü, das erscheint, wenn sie mit der rechten Maustaste klicken. Ein einfacher selbsterklärender Tabellen-Editor wird eingeblendet.
656688
657-` Hier sind alle Feldtypen, die von TSqliteDataset und TSqlite3Dataset unterstützt werden: `\
658-` `\
659-` Integer`\
660-` AutoInc`\
661-` String`\
662-` Memo`\
663-` Bool `\
664-` Float`\
665-` Word`\
666-` DateTime`\
667-` Date`\
668-` Time`\
669-` LargeInt`\
670-` Currency`\
671-` `
689+```text
690+ Hier sind alle Feldtypen, die von TSqliteDataset und TSqlite3Dataset unterstützt werden:
691+
692+ Integer
693+ AutoInc
694+ String
695+ Memo
696+ Bool
697+ Float
698+ Word
699+ DateTime
700+ Date
701+ Time
702+ LargeInt
703+ Currency
704+```
672705
673706**Abrufen der Daten**
674707
675708Nach dem Erzeugen der Tabelle oder mit einer vorher erzeugten Tabelle, öffnen sie die Datenmenge mit der *Open* Methode. Wenn die SQL-Eigenschaft nicht gesetzt wurde, dann werden alle Datensätze von allen Feldern abgerufen, das selbe passiert, wenn sie SQL auf:
676709
677-` SQL:='Select * from TABLENAME'; `
710+``` pascal
711+ SQL:='Select * from TABLENAME';
712+```
678713
679714setzen.
680715
681716**Anwendung von Änderungen zur grundlegenden Datendatei**
682717
683718Um die Funktion ApplyUpdates zu benutzen, muss der Datenbestand mindestens ein Feld enthalten, das die Anforderungen für einen Primary Key erfüllt (Werte müssen UNIQUE und nicht NULL sein).
684719
685720Es ist möglich, dies auf zwei Wegen zu erreichen:
686721
687722- Setzen sie die Eigenschaft PrimaryKey auf den Namen eines Primary Key Feldes.
688723- Fügen sie ein Feld AutoInc hinzu (dies ist einfacher seit TSqliteDataSet es automatisch als Primary Key behandelt)
689724
690725Wenn eine oder zwei Bedingungen gesetzt sind, rufen sie
691726
692-` ApplyUpdates;`
727+```text
728+ ApplyUpdates;
729+```
693730
694731auf.
695732
696733PS1: Wenn beide Bedingungen gesetzt sind, wird das Feld entsprechend dem PrimaryKey genutzt, um die Updates anzuwenden.
697734
698735PS2: Setzen von PrimaryKey auf ein Feld, das kein Primary Key ist, wird zu einem Verlust von Daten führen, wenn ApplyUpdates aufgerufen wird, daher stellen sie sicher, dass das gewählte Feld keinen Null Wert und Unique values enthält, bevor sie es benutzen.
699736
700737### Bemerkungen
701738
702739- Obwohl es mit 10000 Datensätzen getestet wurde und problemlos funktionierte, hält TSqliteDataset alle Daten im Arbeitsspeicher. Denken sie daher daran, nur die notwendigen Daten abzurufen (hauptsächlich mit Memo Feldern).
703740- Die selbe Datendatei (Filename Eigenschaft) kann verschiedene Tabllen/Datasets hosten.
704741- Verschiedene Datasets (unterschiedliche Kombinationen von Feldern) können unter simultaner Nutzung der selben Tabelle erzeugt werden .
705742- Es ist möglich, die Daten mit der *WHERE* Anweisung in SQL zu filtern, das Dataset zu schliessen und wieder zu öffnen (oder die Methode RefetchData aufrufen). Aber in diesem Fall müssen die Reihenfolge und Anzahl der Felder gleich bleiben.
706743- Es ist auch möglich, komplexe SQL-Anweisungen zu verwenden mittels Aliasen, Joins, Views bei mehrfachen Tabellen (denken sie daran, dass sie sich in der selben Datendatei befinden müssen), aber in diesem Fall wird ApplyUpdates nicht funktionieren. Wenn jemand komplexe Abfragen benutzen und die Updates in die Datendatei einsetzen will, soll er mir schreiben und ich werde einige Hinweise geben, wie man das tut.
707744- Es ist erlaubt, den Dateinamen zu einer sqlite2.x Datendatei zu setzen, welche nicht von TSqliteDataset erzeugt wurde, aber einige Felder werden nicht den korrekten Feldtyp ermitteln. Diese werden als String-Felder behandelt.
708745
709746Allgemeine Beispiele sind zu finden im fpc/fcl/db/sqlite CVS-Verzeichnis
710747
711748Luiz Américo pascalive(at)bol(dot)com(dot)br
712749
713750## Lazarus und MSSQL
714751
715752Bitte schreiben sie mir!
716753
717754## Lazarus und Interbase / Firebird
718755
719756Schauen Sie auf [[Install Packages/de|Installation von Packages]] nach. Auf dieser Seite befindet sich ein erstes kleines Beispiel und eine Beschreibung, wie man eine Verbindung zu einem IB- oder FB-Server herstellt. Informationen zu Firebird gibt es auch hier [[Firebird]].
720757
721758Funktioniert auch mit der neuesten Zeoslib (aus dem cvs).
722759
723760### FBLib Firebird-Bibliothek
724761
725762[FBLib](http://fblib.altervista.org) ist eine Open-Source-Bibliothek für den direkten Zugriff auf das relationale Datenbanksystem Firebird. Funtioniert mit Borland Delphi, Kylix, Free Pascal und Lazarus.
726763
727764Folgende Merkmale sind aktuell enthalten:
728765
729766- Direkter Zugriff auf Firebird 1.0.x 1.5.x, 2.x Classic oder SuperServer
730767- Multi-Plattform \[Win32, Gnu/Linux, FreeBSD)
731768- Automatische Auswahl der Klientenbibliothek 'fbclient' oder 'gds32'
732769- Abfragen mit Parametern
733770- Unterstützt den SQL-Dialekt 1/3
734771- LGPL Lizenz-Vereinbarung
735772- Extrahiert Metadaten
736773- Einfacher Skript-Parser
737774- Fügt nur 100-150 KB zur ausführbaren EXE-Datei hinzu
738775- Unterstützt BLOB-Felder
739776- Exportiert Daten zu einem HTML SQL Script
740777- Service-Manager (Backup, Restore, gfix...)
741778- Ereignis-Benachrichtigung
742779
743780Sie können die Dokumentation von der [FBLib Website](http://fblib.altervista.org/) herunterladen.
744781
745782[Hiere](http://www.firebirdnews.org/?p=1769) finden Sie eine aktuelle Version. Oder Sie benutzen SVN: [1](https://tiopf.svn.sourceforge.net/svnroot/tiopf/3rdParty/FBLib/Trunk) (Tipp von [Guionardo](http://wiki.lazarus.freepascal.org/User:Guiosoft))
746783
747784## Lazarus und dBase
748785
749786Tony Maro
750787
751788Sie können auch mit dem Besuch der [[Lazarus Tdbf Tutorial/de|TDbf Tutorial Seite]] anfangen.
752789
753790FPC enthält eine einfache Datenbank-Komponente, die ähnlich funktioniert wie die Delphi-Komponente TTable, genannt "TDbf" ([TDbf Webseite](http://tdbf.sourceforge.net/)), die eine sehr elementare Teilmenge von Features für dBase-Dateien bietet. Sie wird inzwischen standardmäßig installiert, so dass sie das Lazarus Package aus dem "lazarus/components/tdbf" Verzeichnis nicht mehr manuell installieren und ihre Lazarus IDE neu aufbauen müssen (rebuild). Sie erscheint neben 'TDatasource' in ihrer Komponentenpalette.
754791
755792Die Komponente TDbf hat einen Vorteil gegenüber anderen Datenbank-Komponenten, dass sie keine Art von Datenbank-Laufzeit-engines benötigt. Sie ist aber nicht die beste Option für große Datenbankanwendungen.
756793
757794Sie ist sehr einfach zu benutzen. Nehmen sie einfach eine TDbf und legen sie sie auf ihrem Formular ab, setzen den Laufzeit-Pfad auf das Verzeichnis, wo sich ihre Datenbank-Dateien befinden, setzen den Tabellennamen und verbinden sie mit ihrer TDatasource-Komponente.
758795
759796Wirkliche Funktionalität benötigt ein bißchen mehr Aufwand, wie auch immer. Wenn eine Tabelle nicht bereits schon existiert, müssen sie sie per Programm erzeugen, es sei denn, es gibt einen kompatiblen Tabellen-Designer, mit dem ich nicht vertraut bin.
760797
761798Der Versuch, eine nicht existierende Tabelle zu öffnen, wird einen Fehler erzeugen. Tabellen können per Programm durch die Komponente erzeugt werden, sobald der Laufzeit-Pfad und der Tabellenname gesetzt wurden.
762799
763800Ein Beispiel: Sie erzeugen eine Tabelle mit dem Namen "dvds", um ihre DVD-Kollektion zu speichern, in dem sie sie auf ihrem Formular ablegen, den Laufzeit-Pfad setzen und den Tabellennamen auf "dvds" setzen. Die resultierende Datei heißt "dvds.dbf".
764801
765802Fügen sie das Folgende in ihren Code ein:
766803
767-`   Dbf1.FilePathFull = '/Pfad/zu/meiner/Datenbank';`\
768-`   Dbf1.TableName = 'dvds';`\
769-`   With Dbf1.FieldDefs do begin`\
770-`       Add('Name', ftString, 80, True);`\
771-`       Add('Description', ftMemo, 0, False);`\
772-`       Add('Rating', ftString, 5, False);`\
773-`   end;`\
774-`   Dbf1.CreateTable;`
804+``` pascal
805+ Dbf1.FilePathFull = '/Pfad/zu/meiner/Datenbank';
806+ Dbf1.TableName = 'dvds';
807+ With Dbf1.FieldDefs do begin
808+ Add('Name', ftString, 80, True);
809+ Add('Description', ftMemo, 0, False);
810+ Add('Rating', ftString, 5, False);
811+ end;
812+ Dbf1.CreateTable;
813+```
775814
776815Wenn dieser Code läuft, wird ihre Tabelle DVD-Kollektion erzeugt. Danach werden alle datensensitiven Komponenten, die durch TDatasource mit dieser Komponente verbunden sind, einen einfachen Zugang zu den Daten erlauben.
777816
778817Das Hinzügen von Indexen ist ein wenig unterschiedlich von ihrer typischen TTable. Es muss getan werden, nachdem die Datenbank geöffnet wurde. Es ist auch die selbe Methode, die sie zum Erneuern der Indexe verwenden. Zum Beispiel:
779818
780-`   Dbf1.Exclusive := True;`\
781-`   Dbf1.Open;`\
782-`   Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);`\
783-`   Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);`\
784-`   Dbf1.Close;`
819+``` pascal
820+ Dbf1.Exclusive := True;
821+ Dbf1.Open;
822+ Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);
823+ Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
824+ Dbf1.Close;
825+```
785826
786827Der erste (primary) Index ist eine Datei mit dem Namen "dvdsname.mdx" und der zweite ist die Datei "rating.ndx". Daher müssen sie aufpassen in einer Mehrfach-Tabellen Datenbank, den selben Dateinamen nicht zweimal zu verwenden.
787828
788829Ich will versuchen, ein detaillierteres Beispiel zu einem späteren Zeitpunkt hinzuzufügen, aber hoffentlich wird dies jene 'alten' Delphi-Programmierer anspornen, Datenbankprogramme mit Lazarus zu schreiben!
789830
790831## Verwendung von TSdfDataset und TFixedDataset
791832
792833TSdfDataset and TFixedDataset are two simple datasets which offer a very simple textual storage format. These datasets are very convenient for small databases, because they are fully implemented as an object pascal unit, and thus require no external libraries, and because their textual format allows them to be easely edited with a text editor.
793834
794835To start with this formats, a initial database file should be created. The format is very simple, so use a text editor to do this.
795836
796837Below is a sample database for TSdfDataset. Note that the first line has the names of the fields and that we are using commas as separators:
797838
798839 ID,NAMEEN,NAMEPT,HEIGHT,WIDTH,PINS,DRAWINGCODE
799840 1,resistor,resistor,1,1,1,LINE
800841 2,capacitor,capacitor,1,1,1,LINE
801842 3,transistor npn,transistor npn
802843
803844And here is an example database for using with TFixedDataset. Each record occupies a fixed amount of space, and if the field is smaller then it, spaces should be used to fill the remaining size.
804845
805846 Name = 15 chars; Surname = 15 chars; Tell = 10 chars; e_mail = 20 chars;
806847 Piet Pompies piet@pompies.net
807848
808849### Direkte Verwendung der Datasets
809850
810851Sometimes it is useful to create the dataset and work with it completely in code, and the following code will do exactly this. Note some peculiarities of TSdfDataset/TFixedDataset:
811852
812853- The lines in the database can have a maximum size of about 300. A fix is being researched.
813854- It is necessary to add the field definitions. Some datasets are able to fill this information alone from the database file
814855- One should set FirstLineAsSchema to true, to indicate that the first line includes the field names and positions
815856- The Delimiter property holds the separator for the fields. It will not be possible to use this char in strings in the database. Similarly it will not be possible to have lineendings in the database because they mark the change between records. It's possible to overcome this by substituting the needed comma or line ending with another not often used char, like \# for example. So that when showing the data on screen all \# chars could be converted to line endings and the inverse when storing data back to the database. The ReplaceString routine is useful here.
816857
817858``` pascal
818859constructor TComponentsDatabase.Create;
819860begin
820861 inherited Create;
821862
822863 FDataset := TSdfDataset.Create(nil);
823864 FDataset.FileName := vConfigurations.ComponentsDBFile;
824865
825866 // Not necessary with TSdfDataset
826867// FDataset.TableName := STR_DB_COMPONENTS_TABLE;
827868// FDataset.PrimaryKey := STR_DB_COMPONENTS_ID;
828869
829870 // Adds field definitions
830871 FDataset.FieldDefs.Add('ID', ftString);
831872 FDataset.FieldDefs.Add('NAMEEN', ftString);
832873 FDataset.FieldDefs.Add('NAMEPT', ftString);
833874 FDataset.FieldDefs.Add('HEIGHT', ftString);
834875 FDataset.FieldDefs.Add('WIDTH', ftString);
835876 FDataset.FieldDefs.Add('PINS', ftString);
836877 FDataset.FieldDefs.Add('DRAWINGCODE', ftString);
837878
838879 // Necessary for TSdfDataset
839880 FDataset.Delimiter := ',';
840881 FDataset.FirstLineAsSchema := True;
841882
842883 FDataset.Active := True;
843884
844885 // Sets the initial record
845886 CurrentRecNo := 1;
846887 FDataset.First;
847888end;
848889```
849890
850891When using TSdfDataset directly be careful that althought it is implemented, RecNo does not work correctly, neither for setting nor for reading. The standard movimentation routines like First, Next, Prior and Last work correctly, so it's possible to use them to implement a replacement for RecNo. Keep a variable somewhere called CurrentRecNo which will hold the current RecNo value. Remember that this variable will have the same convention as RecNo, so the first record has number 1. After activating the database initialize the database to the first record with TSdfDataset.First and with CurrentRecNo := 1
851892
852893``` pascal
853894{@@
854895 Moves to the desired record using TDataset.Next and TDataset.Prior
855896 Avoids using TDataset.RecNo which doesn't work in all datasets
856897
857898 @param AID Indicates the record number. The first record has number 1
858899}
859900procedure TComponentsDatabase.GoToRec(AID: Integer);
860901begin
861902 // We are before the desired record, move forward
862903 if CurrentRecNo < AID then
863904 begin
864905 while (not FDataset.EOF) and (CurrentRecNo < AID) do
865906 begin
866907 FDataset.Next;
867908 FDataset.CursorPosChanged;
868909 Inc(CurrentRecNo);
869910 end;
870911 end
871912 // We are after the desired record, move back
872913 else if CurrentRecNo > AID then
873914 begin
874915 while (CurrentRecNo >= 1) and (CurrentRecNo > AID) do
875916 begin
876917 FDataset.Prior;
877918 FDataset.CursorPosChanged;
878919 Dec(CurrentRecNo);
879920 end;
880921 end;
881922end;
882923```
883924
884925### Verwendung mit datensensitiven Komponenten
885926
886927## Siehe auch
887928
888929- [[Databases/de|Datenbanken (deutsch)]] - Startseite für Datenbankanwendungen mit Lazarus
889930- [[Databases in Lazarus/de|Datenbanken in Lazarus (deutsch)]] - Ein Überblick über die Verwendung von Datenbanken in Lazarus
890931- [[How to write in-memory database applications in Lazarus/FPC]] - In-Memory Datenbank-Anwendungen
891932- [[MySQLDatabases/de|MySQLDatenbanken (deutsch)]] - Erstellung einer Datenbankanwendung unter Verwendung von MySQL
892933- [[Zeos tutorial/de|Zeos Tutorial (deutsch)]] - Verwendung der Zeos Komponenten
893934- [[Lazarus Tdbf Tutorial]] - Tutorial über einfache Datenbankentwicklung mittels der [TDbf](http://tdbf.sf.net)-Komponente (von Micha Nelissen)
894935- [[Lazarus DB Faq/de|Lazarus DB Faq (deutsch]] - FAQ über Datenbanken in Lazarus
895936- [[Firebird]] - Erstellen einer Datenbankanwendung für Firebird
896937- [[ODBCConn]] - Verbindung mit ODBC-Datenbanken
897938- [[MS Access]] - Wie man auf eine Microsoft Access Datenbank zugreift
898939
899940## Externe Links
900941
901942- [Pascal Data Objects](http://pdo.sourceforge.net) - eine Datenbank API die mit FPC und Delphi funktioniert und die nativen MySQL-Bibliotheken für Version 4.1 und 5.0 sowie Firebird SQL 1.5 und 2.0 verwendet. Sie wurde durch PHP's PDO-Klasse angeregt.
902943- [Zeos+SQLite Tutorial](http://lazaruszeos.blogspot.com) - Ein gutes Tutorial mit Screenshots. Es erklärt wie Sie SQLite und Zeos benutzen. Allerdings auf Spanisch - (Google translate hilft bei der Übersetzung ins Deutsche)
903944
904945---
905946*From the Free Pascal wiki, page "Lazarus Database Tutorial/de", as it stood on 2020-02-18 after a change by Trev, 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).*

Back to history