Database tutorial Zeos1/de: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Database tutorial Zeos1/de
| Old | New | Line | |
|---|---|---|---|
| 1 | + | │ **Deutsch (de)** │ | |
| 2 | + | **** | |
| 3 | + | ||
| 4 | + | Zurück zu unserem Beispiel. Wir wollen alle Daten aus der Tabelle 'CUSTOMER' anzeigen. Der SQL Befehl dazu lautet: | |
| 5 | + | ``` | |
| 6 | + | select * from CUSTOMER | |
| 7 | + | ``` | |
| 8 | + | ||
| 9 | + | Diesen Befehl müssen wir der 'SQL' Eigenschaft von ZQuery1 zuweisen. Im Quelltext unseres Programms würde das so aussehen: | |
| 10 | + | ``` | |
| 11 | + | ZQuery1.SQL.Text := 'select * from CUSTOMER'; | |
| 12 | + | ``` | |
| 13 | + | ||
| 14 | + | Wird der Befehl in Textform angegeben, dann muss er in einfache Anführungszeichen eingeschlossen werden. Man könnte natürlich auch den Inhalt einer anderen Komponente zuweisen. | |
| 15 | + | ||
| 16 | + | Die Abfrage der Daten soll erfolgen, wenn der Benutzer auf den Button klickt. Mit einem Doppelklick auf Button1 erzeugt Lazarus das Grundgerüst der dafür notwendigen Prozedur. In ihrem Quelltext sollte jetzt folgendes stehen: | |
| 17 | + | ``` | |
| 18 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 19 | + | begin | |
| 20 | + | ||
| 21 | + | end; | |
| 22 | + | ``` | |
| 23 | + | ||
| 24 | + | Zwischen _begin_ und _end_ müssen wir jetzt die Anweisungen eingeben, die zum Anzeigen der Daten erforderlich sind. Die 'SQL' Eigenschaft von ZQuery1 kann nur geändert werden, wenn ZQuery1 nicht aktiv ist. Daher schließen wir die Komponente zunächst: | |
| 25 | + | ``` | |
| 26 | + | ZQuery1.Close; | |
| 27 | + | ``` | |
| 28 | + | ||
| 29 | + | Da wir nicht sicher sein können, ob ZQuery1 noch irgendwelche Daten enthält, rufen wir die 'Clear' Prozedur auf: | |
| 30 | + | ``` | |
| 31 | + | ZQuery1.SQl.Clear; | |
| 32 | + | ``` | |
| 33 | + | ||
| 34 | + | Dann weisen wir der 'SQL' Eigenschaft unsere SQL Anweisung zu: | |
| 35 | + | ``` | |
| 36 | + | ZQuery1.SQL.Text := 'select * from CUSTOMER'; | |
| 37 | + | ``` | |
| 38 | + | ||
| 39 | + | Jetzt müssen wir die Verbindung zur Datenbank herstellen und dann die Abfrage öffnen: | |
| 40 | + | ``` | |
| 41 | + | ZConnection1.Connected := True; | |
| 42 | + | ZQuery1.Open; | |
| 43 | + | ``` | |
| 44 | + | ||
| 45 | + | Wenn sie jetzt ihr Programm kompilieren würden, dann würden die Daten aus der Tabelle 'CUSTOMER' bereits angezeigt werden. Ein ordentliches Programm wird aber spätestens beim Beenden dafür sorgen, dass noch offene Verbindungen zur Datenbank geschlossen werden. Die Nebenwirkungen wären sonst nicht absehbar. Wir verwenden das OnClose Ereignis unseres Formulars (mittels Doppelklick im Objektinspektor erzeugen): | |
| 46 | + | ``` | |
| 47 | + | procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); | |
| 48 | + | begin | |
| 49 | + | ||
| 50 | + | end; | |
| 51 | + | ``` | |
| 52 | + | ||
| 53 | + | Beim Trennen verwenden wir die umgekehrte Reihenfolge wie beim Verbinden: | |
| 54 | + | ``` | |
| 55 | + | ZQuery1.Close; | |
| 56 | + | ZConnection1.Connected := False; | |
| 57 | + | ``` | |
| 58 | + | ||
| 59 | + | ### Zusammenfassung | |
| 60 | + | ||
| 61 | + | Wir haben bisher gelernt, wie man mit den Zeos-Komponenten eine Verbindung zu einer Firebird Datenbank herstellt und die Daten einer Tabelle am Bildschirm anzeigt. | |
| 62 | + | ||
| 63 | + | ## Erweiterung von Beispiel 1 | |
| 64 | + | ||
| 65 | + | Wenn sie sich an die bisherigen Schritte gehalten haben, dann sollte ihr Quelltext etwa so aussehen: | |
| 66 | + | ``` | |
| 67 | + | unit Unit1; | |
| 68 | + | ||
| 69 | + | {$mode objfpc}{$H+} | |
| 70 | + | ||
| 71 | + | interface | |
| 72 | + | ||
| 73 | + | uses | |
| 74 | + | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, DBGrids, | |
| 75 | + | StdCtrls, db, ZConnection, ZDataset; | |
| 76 | + | ||
| 77 | + | type | |
| 78 | + | ||
| 79 | + | { TForm1 } | |
| 80 | + | ||
| 81 | + | TForm1 = class(TForm) | |
| 82 | + | Button1: TButton; | |
| 83 | + | Datasource1: TDatasource; | |
| 84 | + | DBGrid1: TDBGrid; | |
| 85 | + | ZConnection1: TZConnection; | |
| 86 | + | ZQuery1: TZQuery; | |
| 87 | + | procedure Button1Click(Sender: TObject); | |
| 88 | + | procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); | |
| 89 | + | private | |
| 90 | + | { private declarations } | |
| 91 | + | public | |
| 92 | + | { public declarations } | |
| 93 | + | end; | |
| 94 | + | ||
| 95 | + | var | |
| 96 | + | Form1: TForm1; | |
| 97 | + | ||
| 98 | + | implementation | |
| 99 | + | ||
| 100 | + | {$R *.lfm} | |
| 101 | + | ||
| 102 | + | { TForm1 } | |
| 103 | + | ||
| 104 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 105 | + | begin | |
| 106 | + | ZQuery1.Close; | |
| 107 | + | ZQuery1.SQL.Clear; | |
| 108 | + | ZQuery1.SQL.Text:='select * from CUSTOMER'; | |
| 109 | + | ZConnection1.Connected:= true; | |
| 110 | + | ZQuery1.Open; | |
| 111 | + | end; | |
| 112 | + | ||
| 113 | + | procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); | |
| 114 | + | begin | |
| 115 | + | ZQuery1.Close; | |
| 116 | + | ZConnection1.Connected:= false; | |
| 117 | + | end; | |
| 118 | + | ||
| 119 | + | end. | |
| 120 | + | ``` | |
| 121 | + | ||
| 122 | + | Nun wird man aber in den seltensten Fällen den kompletten Inhalt einer Tabelle benötigen. Nehmen wir an, es sollen nur die Kunden aus den USA angezeigt werden. Dafür müsste die SQL Anweisung wie folgt lauten: | |
| 123 | + | ``` | |
| 124 | + | select * from CUSTOMER where COUNTRY = 'USA' | |
| 125 | + | ``` | |
| 126 | + | ||
| 127 | + | Diese Anweisung werden wir aus zwei Gründen nicht für unser Beispielprogramm verwenden: Zum einen gibt es ein Problem bei der Verwendung des einfachen Anführungszeichens. Der Compiler würde das Anführungszeichen vor USA als schließendes Zeichen betrachten (das erste Zeichen steht ja vor select from...) und damit die SQL Anweisung ungültig machen. Der zweite und gewichtigere Grund ist die Tatsache, dass bei der Entwicklung des Programms noch gar nicht bekannt ist, welche Einschränkung der Anzeige später vorgenommen werden soll. Der Benutzer soll in seiner Flexibilität nicht eingeschränkt werden. Dazu ersetzen wir zunächst 'USA' durch einen Platzhalter: | |
| 128 | + | ``` | |
| 129 | + | select * from CUSTOMER where COUNTRY = :COUNTRY | |
| 130 | + | ``` | |
| 131 | + | ||
| 132 | + | Die Platzhalter sind durch den führenden Doppelpunkt gekennzeichnet. Um dem Benutzer die Eingabe des Filterwertes zu ermöglichen, platzieren sie eine _TEdit_ Komponente (Seite 'Standard' in der Komponentenpalette) auf ihrem Formular. Löschen sie den Wert der 'Text' Eigenschaft. Über die 'Params' Eigenschaft von TZQuery können wir nun mit dem in TEdit eingegebenem Text unseren Platzhalter ersetzen: | |
| 133 | + | ``` | |
| 134 | + | ZQuery1.Params.ParamByName('COUNTRY').AsString := Edit1.Text; | |
| 135 | + | ``` | |
| 136 | + | ||
| 137 | + | Der Parameter kann sowohl über seine Position als auch seinen Namen spezifiziert werden. Letzteres dürfte vor allem die Lesbarkeit des Quelltextes verbessern. Insgesamt sollte die Prozedur jetzt so aussehen: | |
| 138 | + | ``` | |
| 139 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 140 | + | begin | |
| 141 | + | ZQuery1.Close; | |
| 142 | + | ZQuery1.SQL.Clear; | |
| 143 | + | ZQuery1.SQL.Text:= 'select * from CUSTOMER where COUNTRY = :COUNTRY'; | |
| 144 | + | ZQuery1.Params.ParamByName('COUNTRY').AsString := Edit1.Text; | |
| 145 | + | ZConnection1.Connected:= True; | |
| 146 | + | ZQuery1.Open; | |
| 147 | + | end; | |
| 148 | + | ``` | |
| 149 | + | ||
| 150 | + | Sie können jetzt ruhig mit den Einstellungen ein wenig herumspielen. Wenn sie einen Filterwert eingeben, der in der Datenbank nicht vorhanden ist, dann wird eine leere Tabelle angezeigt. Es können jedoch auch ernsthafte Probleme auftreten. Da bei einer Client-Server-Anwendung üblicherweise Client und Server räumlich getrennt sind, ist meist nicht auf den ersten Blick ersichtlich, warum es zu einem Problem gekommen ist. Ist der Server heruntergefahren worden oder hat nur jemand einen Stecker gezogen? Zugriffe auf eine Datenbank sollten daher **immer** in eine try ... except und/oder try ... finally Schleife eingebunden werden. Nur so ist sichergestellt, dass Datenbankfehler abgefangen werden können und der Anwender nicht im Regen stehen gelassen wird. Für unsere Beispielanwendung könnte eine rudimentäre Behandlungsroutine wie folgt aussehen: | |
| 151 | + | ``` | |
| 152 | + | begin | |
| 153 | + | try | |
| 154 | + | ZQuery1.Close; | |
| 155 | + | ... | |
| 156 | + | ZQuery1.Open; | |
| 157 | + | except | |
| 158 | + | on EDatabaseError do | |
| 159 | + | begin | |
| 160 | + | MessageDlg('Fehler','Es ist ein Datenbankfehler aufgetreten.',mtError,[mbOK],0); | |
| 161 | + | Edit1.Text:=''; | |
| 162 | + | end; | |
| 163 | + | end; | |
| 164 | + | end; | |
| 165 | + | ``` | |
| 166 | + | ||
| 167 | + | Hier wird jedoch nur eine einfache Meldung ausgegeben. | |
| 168 | + | ||
| 169 | + | ## Siehe auch | |
| 170 | + | ||
| 171 | + | * [[ZeosDBO]]: Informationen zur Installation von Zeos | |
| 172 | + | * [[Zeos tutorial/de]]: Informationen über Zeos | |
| 173 | + | ||
| 174 | + | --- | |
| 175 | + | *From the Free Pascal wiki, page "Database tutorial Zeos1/de", as the Internet Archive kept it on 2025-03-27. 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).* |
