Sign in Join
Wiki copytemporary

MySQLDatabases/de: what changed

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

OldNewLine
11**Work in progress**
22
33## Einleitung
44
55Im [[Lazarus Database Tutorial|Datenbank Tutorial]] sahen wir einen ersten Versuch, eine Verbindung zu einem MySQL Server herzustellen. Wir verwendeten zu diesem Zeitpunkt keine Komponenten, weder visuelle oder nichtvisuelle. Hier soll erklärt werden, wie man sich auf eine (vielleicht) einfachere Weise mit einem MySQL Server verbindet.
66
77## Verfügbare Komponenten
88
99### SQLdb Komponenten
1010
1111Eine andere Möglichkeit ist die Installation der Packages im Verzeichnis \$Lazarus/components/sqldb. In diesem Verzeichnis können sie eine Packagedatei mit Namen sqldblaz.lpk sehen. Sie müssen dieses Package und das mysql4connlaz.lpk Package aus dem Verzeichnis \$Lazarus/components/sqldb/mysql installieren. Das erste Package enthält einige allgemeine Komponenten, die für alle Datenbanken verwendet werden. Diese Komponenten sind TSQLTransaction und TSQLQuery und sind auf dem neuen SQLdb Tab zu finden. Nach der Installation von mysql4connlaz.lpk werden sie eine dritte Komponente auf dem SQLdb Tab mit Namen TMySQLConnection finden(dargestellt durch einen Delphin).
1212
1313Wenn sie das Verzeichnis \$Lazarus/components/sqldb/mysql und mysql4connlaz.lpk nicht finden, dann bedeutet dies, dass sie eine neuere Version benutzen, in welcher mysql4connlaz.lpk mit sqldblaz.lpk fusioniert wurde. Das ist in Ordnung. Die Installation von sqldblaz.lpk wird ihnen alle erwähnten Komponenten im selben Lazarus IDE toolbar TAB bieten.
1414
1515Wenn sie nicht wissen, wie man Komponenten / Packages installiert, dann schauen sie auf dieser [[Install Packages/de|Seite]] nach. Da die SQLdb Komponenten allgemeiner sind und auch für andere Datenbanken verwendet werden können, indem man zum Beispiel TMySQLConnection durch TIBConnection ersetzt, werden wir mit den SQLdb Komponenten ein Programm entwickeln.
1616
1717Übrigens - (und das ist ziemlich wichtig!) die SQLdb Komponenten können nur die MySQL Client Bibliotheken Version 4.0 verwenden, andere Versionen wie 3.x, 4.x, etc. werden nicht funktionieren! Aber Anwendungen sollten in der Lage sein, eine Verbindung zu einem MySQL Server jeglicher Version herzustellen.
1818
1919## Erläuterung der verwendeten Komponenten
2020
2121### TMySQLConnection
2222
2323TMySQLConnection wird verwendet, um Parameter für die Verbindung zum Datenbank Server aufzubewahren. Sie erlaubt ihnen den Server, den Nutzer und das Kennwort zu setzen. Eine andere Eigenschaft von TMySQLConnection bennent die Datenbank, die sie verwenden wollen. Da das "LoginPrompt" noch funktionslos ist, sollten sie vor Verbindungsaufbau sicherstellen, dass HostName, DatabaseName sowie UserName und Password mit Werten belegt sind. Desweiteren benötigen sie noch eine Komponente vom Typ TSQLTransaction, die in der Transaction-Eigenschaft von TMySQLConnectio eintragen werden muss, da sie sonst keine Anfragen stellen können.
2424
2525**Hinweis:** In der neuesten SVN Version von Lazarus finden sie 3 MySQLConnection Komponenten. Dies sind TMySQL40Connection, TMySQL41Connection und TMySQL50Connection. Wählen Sie diese gemäss der Serverversion aus, mit welcher Sie sich verbinden wollen. Wenn z.B. bei ihnen MySQL 4.1 läuft, dann verwenden sie TMySQL41Connection.
2626
2727### TSQLTransaction
2828
2929Eine SQLTransaction wird für die interne Organisation benötigt. Eine SQLTransaction wird automatisch aktiviert, wenn sie ein Dataset öffnen, welches diese benutzt. Wenn sie aber die SQLConnection schließen wollen, müssen sie zuerst sicherstellen, dass die SQLTransaction nicht aktiv ist. Da seit Version 1.2.2 kein AutoCommit mehr stattfindet, muß nach Zugriffen auf die Datenbank ein Transaction.Commit durchgeführt werden, um die Änderungen zu speichern bzw. abgefragte Daten zu aktualisieren. z.B.
3030
3131``` pascal
3232 ...
3333 SQLQuery1.ExecSQL;
3434 SQLTransaction1.Commit;
3535 ...
3636```
3737
3838oder
3939
4040``` pascal
4141 SQLQuery1.SQL.Text:='SELECT text FROM testtab';
4242 SQLTransaction.StartTransaction;//Falls die Funktionalität der Transaction nicht benötigt wird, kann das in SQLQuery1BeforeOpen ausgeführt werden.
4343 SQLQuery1.Open;
4444 while not SQLQuery1.EOF do
4545 begin
4646 ListBox1.Items.Add(SQLQuery1.Fields[0].AsString);
4747 SQLQuery1.Next;
4848 end;
4949 SQLQuery1.Close;
5050 SQLTransaction.Commit;//Falls die Funktionalität der Transaction nicht benötigt wird, kann das in SQLQuery1AfterClose ausgeführt werden.
5151```
5252
5353### TSQLQuery
5454
5555TSQLQuery wird verwendet, um SQL Anweisungen auf dem Server auszuführen. Sie können Daten abrufen, indem sie die SQL Eigenschaft auf einige SELECT Anweisungen setzen und die Open Methode aufrufen. Oder sie können Daten manipulieren, indem sie einige INSERT, DELETE oder UPDATE Anweisungen erstellen. Im letzteren Fall sollten sie nicht die Open Methode benutzen, sondern die ExecSQL Methode.
5656
5757### TDataSource
5858
5959Ein TDataSource bietet die Verbindung zwischen den sichtbaren datensensitiven Komponenten wie DBEdit, DBGrid und einem TDataset. Es macht die Daten für die datensensitiven Komponenten zum Anzeigen verfügbar. Ein TDatasource kann zur selben Zeit nur mit einem einzigen Dataset verbunden werden, aber es können mehrere datensensitive Komponenten verbunden werden.
6060
6161### TDBGrid
6262
6363Ein DBGrid kann benutzt werden, um die Daten zu präsentieren, die man von einem Dataset erhalten hat. Das DBGrid benötigt eine Datasource für die Verbindung zu einem Dataset. Wenn das Dataset geöffnet wird, dann wird das DBGrid automatisch mit den Daten bestückt.
6464
6565## Unser Programm
6666
6767### Die Grundlagen
6868
6969Wir werden versuchen, ein Programm zu erstellen, das auf diesem [[Lazarus Database Tutorial/nl|hier (auf holländisch)]] basiert, welches auf dem [[Lazarus Database Tutorial|Original (auf englisch)]] von Chris basiert.
7070
7171### Das Hauptformular
7272
7373Wir werden den selben Hauptbildschirm verwenden und die gesamte Funktionalität von Anfang an erstellen :) Wie sie sehen werden, muss man sich nicht um vieles kümmern, weil die Komponenten die schwierigen Details erledingen! Fangen wir mit einer Seite an, die so aussieht.\
7474![](/wiki-images/2/28/Trymysql.png)\
7575Vom SQLdb-Tab platzieren sie eine TMySQLConnection, eine TSQLTransaction und eine TSQLQuery ![](/wiki-images/6/6d/Components.png) auf diesem Formular. Ändern sie die vorgegebenen Namen dieser Komponenten nicht, ausgenommen die Connection Komponente. Um diesen Artikel für alle Versionen von MySQL verwenden zu können, benennen sie ihre MySQL??Connection Komponente in MySQLConnection1 um. Wir müssen diese Komponenten miteinander verbinden, damit sie ihren Job erledigen können. Daher müssen die folgenden Eigenschaften gesetzt werden:
7676
7777| | | |
7878|------------------|-----------------|------------------|
7979| **Komponente** | **Eigenschaft** | **Wert** |
8080| MySQLConnection1 | Transaction | SQLTransaction1 |
8181| SQLTransaction1 | Database | MySQLConnection1 |
8282| SQLQuery1 | Database | MySQLConnection1 |
8383| SQLQuery1 | Transaction | SQLTransaction1 |
8484
8585Die Transaction-Eigenschaft von SQLQuery1 wird automatisch gesetzt, wenn sie zuerst die Transaction-Eigenschaft von MySQLConnection1 setzen. Wenn sie diese setzen, dann werden sie feststellen, dass SQLTransaction1.Database auf MySQLConnection1 gesetzt wurde.
8686
8787### Der Code
8888
8989Wie sie in der Bildschirmanzeige sehen können, sind beim Start des Programms nur die Schaltflächen "Connect to server" und "Exit" verfügbar. Um mit den anderen Schaltflächen arbeiten zu können, benötigen wir weitere Informationen; daher sind sie gesperrt. Wir könnten auch entscheiden, "Connect to Server" ebenfalls zu sperren, bis die Informationen für host, username und password eingegeben wurden. Ich habe mich dagegen entschieden, weil unser Benutzer denken könnte: "Nichts scheint möglich zu sein, ich drücke auf Exit." :)
9090
9191Bevor ich damit beginne, ihnen den Code mitzuteilen, möchte ich betonen, dass es mehr Fehlerbehandlung im Code geben sollte. Kritische Abschnitte sollten in
9292
93-`try ... finally`
93+```text
94+try ... finally
95+```
9496
9597oder
9698
97-`try ... except`
99+```text
100+try ... except
101+```
98102
99103Konstruktionen platziert werden .
100104
101105#### Verbinden mit einem Server
102106
103107Das erste, was wir tun müssen, ist, eine Verbindung zum Server herzustellen. Da man nicht weiss, welche Datenbanken auf dem Server verfügbar sind, wenn man sich verbindet, werden wir beim Verbinden nach einer Liste der Datenbanken fragen. Der Haken dabei ist, aber dass man für eine Verbindung einen gültigen *DatabaseName* in den Eigenschaften von MySQLConnection angeben muss. Sie werden im Code sehen, dass ich die "mysql" Datenbank verwende. Diese Datenbank wird von MySQL zur Organisation verwendet und wird daher immer da sein.
104108
105109``` pascal
106110 procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
107111 begin
108112 // Prüfen, ob wir eine aktive Verbindung haben. Falls ja, schliessen wir sie.
109113 if MySQLConnection1.Connected then CloseConnection(Sender);
110114 // Die Verbindungsparameter setzen.
111115 MySQLConnection1.HostName := HostEdit.Text;
112116 MySQLConnection1.UserName := UserEdit.Text;
113117 MySQLConnection1.Password := PasswdEdit.Text;
114118 MySQLConnection1.DatabaseName := 'mysql'; // MySQL ist immer vorhanden!
115119 ShowString('Opening a connection to server: ' + HostEdit.Text);
116120 MySQLConnection1.Open;
117121 // Zuerst eine Liste der verfügbaren Datenbanken abfragen.
118122 if MySQLConnection1.Connected then begin
119123 ShowString('Connected to server: ' + HostEdit.Text);
120124 ShowString('Retrieving list of available databases.');
121125 SQLTransaction1.Starttransaction;
122126 SQLQuery1.SQL.Text := 'show databases';
123127 SQLQuery1.Open;
124128 while not SQLQuery1.EOF do begin
125129 DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
126130 SQLQuery1.Next;
127131 end;
128132 SQLQuery1.Close;
129133 SQLTransaction1.Commit;
130134 ShowString('List of databases received!');
131135 end;
132136 end;
133137```
134138
135139Zuerst prüfen wir, ob wir mit einem Server verbunden sind. Falls ja, dann rufen wir eine private Methode "CloseConnection" auf. In dieser Methode wird noch etwas mehr aufgeräumt, Schaltflächen deaktiviert und Comboboxen und Listboxen zurück gesetzt. Dann setzen wir die notwendigen Parameter für die Verbindung zum Server.
136140
137141
138142*Überall in unserem Programm werden sie Aufrufe von ShowString sehen. Diese Methode fügt eine Zeile zu dem Memo auf unserem Formular hinzu, die wie ein Log wirkt.*
139143
140144Mit der Parameterzusammenstellung können wir mit dem Server verbinden. Dies wird durch den Aufruf von
141145
142-`MySQLConnection1.Open; erreicht.`
146+```text
147+MySQLConnection1.Open; erreicht.
148+```
143149
144150In einer ordentlichen Anwendung würde man dies in eine Ausnahmebehandlungskonstruktion platzieren, um dem Benutzer eine freundliche Botschaft zu präsentieren, falls die Verbindung fehlgeschlagen ist. Wenn wir verbunden sind, wollen wir eine Liste der Datenbanken vom Server erhalten. Um die Daten vom Server zu erhalten, wird eine TSQLQuery verwendet. Die SQL Eigenschaft wird verwendet, um die SQL-Anweisung aufzubewahren, die an den Server gesendet wird. MySQL kennt das *SHOW DATABASES* Kommando, um die Liste der Datenbanken zu erhalten. Nachdem wir den SQL-Text eingegeben haben, rufen wir
145151
146-`SQLQuery1.Open;`
152+```text
153+SQLQuery1.Open;
154+```
147155
148156auf. Die Ergebnismenge einer SQLQuery kann durch die *fields* Eigenschaft geprüft werden. Wie sie sehen, iterieren wir durch die Datensätze durch den Aufruf von
149157
150-`SQLQuery1.Next;`
158+```text
159+SQLQuery1.Next;
160+```
151161
152162Wenn wir alle verfügbaren Datenbanken zu unserer Combobox hinzugefügt haben, schließen wir die SQLQuery wieder.
153163
154164#### Auswahl einer Datenbank
155165
156166Wenn der Benutzer eine Datenbank in der DatabaseComboBox auswählt, aktivieren wir die "Select Database" Schaltfläche. In dem OnClick Ereignis dieser Schaltfläche setzen wir *DatabaseName* der MySQLConnection1, und fordern eine Liste der Tabellen an. Die letzte Anweisung dieser Prozedur aktiviert die "Open Query" Schaltfläche, so dass der Benutzer eine Abfrage in der "Command" Editbox eingeben kann und diese an den Server sendet.
157167
158168``` pascal
159169 procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
160170 begin
161171 // Eine Datenbank wurde ausgewählt, lassen sie uns die Tabellen darin abfragen.
162172 CloseConnection(Sender);
163173 if DatabaseComboBox.ItemIndex <> -1 then begin
164174 with DatabaseComboBox do
165175 MySQLConnection1.DatabaseName := Items[ItemIndex];
166176 ShowString('Retreiving list of tables');
167177 SQLTransaction1.Starttransaction;
168178 SQLQuery1.SQL.Text := 'show tables';
169179 SQLQuery1.Open;
170180 while not SQLQuery1.EOF do begin
171181 TableComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
172182 SQLQuery1.Next;
173183 end;
174184 SQLQuery1.Close;
175185 SQLTransaction1.Commit;
176186 ShowString('List of tables received');
177187 end;
178188 OpenQueryButton.Enabled := True;
179189 end;
180190```
181191
182192MySQL hat ein spezielles Kommando, um eine Liste der Tabellen zu erhalten, vergleichbar dem Erhalten einer Liste der Datenbanken, *show tables*. Das Ergebnis dieser Abfrage wird auf die selbe Weise gehandhabt wie die Liste der Datenbanken und alle Tabellen werden zur TableComboBox hinzugefügt. Sie wundern sich vielleicht, warum wir die Verbindung nicht erneut öffnen, bevor wir die Abfrage auslösen? Nun, dies wird automatisch erledigt (falls notwendig), wenn wir die SQLQuery aktivieren.
183193
184194#### Felder in einer Tabelle
185195
186196In MySQL können sie erneut eine Form von "SHOW" verwenden, um die Felder in einer Tabelle zu erhalten. In diesem Fall "SHOW COLUMNS FROM \<Tabellenname\>". Wenn der Benutzer eine Tabelle aus der TableComboBox auswählt, wird das OnChange Ereignis dieser ComboBox ausgelöst, das die FieldListbox füllt.
187197
188198``` pascal
189199 procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
190200 begin
191201 FieldListBox.Clear;
192202 SQLTransaction1.Starttransaction;
193203 SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text;
194204 SQLQuery1.Open;
195205 while not SQLQuery1.EOF do begin
196206 FieldListBox.Items.Add(SQLQuery1.Fields[0].AsString);
197207 SQLQuery1.Next;
198208 end;
199209 SQLQuery1.Close;
200210 SQLTransaction1.Commit;
201211 end;
202212```
203213
204214Ebenso wie die Namen der Felder, enthält die Ergebnismenge Informationen über den Typ des Feldes, ob das Feld ein Schlüssel ist, ob Nullwerte erlaubt sind und einiges mehr.
205215
206216#### Anzeigen der Daten
207217
208218Wie bereits erwähnt, wollen wir Komponenten verwenden, um eine Verbindung zur Datenbank zu bekommen. Lassen sie uns ebenso einige Komponenten verwenden, um die Daten zu zeigen. Wir werden ein zweites Formular verwenden, um ein Raster mit den vom Benutzer angeforderten Daten zu zeigen. Dieses Formular wird gezeigt, wenn der Benutzer ein SQL Kommando in der "Command" Editbox eingegeben und danach auf die "Open Query" Schaltfläche geklickt hat. Dies ist das OnClick Ereignis:
209219
210220``` pascal
211221 procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
212222 begin
213223 ShowQueryForm := TShowQueryForm.Create(self);
214224 ShowQueryForm.Datasource1.DataSet := SQLQuery1;
215225 SQLQuery1.SQL.Text := CommandEdit.Text;
216226 SQLQuery1.Open;
217227 ShowQueryForm.ShowModal;
218228 ShowQueryForm.Free;
219229 SQLQuery1.Close;
220230 end;
221231```
222232
223233Das ShowQuery Formular sieht etwa so aus:
224234
225235![](/wiki-images/4/47/Mysqlshow.png)
226236
227237und enthält ein
228238
229239| | | |
230240|-------------|------------|-------------|
231241| TPanel | Align | alBottom |
232242| TDataSource | | |
233243| TDBGrid | Align | alClient |
234244| | DataSource | DataSource1 |
235245| TButton | Caption | Close |
236246
237247Die Schaltfläche wird auf dem Panel plaziert. Was im "Open Query" OnClick Ereignis passiert, ist folgendes. Zuerst erzeugen wir eine Instanz von TShowQueryForm. Zweitens setzen wir die *DataSet* Eigenschaft der DataSource auf unsere SQLQuery1. Dann setzen wir das SQLQuery SQL Kommando auf die Benutzereingabe in der "Command" Editbox und öffnen es. Dann wird das ShowQuery Formular modal gezeigt. Das bedeutet, dass wir den Fokus unseres Programms haben, bis dieses geschlossen wird. Wenn sie geschlossen wird, geben wir sie "frei" und schließen SQLQuery1 erneut.
238248
239249The Form can be further enhanced by inserting a method for modifying the content of the DataSet and ultimately the DataBase. A full version can be downloaded from <http://digitus.itk.ppke.hu/~janma/lazarus/MySql5Test.tar.gz> (with thanks to Arwen and JZombi from the Lazarus MySQL Forum) but the relevant details are as follows:
240250
241251Add a Button at the bottom of the ShowQuery Form named AddButton and with Caption 'Add'. Erzeugen sie eine Methode für AddButtonClick wie diese:
242252
243-`procedure TShowQueryForm.AddButtonClick(Sender: TObject);`\
244-`begin`\
245-`  DataSource1.DataSet.Append;`\
246-`end; `
253+``` pascal
254+procedure TShowQueryForm.AddButtonClick(Sender: TObject);
255+begin
256+ DataSource1.DataSet.Append;
257+end;
258+```
247259
248260Ändern sie den Code für OpenQueryButtonClick, to allow for updates to the database when we finish with the Query Form.
249261
250-`procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);`\
251-`begin`\
252-`  ShowQueryForm := TShowQueryForm.Create(nil);`\
253-`  try`\
254-`    ShowQueryForm.DataSource1.DataSet := SQLQuery1;`\
255-`    // We will write in the database, so let's set ReadOnly to false, `\
256-`    // and for that we need to set ParseSQL true`\
257-`    SQLQuery1.ParseSQL:=true;`\
258-`    SQLQuery1.ReadOnly:=false;`\
259-`    SQLQuery1.SQL.Text := CommandEdit.Text;`\
260-`    SQLQuery1.Open;`\
261-`    ShowQueryForm.ShowModal;`\
262-`  finally`\
263-`    // set up update mode, and update database`\
264-`    SQLQuery1.UpdateMode:=upWhereChanged;`\
265-`    SQLQuery1.ApplyUpdates;`\
266-`    SQLTransaction1.Commit;`\
267-`    ShowQueryForm.Free;`\
268-`    SQLQuery1.Close;`\
269-`    // set read-only and parsesql back to default`\
270-`    SQLQuery1.ParseSQL:=false;`\
271-`    SQLQuery1.ReadOnly:=true;`\
272-`  end;`\
273-`end;`\
274-` `
262+``` pascal
263+procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
264+begin
265+ ShowQueryForm := TShowQueryForm.Create(nil);
266+ try
267+ ShowQueryForm.DataSource1.DataSet := SQLQuery1;
268+ // We will write in the database, so let's set ReadOnly to false,
269+ // and for that we need to set ParseSQL true
270+ SQLQuery1.ParseSQL:=true;
271+ SQLQuery1.ReadOnly:=false;
272+ SQLQuery1.SQL.Text := CommandEdit.Text;
273+ SQLQuery1.Open;
274+ ShowQueryForm.ShowModal;
275+ finally
276+ // set up update mode, and update database
277+ SQLQuery1.UpdateMode:=upWhereChanged;
278+ SQLQuery1.ApplyUpdates;
279+ SQLTransaction1.Commit;
280+ ShowQueryForm.Free;
281+ SQLQuery1.Close;
282+ // set read-only and parsesql back to default
283+ SQLQuery1.ParseSQL:=false;
284+ SQLQuery1.ReadOnly:=true;
285+ end;
286+end;
287+```
275288
276289Wir können jetzt Datensätze zur Datenbank hinzufügen. Wenn wir ein TDBNavigator zu der ShowQuery Form hinzufügen,können wir im Data Grid besser navigieren,Datensätze einfügen.Die Datenbank wird jedesmal aktualisiert, wenn die ShowQueryForm geschlossen wird und das können wir nachprüfen,wenn wir ShowQueryForm wieder öffnen.
277290
278291## Quellen
279292
280293Die Quellen für dieses Projekt können von [hier](http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download) heruntergeladen werden. Für mehr Demoprojekte siehe [Sourceforge](http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359).
281294
282295---
283296*From the Free Pascal wiki, page "MySQLDatabases/de", as it stood on 2020-02-20 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