Sign in Join
Wiki copytemporary

Lazarus Database Tutorial/de: what changed

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

OldNewLine
11Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].\
2-\
2+
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
17-**MySQL-Sourcen einbinden** Es gibt ein Verzeichnis mit einem Beispielprogramm in \$(fpc<b>src</b>dir)/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.
17+**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
2121`CREATE DATABASE testdb;`
2222
2323Dann müssen sie sicherstellen, dass alle relevanten Benutzer einen passenden Zugriff darauf haben
2424
2525`GRANT ALL ON testdb TO johnny@localhost IDENTIFIED BY 'johnnyspassword'; `
2626
2727Es gibt ein Script namens mkdb, welches sie nun starten sollten:
2828
2929`sh ./mkdb`
3030
3131Dies 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:
3232
3333`mysql -u root -p  ${1-testdb} << EOF >/dev/null`
3434
3535und 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
3636
3737`select * from FPdev;`
3838
3939Sie sollten eine Tabelle sehen, welche die ID, den Benutzernamen und die Emailadresse von einem der FPC Entwickler enthält.
4040
4141**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!!).
4242
4343Ich habe herausgefunden, dass das Programm aus verschiedenen Gründen nicht mit mysql verbinden konnte:
4444
4545- Mein System (SuSE Linux v9.0) installiert mysql v4.0.15, nicht die Version 3, für welche das Package bestimmt war.
4646
4747- Das Programm benötigt Benutzernamen und Passwörter, um Zugriff auf die Datenbank zu erhalten.
4848
4949- 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!)
5050
5151Ich 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
5252
5353`uses mysql_v4`
5454
5555und die Anweisung in mysql_v4.pp zu
5656
5757`uses mysql_com_v4`
5858
5959Ich fügte eine Zeile zu /etc/fpc.cfg hinzu, um auf meine Bibliotheken zu zeigen:
6060
6161`-Fl/lib;/usr/lib`
6262
6363Der 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:
6464
6565`ln -s libmysqlclient.so.12.0.0 lmysqlclient`
6666
6767um einen symbolischen Link zu erstellen, um FPC zu erlauben, die Bibliothek zu finden. Für ein gutes Maß erzeugte ich auch den Link
6868
6969`ln -s libmysqlclient.so.12.0.0 mysqlclient`
7070
7171und 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:
7272
7373`ln -s libmysqlclient.so.12.0.0 libmysqlclient.so`
7474
7575Ich modifizierte trydb.pp, um Benutzerdetails einzubeziehen, zunächst indem ich host, Benutzer und Passwort als Konstanten hinzufügte:
7676
7777`const`\
7878`  host : Pchar= 'localhost';`\
7979`  user : Pchar= 'myusername';`\
8080`  passwd: Pchar = 'mypassword';`
8181
8282Ich 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.
8383
8484Daher ist der Code für die Verbindung zur Datenbank jetzt:
8585
8686``` pascal
8787 { einige extra Variablen}
8888 var
8989 alloc : PMYSQL;
9090
9191 {Teil des Hauptprogramms}
9292
9393 begin
9494 if paramcount=1 then
9595 begin
9696 Dummy:=Paramstr(1)+#0;
9797 DataBase:=@Dummy[1];
9898 end;
9999
100100 Writeln ('Allocating Space...');
101101 alloc := mysql_init(PMYSQL(@qmysql));
102102 Write ('Connecting to MySQL...');
103103 sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
104104 if sock=Nil then
105105 begin
106106 Writeln (stderr,'Couldn''t connect to MySQL.');
107107 Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
108108 halt(1);
109109 end;
110110 Writeln ('Done.');
111111 Writeln ('Connection data:');
112112 {$ifdef Unix}
113113 writeln ('Mysql_port : ',mysql_port);
114114 writeln ('Mysql_unix_port : ',mysql_unix_port);
115115 {$endif}
116116 writeln ('Host info : ',mysql_get_host_info(sock));
117117 writeln ('Server info : ',mysql_stat(sock));
118118 writeln ('Client info : ',mysql_get_client_info);
119119
120120 Writeln ('Selecting Database ',DataBase,'...');
121121 if mysql_select_db(sock,DataBase) < 0 then
122122 begin
123123 Writeln (stderr,'Couldn''t select database ',Database);
124124 Writeln (stderr,mysql_error(sock));
125125 halt (1);
126126 end;
127127 {... wie die Originalinhalte von testdb.pp}
128128```
129129
130130Jetzt - sind sie bereit, um die Kompilierung von trydb.pp zu starten?
131131
132132` fpc trydb`
133133
134134Erfolg! Jetzt starten sie es:
135135
136136` ./trydb`
137137
138138whoopee! Ich erhielt die Auflistung der FPC Entwickler!
139139
140140Einige 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.
141141
142142Siehe [[Lazarus Database Tutorial/SampleListing|Einfaches Konsole Listing]] .
143143
144144### Verbindung zu MySQL von einer Lazarus Anwendung aus
145145
146146Dieses 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.
147147
148148**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).
149149
150150Erzeugen sie ein neues Projekt in Lazarus:
151151
152152`Projekt -> Neues Projekt -> Anwendung`
153153
154154Ein neues automatisch erzeugtes Formular wird erscheinen.
155155
156156Vergröß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.
157157
158158Von 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.
159159
160160Wä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.
161161
162162Nun 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.
163163
164164Platzieren sie drei Buttons auf dem Formular: zwei links unter den Edit Feldern, und einen rechts unter dem command Feld.
165165
166166Benennen sie die Buttons auf der linken Seite 'Connect to Database' (ConnectButton) und 'Exit' (ExitButton) und den auf der rechten Seite 'Send Query' (QueryButton).
167167
168168Platzieren 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.
169169
170170Platzieren sie eine Status Bar (von der Common Controls Palette) am unteren Ende des Formulars, und setzen seine SimpleText Eigenschaft auf 'TryMySQL'.
171171
172172Ein Bildschirmfoto des Formulars ist hier zu sehen: [Mysql Beispiel Screenshot](http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png)
173173
174174Nun müssen wir einige Ereignis-Handler schreiben.
175175
176176Die 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.
177177
178178Die 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.
179179
180180Strings werden im Memo Feld angezeigt unter Verwendung von
181181
182182`procedure ShowString (S : string);`\
183183`(* zeigt einen String in einem Memo Feld an *)`\
184184`begin`\
185185`       trymysqlForm1.ResultsMemo.Lines.Add (S)`\
186186`end;`
187187
188188Der ConnectButton Ereignis-handler wird daher:
189189
190190``` pascal
191191 procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
192192 (* Verbinden zu MySQL unter Verwendung der Benutzerdaten von den Texteingabefeldern auf Main Form *)
193193 var strg: string;
194194
195195 begin
196196
197197 dummy1 := trymysqlForm1.HostEdit.text+#0;
198198 host := @dummy1[1];
199199 dummy2 := trymysqlForm1.UserEdit.text+#0;
200200 user := @dummy2[1] ;
201201 dummy3 := trymysqlForm1.PasswdEdit.text+#0;
202202 passwd := @dummy3[1] ;
203203
204204 alloc := mysql_init(PMYSQL(@qmysql));
205205 sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
206206 if sock=Nil then
207207 begin
208208 strg :='Couldn''t connect to MySQL.'; showstring (strg);
209209 Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
210210 end
211211 else
212212 begin
213213 trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';
214214 strg := 'Now choosing database : ' + database; showstring (strg);
215215 {$ifdef Unix}
216216 strg :='Mysql_port : '+ IntToStr(mysql_port); showstring (strg);
217217 strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
218218 {$endif}
219219 Strg :='Host info : ' + StrPas(mysql_get_host_info(sock));
220220 showstring (strg);
221221 Strg :='Server info : ' + StrPas(mysql_stat(sock)); showstring (strg);
222222 Strg :='Client info : ' + Strpas(mysql_get_client_info); showstring (strg);
223223
224224 trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';
225225 if mysql_select_db(sock,DataBase) < 0 then
226226 begin
227227 strg :='Couldn''t select database '+ Database; ShowString (strg);
228228 Strg := mysql_error(sock); ShowString (strg);
229229 end
230230 end;
231231 end;
232232```
233233
234234Das 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.
235235
236236Der 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.
237237
238238Ein 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.
239239
240240Der Code für SendQuery folgt:
241241
242242``` pascal
243243 procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
244244 var
245245 dumquery, strg: string;
246246 begin
247247 dumquery := TrymysqlForm1.CommandEdit.text;
248248 dumquery := dumquery+#0;
249249 query := @dumquery[1];
250250 trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';
251251 strg := 'Executing query : ' + dumQuery; showstring (strg);
252252 if (mysql_query(sock,Query) < 0) then
253253 begin
254254 Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);
255255 end
256256 else
257257 begin
258258 recbuf := mysql_store_result(sock);
259259 if RecBuf=Nil then
260260 begin
261261 Strg :='Query returned nil result.'; showstring (strg);
262262 end
263263 else
264264 begin
265265 strg :='Number of records returned : ' + IntToStr(mysql_num_rows (recbuf));
266266 Showstring (strg);
267267 Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));
268268 showstring (strg);
269269 rowbuf := mysql_fetch_row(recbuf);
270270 while (rowbuf <>nil) do
271271 begin
272272 Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +
273273 rowbuf[2] +')';
274274 showstring (strg);
275275 rowbuf := mysql_fetch_row(recbuf);
276276 end;
277277 end;
278278 end;
279279 end;
280280```
281281
282282Speichern sie ihr Projekt, und drücken Start -\> Start
283283
284284#### Download des MYSQL Quelltextes
285285
286286Eine volle Auflistung des Programms gibt es hier [Beispiel Quellcode](http://lazarus-ccr.sourceforge.net/kbdata/mysqldemo.tar.gz)
287287
288288### Lazarus, MySQL und UTF-8
289289
290290*Das folgende könnte auch für andere Codepages/Zeichensätze erforderlich sein.*
291291
292292UTF-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.
293293
294294Allerdings 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.
295295
296296Um 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:
297297
298298``` sql
299299SET CHARACTER SET `utf8`
300300```
301301
302302und
303303
304304``` sql
305305SET NAMES 'utf8'
306306```
307307
308308Die 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.
309309
310310## Simple MySQL Demo Using the TMySQL50Connection Component
311311
312312Here 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.
313313
314314``` pascal
315315unit unt_db;
316316// Example based on:
317317// http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&t=5761
318318// from tpglemur on that forum
319319{$mode objfpc}{$H+}
320320interface
321321uses
322322 Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
323323 mysql50conn, sqldb, StdCtrls;
324324type
325325 { TForm1 }
326326 TForm1 = class(TForm)
327327 btnTest: TButton;
328328 btnNext: TButton;
329329 btnFirst: TButton;
330330 btnNew: TButton;
331331 edtPersonID: TEdit;
332332 edtSurname: TEdit;
333333 edtDOB: TEdit;
334334 Memo1: TMemo;
335335 procedure btnFirstClick(Sender: TObject);
336336 procedure btnNewClick(Sender: TObject);
337337 procedure btnNextClick(Sender: TObject);
338338 procedure btnTestClick(Sender: TObject);
339339 private
340340 { private declarations }
341341 conn : TMySQL50Connection;
342342 query : TSQLQuery;
343343 transaction : TSQLTransaction;
344344 procedure Display;
345345 public
346346 { public declarations }
347347 end;
348348var
349349 Form1: TForm1;
350350implementation
351351{ TForm1 }
352352procedure TForm1.btnTestClick(Sender: TObject);
353353var
354354 S: String;
355355begin
356356 conn := TMySQL50Connection.Create(nil);
357357 query := TSQLQuery.Create(nil);
358358 transaction := TSQLTransaction.Create(nil);
359359 try
360360 try
361361 conn.HostName := '127.0.0.1';
362362 conn.UserName := 'root';
363363 conn.Password := '';
364364 conn.DatabaseName := 'test1';
365365 conn.Connected := True;
366366 conn.Transaction := transaction;
367367 query.DataBase := conn;
368368 //query.ParseSQL := true; //line not needed - this is the default anyway
369369 //query.ReadOnly := false; //line not needed - this is the default anyway
370370 query.SQL.Text := 'select * from tperson';
371371 query.Open;
372372
373373 query.Last;
374374 S := IntToStr(query.RecordCount) + #13#10;
375375 query.First;
376376
377377 while not query.EOF do
378378 begin
379379 S := S + query.FieldByName('surname').AsString + #13#10;
380380 query.Next;
381381 end;
382382 finally
383383 //query.Free;
384384 //conn.Free;
385385 end;
386386 except
387387 on E: Exception do
388388 ShowMessage(E.message);
389389 end;
390390 Memo1.Text:= S;
391391end;
392392
393393procedure TForm1.Display;
394394begin
395395 edtPersonID.Text := query.FieldByName('personid').AsString;
396396 edtSurname.Text := query.FieldByName('surname').AsString;
397397 edtDOB.Text := query.FieldByName('dob').AsString;
398398end;
399399
400400procedure TForm1.btnFirstClick(Sender: TObject);
401401begin
402402 query.First;
403403 Display;
404404end;
405405
406406procedure TForm1.btnNewClick(Sender: TObject);
407407begin
408408 query.Append;
409409 query.FieldValues['personid'] := edtPersonID.Text;
410410 query.FieldValues['surname'] := edtSurname.Text;
411411 query.FieldValues['dob'] := edtDOB.Text;
412412 query.Post;
413413 query.ApplyUpdates; //to apply update
414414 //transaction.Commit; //line not needed
415415end;
416416
417417procedure TForm1.btnNextClick(Sender: TObject);
418418begin
419419 query.Next;
420420 Display;
421421end;
422422
423423initialization
424424 {$I unt_db.lrs}
425425end.
426426```
427427
428428Here is a version using the TMySQL50Connection, TSQLQuery, TSQLTransaction, TDatasource and TDBGrid components that have been placed on the form:
429429
430430``` pascal
431431unit unt_mysql2;
432432{$mode objfpc}{$H+}
433433interface
434434uses
435435 Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
436436 mysql50conn, sqldb, StdCtrls, db, DBGrids, DbCtrls;
437437type
438438 { TForm1 }
439439 TForm1 = class(TForm)
440440 btnConnect: TButton;
441441 btnSave: TButton;
442442 btnNext: TButton;
443443 btnPrior: TButton;
444444 Datasource1: TDatasource;
445445 DBGrid1: TDBGrid;
446446 Memo1: TMemo;
447447 MySQL50Connection1: TMySQL50Connection;
448448 SQLQuery1: TSQLQuery;
449449 SQLTransaction1: TSQLTransaction;
450450 procedure btnConnectClick(Sender: TObject);
451451 procedure btnNextClick(Sender: TObject);
452452 procedure btnPriorClick(Sender: TObject);
453453 procedure btnSaveClick(Sender: TObject);
454454 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
455455 procedure FormCreate(Sender: TObject);
456456 private
457457 { private declarations }
458458 public
459459 { public declarations }
460460 end;
461461var
462462 Form1: TForm1;
463463implementation
464464{ TForm1 }
465465
466466procedure TForm1.FormCreate(Sender: TObject);
467467begin
468468 //Set properties of components:
469469 //(could be done in the Object Inspector)
470470 MySQL50Connection1.HostName := '127.0.0.1';
471471 MySQL50Connection1.UserName := 'root';
472472 MySQL50Connection1.Password := '';
473473 MySQL50Connection1.DatabaseName := 'test1';
474474 MySQL50Connection1.Transaction := SQLTransaction1;
475475 //SQLQuery1.ParseSQL := true; //line not needed - this is the default
476476 //SQLQuery1.ReadOnly := false; //line not needed - this is the default
477477 SQLQuery1.SQL.Text := 'select * from tperson';
478478 SQLQuery1.Transaction := SQLTransaction1;
479479 SQLQuery1.UpdateMode := upWhereChanged;
480480 Datasource1.Dataset := SQLQuery1;
481481 DBGrid1.DataSource := Datasource1;;
482482end;
483483
484484procedure TForm1.btnConnectClick(Sender: TObject);
485485var
486486 S : string;
487487begin
488488 try
489489 MySQL50Connection1.Connected := true;
490490 SQLQuery1.Open;
491491
492492 //Tests to see if all is OK:
493493 SQLQuery1.Last;
494494 S := IntToStr(SQLQuery1.RecordCount) + #13#10;
495495 SQLQuery1.First;
496496 while not SQLQuery1.EOF do
497497 begin
498498 S := S + SQLQuery1.FieldByName('surname').AsString + #13#10;
499499 SQLQuery1.Next;
500500 end;
501501 except
502502 on E: Exception do
503503 ShowMessage(E.message);
504504 end;
505505 Memo1.Text:= S;
506506end;
507507
508508procedure TForm1.btnNextClick(Sender: TObject);
509509begin
510510 SQLQuery1.Next;
511511end;
512512
513513procedure TForm1.btnPriorClick(Sender: TObject);
514514begin
515515 SQLQuery1.Prior;
516516end;
517517
518518procedure TForm1.btnSaveClick(Sender: TObject);
519519begin
520520 SQLQuery1.ApplyUpdates;
521521end;
522522
523523procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
524524begin
525525 //Required or get EDatabase error on close:
526526 MySQL50Connection1.Connected := false;
527527end;
528528
529529initialization
530530 {$I unt_mysql2.lrs}
531531end.
532532```
533533
534534## Lazarus und PostgreSQL
535535
536536Dies 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.
537537
538538Nach erfolgreicher Installation, befolgen Sie diese Schritte:
539539
540540- Nehmen Sie eine PQConnection aus dem Fach SQLdb
541541- Nehmen Sie eine SQLQuery aus dem Fach SQLdb
542542- Nehmen Sie eine SQLTransaction aus dem Fach SQLdb
543543- Nehmen Sie eine DataSource aus dem Fach DataAccess
544544- Nehmen Sie ein DBGrid aus dem Fach DataControls
545545
546546- In der PQConnection setzen Sie ein:
547547 - die Eigenschaft 'transaction' mit dem jeweiligen SQLTransaction-Object
548548 - den Datenbanknamen
549549 - HostName
550550 - UserName + password
551551
552552- Überprüfen Sie, ob die SQLTransaction automatisch geändert wurde und jetzt auf die PQConnection zeigt
553553
554554- In der SQLQuery setzen Sie ein:
555555 - die Eigenschaft 'transaction' mit dem jeweiligen Object
556556 - die Eigenschaft 'database' mit dem jeweiligen Object
557557 - SQL (irgendetwas wie 'select * from anytable')
558558
559559- Im Objekt 'DataSource' setzen Sie die Eigenschaft 'DataSet' mit dem jeweiligen SQLQuery-Object
560560
561561- Im DBGrid setzen Sie die Datenquelle als DataSource-Object
562562
563563Stellen 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.
564564
565565Um die Inhalte der Datenbank zu ändern, rief ich die DB-Engine direkt mit dem folgenden Code auf:
566566
567567``` pascal
568568try
569569 sql:= 'UPDATE table SET setting=1';
570570 PQDataBase.Connected:=True;
571571 PQDataBase.ExecuteDirect('Begin Work;');
572572 PQDataBase.ExecuteDirect(sql);
573573 PQDataBase.ExecuteDirect('Commit Work;');
574574 PQDataBase.Connected:=False;
575575except
576576 on E : EDatabaseError do
577577 MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
578578 on E : Exception do
579579 MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
580580end;
581581```
582582
583583- Anmerkungen:
584584 - Getestet unter Windows, Lazarus 0.9.12 + PgSQL 8.3.1
585585 - Einige Tests unter Linux, Lazarus 0.9.12 and PgSQL 8.0.x
586586
587587- Installation und Fehler:
588588 - In der getesteten Version of Lazarus .12, haben die Felder vom Typ "text" und "numeric" Fehler
589589 - Ich verwendete problemlos: char fixed size, int und float8
590590 - Manchmal beseitigt ein Neustart von Lazarus dumme Fehler...
591591 - Nach einigen Fehlern bleiben die Transaktionen aktiv und sollten manuell deaktiviert werden
592592 - Von Lazarus gemachte Änderungen werden natürlich erst dann sichtbar, wenn die Transaktionen abgewickelt sind
593593 - Der integrierte Debugger scheint fehlerbehaftet (zumindest unter Windows) - manchmal hilft es, ihn außerhalb der IDE zu starten, um Fehler zu finden
594594 - 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
595595 - Error: "Can not load Postgresql client. Is it installed (libpq.so) ?"
596596 - Erweitern Sie den Pfad um die Suche nach libpq* aus der PostgreSQL-Installation.
597597 - 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
598598 - Es ist vielleicht nötig einen symbolischen Link zu erzeugen: ln -s /usr/lib/pqsql.so.5 /usr/lib/pqsql.so
599599 - Unter Windows fügen Sie diese Bibliotheken irgendwo in der Umgebungsvariablen PATH oder project dir ein
600600 - Unter Windows kopierte ich alle DLLs aus meinem Verzeichnis 'C:\Program Files\PostgreSQL\8.1\bin' in ein anderes Verzeichnis im Pfad
601601 - Oder fügen Sie dieses Verzeichnis 'postgres\bin' Ihrem Pfad hinzu
602602
603603Ein 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).
604604
605605## Lazarus und SQLite
606606
607607von Luiz Américo
608608
609609Besuchen sie die [sqlite4fpc Homepage](http://sqlite4fpc.yolasite.com/). Dort finden sie die API-Referenz und weitere Tutorials.
610610
611611### Einführung
612612
613613TSqliteDataset 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:
614614
615615Vorteile:
616616
617617- 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.
618618- Automatisches Datenbank Update: Kein Bedarf, die Datenbank manuell mit SQL Anweisungen zu updaten, eine einzelne Methode erledigt dies.
619619- Schnelligkeit: Es puffert die Daten im Arbeitsspeicher, was das Browsen im Datenbestand schnell macht.
620620- Keine Server Installation/Konfiguration: einfach zusammen verfrachten mit der sqlite dynamic Bibliothek.
621621
622622Nachteile
623623
624624- Benötigt externe Datei (sqlite Bibliothek)
625625
626626### Voraussetzungen
627627
628628- Für sqlite2 Datenbanken:
629629 - fpc 2.0.0
630630 - Lazarus 0.9.10
631631 - sqlite Laufzeitbibliothek 2.8.15 oder höher (von [www.sqlite.org](http://www.sqlite.org))
632632
633633- Für sqlite3 Datenbanken:
634634 - fpc 2.0.2
635635 - Lazarus 0.9.11 (SVN Revision 8443 oder höher)
636636 - sqlite Laufzeitbibliothek 3.2.1 oder höher (von [www.sqlite.org](http://www.sqlite.org))
637637
638638**Bevor sie ein Lazarus Projekt beginnen, stellen sie sicher, dass:**
639639
640640- die sqlite Bibliothek im Systempfad (PATH) ist oder im Verzeichnis des executable
641641- unter Linux, bringen sie cmem als erste Unit in den uses-Abschnitt des Hauptprogramms
642642
643643### Anwendung (grundlegende Verwendung)
644644
645645Installieren sie das Package aus dem /components/sqlite Verzeichnis (siehe Instruktionen [[Install Packages/de|hier]])
646646
647647Zur Entwicklungszeit setzen sie die folgenen Eigenschaften:
648648
649649- FileName: Pfad der sqlite Datei \[benötigt\]
650650- TableName: Name der Tabelle, die in der SQL Anweisung benutzt wird \[benötigt\]
651651- Sql: eine SQL *select* Anweisung \[optional\]
652652
653653**Erzeugen einer Tabelle (Dataset)**
654654
655655Klicken 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.
656656
657657` Hier sind alle Feldtypen, die von TSqliteDataset und TSqlite3Dataset unterstützt werden: `\
658658` `\
659659` Integer`\
660660` AutoInc`\
661661` String`\
662662` Memo`\
663663` Bool `\
664664` Float`\
665665` Word`\
666666` DateTime`\
667667` Date`\
668668` Time`\
669669` LargeInt`\
670670` Currency`\
671671` `
672672
673673**Abrufen der Daten**
674674
675675Nach 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:
676676
677677` SQL:='Select * from TABLENAME'; `
678678
679679setzen.
680680
681681**Anwendung von Änderungen zur grundlegenden Datendatei**
682682
683683Um 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).
684684
685685Es ist möglich, dies auf zwei Wegen zu erreichen:
686686
687687- Setzen sie die Eigenschaft PrimaryKey auf den Namen eines Primary Key Feldes.
688688- Fügen sie ein Feld AutoInc hinzu (dies ist einfacher seit TSqliteDataSet es automatisch als Primary Key behandelt)
689689
690690Wenn eine oder zwei Bedingungen gesetzt sind, rufen sie
691691
692692` ApplyUpdates;`
693693
694694auf.
695695
696696PS1: Wenn beide Bedingungen gesetzt sind, wird das Feld entsprechend dem PrimaryKey genutzt, um die Updates anzuwenden.
697697
698698PS2: 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.
699699
700700### Bemerkungen
701701
702702- 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).
703703- Die selbe Datendatei (Filename Eigenschaft) kann verschiedene Tabllen/Datasets hosten.
704704- Verschiedene Datasets (unterschiedliche Kombinationen von Feldern) können unter simultaner Nutzung der selben Tabelle erzeugt werden .
705705- 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.
706706- 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.
707707- 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.
708708
709709Allgemeine Beispiele sind zu finden im fpc/fcl/db/sqlite CVS-Verzeichnis
710710
711711Luiz Américo pascalive(at)bol(dot)com(dot)br
712712
713713## Lazarus und MSSQL
714714
715715Bitte schreiben sie mir!
716716
717717## Lazarus und Interbase / Firebird
718718
719719Schauen 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]].
720720
721721Funktioniert auch mit der neuesten Zeoslib (aus dem cvs).
722722
723723### FBLib Firebird-Bibliothek
724724
725725[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.
726726
727727Folgende Merkmale sind aktuell enthalten:
728728
729729- Direkter Zugriff auf Firebird 1.0.x 1.5.x, 2.x Classic oder SuperServer
730730- Multi-Plattform \[Win32, Gnu/Linux, FreeBSD)
731731- Automatische Auswahl der Klientenbibliothek 'fbclient' oder 'gds32'
732732- Abfragen mit Parametern
733733- Unterstützt den SQL-Dialekt 1/3
734734- LGPL Lizenz-Vereinbarung
735735- Extrahiert Metadaten
736736- Einfacher Skript-Parser
737737- Fügt nur 100-150 KB zur ausführbaren EXE-Datei hinzu
738738- Unterstützt BLOB-Felder
739739- Exportiert Daten zu einem HTML SQL Script
740740- Service-Manager (Backup, Restore, gfix...)
741741- Ereignis-Benachrichtigung
742742
743743Sie können die Dokumentation von der [FBLib Website](http://fblib.altervista.org/) herunterladen.
744744
745745[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))
746746
747747## Lazarus und dBase
748748
749749Tony Maro
750750
751751Sie können auch mit dem Besuch der [[Lazarus Tdbf Tutorial/de|TDbf Tutorial Seite]] anfangen.
752752
753753FPC 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.
754754
755755Die 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.
756756
757757Sie 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.
758758
759759Wirkliche 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.
760760
761761Der 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.
762762
763763Ein 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".
764764
765765Fügen sie das Folgende in ihren Code ein:
766766
767767`   Dbf1.FilePathFull = '/Pfad/zu/meiner/Datenbank';`\
768768`   Dbf1.TableName = 'dvds';`\
769769`   With Dbf1.FieldDefs do begin`\
770770`       Add('Name', ftString, 80, True);`\
771771`       Add('Description', ftMemo, 0, False);`\
772772`       Add('Rating', ftString, 5, False);`\
773773`   end;`\
774774`   Dbf1.CreateTable;`
775775
776776Wenn 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.
777777
778778Das 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:
779779
780780`   Dbf1.Exclusive := True;`\
781781`   Dbf1.Open;`\
782782`   Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);`\
783783`   Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);`\
784784`   Dbf1.Close;`
785785
786786Der 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.
787787
788788Ich 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!
789789
790790## Verwendung von TSdfDataset und TFixedDataset
791791
792792TSdfDataset 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.
793793
794794To start with this formats, a initial database file should be created. The format is very simple, so use a text editor to do this.
795795
796796Below 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:
797797
798798 ID,NAMEEN,NAMEPT,HEIGHT,WIDTH,PINS,DRAWINGCODE
799799 1,resistor,resistor,1,1,1,LINE
800800 2,capacitor,capacitor,1,1,1,LINE
801801 3,transistor npn,transistor npn
802802
803803And 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.
804804
805805 Name = 15 chars; Surname = 15 chars; Tell = 10 chars; e_mail = 20 chars;
806806 Piet Pompies piet@pompies.net
807807
808808### Direkte Verwendung der Datasets
809809
810810Sometimes 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:
811811
812812- The lines in the database can have a maximum size of about 300. A fix is being researched.
813813- It is necessary to add the field definitions. Some datasets are able to fill this information alone from the database file
814814- One should set FirstLineAsSchema to true, to indicate that the first line includes the field names and positions
815815- 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.
816816
817817``` pascal
818818constructor TComponentsDatabase.Create;
819819begin
820820 inherited Create;
821821
822822 FDataset := TSdfDataset.Create(nil);
823823 FDataset.FileName := vConfigurations.ComponentsDBFile;
824824
825825 // Not necessary with TSdfDataset
826826// FDataset.TableName := STR_DB_COMPONENTS_TABLE;
827827// FDataset.PrimaryKey := STR_DB_COMPONENTS_ID;
828828
829829 // Adds field definitions
830830 FDataset.FieldDefs.Add('ID', ftString);
831831 FDataset.FieldDefs.Add('NAMEEN', ftString);
832832 FDataset.FieldDefs.Add('NAMEPT', ftString);
833833 FDataset.FieldDefs.Add('HEIGHT', ftString);
834834 FDataset.FieldDefs.Add('WIDTH', ftString);
835835 FDataset.FieldDefs.Add('PINS', ftString);
836836 FDataset.FieldDefs.Add('DRAWINGCODE', ftString);
837837
838838 // Necessary for TSdfDataset
839839 FDataset.Delimiter := ',';
840840 FDataset.FirstLineAsSchema := True;
841841
842842 FDataset.Active := True;
843843
844844 // Sets the initial record
845845 CurrentRecNo := 1;
846846 FDataset.First;
847847end;
848848```
849849
850850When 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
851851
852852``` pascal
853853{@@
854854 Moves to the desired record using TDataset.Next and TDataset.Prior
855855 Avoids using TDataset.RecNo which doesn't work in all datasets
856856
857857 @param AID Indicates the record number. The first record has number 1
858858}
859859procedure TComponentsDatabase.GoToRec(AID: Integer);
860860begin
861861 // We are before the desired record, move forward
862862 if CurrentRecNo < AID then
863863 begin
864864 while (not FDataset.EOF) and (CurrentRecNo < AID) do
865865 begin
866866 FDataset.Next;
867867 FDataset.CursorPosChanged;
868868 Inc(CurrentRecNo);
869869 end;
870870 end
871871 // We are after the desired record, move back
872872 else if CurrentRecNo > AID then
873873 begin
874874 while (CurrentRecNo >= 1) and (CurrentRecNo > AID) do
875875 begin
876876 FDataset.Prior;
877877 FDataset.CursorPosChanged;
878878 Dec(CurrentRecNo);
879879 end;
880880 end;
881881end;
882882```
883883
884884### Verwendung mit datensensitiven Komponenten
885885
886886## Siehe auch
887887
888888- [[Databases/de|Datenbanken (deutsch)]] - Startseite für Datenbankanwendungen mit Lazarus
889889- [[Databases in Lazarus/de|Datenbanken in Lazarus (deutsch)]] - Ein Überblick über die Verwendung von Datenbanken in Lazarus
890890- [[How to write in-memory database applications in Lazarus/FPC]] - In-Memory Datenbank-Anwendungen
891891- [[MySQLDatabases/de|MySQLDatenbanken (deutsch)]] - Erstellung einer Datenbankanwendung unter Verwendung von MySQL
892892- [[Zeos tutorial/de|Zeos Tutorial (deutsch)]] - Verwendung der Zeos Komponenten
893893- [[Lazarus Tdbf Tutorial]] - Tutorial über einfache Datenbankentwicklung mittels der [TDbf](http://tdbf.sf.net)-Komponente (von Micha Nelissen)
894894- [[Lazarus DB Faq/de|Lazarus DB Faq (deutsch]] - FAQ über Datenbanken in Lazarus
895895- [[Firebird]] - Erstellen einer Datenbankanwendung für Firebird
896896- [[ODBCConn]] - Verbindung mit ODBC-Datenbanken
897897- [[MS Access]] - Wie man auf eine Microsoft Access Datenbank zugreift
898898
899899## Externe Links
900900
901901- [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.
902902- [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)
903903
904904---
905905*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