Difference between revisions of "MySQLDatabases/de"

From Lazarus wiki
Jump to navigationJump to search
m
m (Fixed syntax highlighting; removed categories included in template)
 
(27 intermediate revisions by 8 users not shown)
Line 5: Line 5:
 
== Einleitung ==
 
== Einleitung ==
  
Im [[Lazarus Database Tutorial#Lazarus and MySQL|Datenbank Tutorial]] sahen wir einen ersten Versuch, eine Verbindung zu einem MySQL Server herzustellen. Wir verwendeten keine Komponenten, weder visuelle oder nichtvisuelle zu diesem Zeitpunkt. Dieses Seite will erklären, wie man sich mit einem MySQL Server verbindet auf eine (vielleicht) einfachere Weise.
+
Im [[Lazarus Database Tutorial#Lazarus and MySQL|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.
  
 
== Verfügbare Komponenten ==
 
== Verfügbare Komponenten ==
 
=== MySQL Komponenten ===
 
 
''Das /components/mysql Verzeichnis wurde in Version 0.9.13 entfernt. Weichen sie auf das sqldblaz Package aus.''
 
 
Wenn sie in das $Lazarus/components/mysql Verzeichnis schauen, dann werden sie zwei Lazarus Packages finden. Es gibt ein Package für MySQL Version 3.2x (mysql3laz.lpk) und eines für MySQL Version 4.x (mysql4laz.lpk). Falls noch nicht geschehen, installieren sie das entsprechende Package, abhängig von der Server Version. Denken sie daran, daß es nicht möglich ist, das Packages für Version 3 zu verwenden für eine Verbindung mit einem Server der Version 4 und umgekehrt.
 
Wenn sie dieses Package installiert haben werden sie einen neuen Tab sehen in der Komponentenpalette, genannt MySQL. Auf diesem Tab gibt es zwei Komponenten, TMySQLDatabase und TMySQLDataset.
 
 
Übrigens - bevor sie versuchen, diese Komponenten in Lazarus zu installieren stellen sie sicher, daß sie die entsprechenden MySQL Client Bibliotheken haben, oder Lazarus wird nach der Installation nicht starten.
 
  
 
=== SQLdb Komponenten ===
 
=== SQLdb Komponenten ===
Eine andere Möglichkeit ist die Installation des Packages im $Lazarus/components/sqldb Verzeichnis. In diesem Verzeichnis können sie eine Packagedatei mit Namen sqldblaz.lpk sehen. Sie müssen dieses Package installieren und das mysql4connlaz.lpk Package aus dem $Lazarus/components/sqldb/mysql Verzeichnis. Das erste Package enthält einige allgemeine Komponenten, die für alle Datenbanken verwendet werden. Diese Komponenten sind TSQLTransaction und TSQLQuery und sind zu finden auf dem neuen SQLdb Tab. Nach der Installation von mysql4connlaz.lpk werden sie eine dritte Komponente auf dem SQLdb Tab finden mit Namen TMySQLConnection (dargestellt durch einen Delphin).
+
Eine 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).
  
Wenn sie das Verzeichnis $Lazarus/components/sqldb/mysql nicht finden können und mysql4connlaz.lpk dann bedeutet dies, daß sie eine neuere Version benutzen, in welcher mysql4connlaz.lpk fusioniert wurde mit sqldblaz.lpk. Das ist OK, die Installation von sqldblaz.lpk wird ihnen alle erwähnten Komponenten bieten im selben Lazarus IDE toolbar TAB.
+
Wenn 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.
  
 
Wenn sie nicht wissen, wie man Komponenten / Packages installiert, dann schauen sie auf dieser [[Install Packages/de|Seite]] nach.
 
Wenn 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 ein Programm entwickeln mit den SQLdb Komponenten.
+
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.
  
 
Ü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.
 
Ü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.
  
 
== Erläuterung der verwendeten Komponenten ==
 
== Erläuterung der verwendeten Komponenten ==
 +
 
=== TMySQLConnection ===
 
=== TMySQLConnection ===
  
Die TMySQLConnection wird verwendet um Parameter aufzubewahren für die Verbindung zum Datenbank Server. Sie erlaubt ihnen to set the host to connect to and the userid and password to use in the connection. Eine andere Eigenschaft von TMySQLConnection wird verwendet, um to indicate die Datenbank, die sie verwenden wollen. The 'LoginPrompt' is not functional yet, so make sure that next to the HostName und DatabaseName die UserName und Password Eigenschaften ebenso Werte haben bevor sie versuchen, die Verbindung zu öffnen.
+
TMySQLConnection 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.
Be sure to use a TSQLTransaction as well and connect it to your MySQLConnection durch setzen der Transaction Eigenschaft, oder sie werden nicht in der Lage sein, ein SQLQuery zu öffnen.
+
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.
  
Anmerkung. In der neuesten SVN Version von Lazarus finden sie 3 MySQLConnection Komponenten. Dies sind TMySQL40Connection, TMySQL41Connection und TMySQL50Connection. Stellen sie sicher, daß sie die richtige verwenden zum Verbinden mit ihrem Server.
+
'''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.
 
Wenn z.B. bei ihnen MySQL 4.1 läuft, dann verwenden sie TMySQL41Connection.
  
 
=== TSQLTransaction ===
 
=== TSQLTransaction ===
Eine 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, daß die SQLTransaction nicht aktiv ist.
+
 
 +
Eine 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.
 +
<syntaxhighlight lang=pascal>
 +
...
 +
SQLQuery1.ExecSQL;
 +
SQLTransaction1.Commit;
 +
...
 +
</syntaxhighlight>
 +
 
 +
oder
 +
 
 +
<syntaxhighlight lang=pascal>
 +
SQLQuery1.SQL.Text:='SELECT text FROM testtab';
 +
SQLTransaction.StartTransaction;//Falls die Funktionalität der Transaction nicht benötigt wird, kann das in SQLQuery1BeforeOpen ausgeführt werden.
 +
SQLQuery1.Open;
 +
while not SQLQuery1.EOF do
 +
  begin
 +
  ListBox1.Items.Add(SQLQuery1.Fields[0].AsString);
 +
  SQLQuery1.Next;
 +
  end;
 +
SQLQuery1.Close;
 +
SQLTransaction.Commit;//Falls die Funktionalität der Transaction nicht benötigt wird, kann das in SQLQuery1AfterClose ausgeführt werden.
 +
</syntaxhighlight>
  
 
=== TSQLQuery ===
 
=== TSQLQuery ===
TSQLQuery 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.
+
 
 +
TSQLQuery 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.
  
 
=== TDataSource ===
 
=== TDataSource ===
  
Ein TDataSource bietet die Verbindung zwischen den sichtbaren datensensitiven Komponenten wie DBEdit, DBGrid und einem TDataset. Es macht die Daten für die datensensitiven Komponenten verfügbar zum Anzeigen.
+
Ein 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 nur mit einem einzigen Dataset verbunden werden zur selben Zeit, aber es können mehrere datensensitive Komponenten verbunden werden.
+
Ein TDatasource kann zur selben Zeit nur mit einem einzigen Dataset verbunden werden, aber es können mehrere datensensitive Komponenten verbunden werden.
  
 
=== TDBGrid ===
 
=== TDBGrid ===
Ein 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.
+
Ein 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.
  
 
== Unser Programm ==
 
== Unser Programm ==
  
 
=== Die Grundlagen ===
 
=== Die Grundlagen ===
Wir werden versuchen, ein Programm zu erstellen, das auf diesem [[Lazarus Database Tutorial/nl#Verbinding met MySQL vanuit een Lazarus Programma|hier (auf holländisch)]] basiert, welches auf dem [[Lazarus Database Tutorial#Connecting to MySQL from a Lazarus Application|Original (auf englisch)]] von [[user:kirkpatc|Chris]] basiert.
+
 
 +
Wir werden versuchen, ein Programm zu erstellen, das auf diesem [[Lazarus Database Tutorial/nl#Verbinding met MySQL vanuit een Lazarus Programma|hier (auf holländisch)]] basiert, welches auf dem [[Lazarus Database Tutorial#Connecting to MySQL from a Lazarus Application|Original (auf englisch)]] von [[user:Kirkpatc|Chris]] basiert.
  
 
=== Das Hauptformular ===
 
=== Das Hauptformular ===
Wir werden den selben Hauptbildschirm verwenden und die gesamte Funktionalität von Anfang an erstellen :) Wie sie sehen werden gibt es a lot less to take care of, because the components really take away all the hard stuff! So lets start by making a screen that looks like this.<br> [[image:Trymysql.png]]<br>
+
 
Vom SQLdb-Tab platzieren sie eine TMySQLConnection, eine TSQLTransaction und eine TSQLQuery [[image:Components.png]] auf diese Formular. Ändern sie nicht die vorgegebenen Namen dieser Komponenten. 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:
+
Wir 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.<br> [[image:Trymysql.png]]<br>
 +
Vom SQLdb-Tab platzieren sie eine TMySQLConnection, eine TSQLTransaction und eine TSQLQuery [[image: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:
 
{|
 
{|
 
|-
 
|-
Line 71: Line 90:
 
| SQLQuery1 || Transaction || SQLTransaction1
 
| SQLQuery1 || Transaction || SQLTransaction1
 
|}
 
|}
Die Transaction-Eigenschaft von SQLQuery1 wird automatisch gesetzt, wenn sie zuerst die Transaction-Eigenschaft von MySQLConnection1 setzen. Wenn sie diese setzen, dann werden sie feststellen, daß SQLTransaction1.Database auf MySQLConnection1 gesetzt wurde.
+
Die 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.
  
 
=== Der Code ===
 
=== Der Code ===
  
Wie 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 Informationenen, 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." :)
+
Wie 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." :)
  
Bevor ich damit beginne, ihnen den Code mitzuteilen, möchte ich betonen, daß es mehr Fehlerbehandlung im Code geben sollte. Kritische Abschnitte sollten platziert werden in
+
Bevor ich damit beginne, ihnen den Code mitzuteilen, möchte ich betonen, dass es mehr Fehlerbehandlung im Code geben sollte. Kritische Abschnitte sollten in
 
  try ... finally
 
  try ... finally
 
oder
 
oder
 
  try ... except
 
  try ... except
Konstruktionen.
+
Konstruktionen platziert werden .
  
 
==== Verbinden mit einem Server ====
 
==== Verbinden mit einem Server ====
Das erste was wir tun müssen, ist eine Verbindung zum Server herzustellen. As when connecting we don't know what databases are available on the server we will ask for a list of databases on connecting. However there is one catch, to make the connection we have to enter einen gültigen ''DatabaseName'' in den Eigenschaften von MySQLConnection. Sie werden im Code sehen, daß ich die "mysql" Datenbank verwende. Diese Datenbank wird von MySQL zur Organisation verwendet und wird daher immer da sein.
+
 
 +
Das 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.
 +
<syntaxhighlight lang=pascal>
 
  procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
 
  procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
 
  begin
 
  begin
   // Prüfen ob wir eine aktive Verbindung haben. Falls ja, schliessen wir sie.
+
   // Prüfen, ob wir eine aktive Verbindung haben. Falls ja, schliessen wir sie.
 
   if MySQLConnection1.Connected then CloseConnection(Sender);
 
   if MySQLConnection1.Connected then CloseConnection(Sender);
 
   // Die Verbindungsparameter setzen.
 
   // Die Verbindungsparameter setzen.
Line 100: Line 121:
 
     ShowString('Connected to server: ' + HostEdit.Text);
 
     ShowString('Connected to server: ' + HostEdit.Text);
 
     ShowString('Retrieving list of available databases.');
 
     ShowString('Retrieving list of available databases.');
 +
    SQLTransaction1.Starttransaction;
 
     SQLQuery1.SQL.Text := 'show databases';
 
     SQLQuery1.SQL.Text := 'show databases';
 
     SQLQuery1.Open;
 
     SQLQuery1.Open;
Line 107: Line 129:
 
     end;
 
     end;
 
     SQLQuery1.Close;
 
     SQLQuery1.Close;
 +
    SQLTransaction1.Commit;
 
     ShowString('List of databases received!');
 
     ShowString('List of databases received!');
 
   end;
 
   end;
 
  end;
 
  end;
 +
</syntaxhighlight>
  
The first thing we do is check to see if we are connected to a server, if we are dann rufen wir eine private Methode "CloseConnection" auf. In this method some more housekeeping is done like disabling buttons and clearing comboboxes and listboxes. Dann setzen wir die notwendigen Parameter für die Verbindung zum Server.
+
Zuerst 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.
:''Überall in unserem Programm werden sie Aufrufe von ShowString sehen. Diese Methode fügt eine Zeile zu dem Memo auf unserem Formular hinzu which acts like a kind of log.''
+
:''Ü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.''
Mit der Parameterzusammenstellung können wir mit dem Server verbinden. Dies wird erreicht durch den Aufruf von
+
Mit der Parameterzusammenstellung können wir mit dem Server verbinden. Dies wird durch den Aufruf von
  MySQLConnection1.Open;
+
  MySQLConnection1.Open; erreicht.
 
In 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.
 
In 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
+
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
 
  SQLQuery1.Open;
 
  SQLQuery1.Open;
 
auf.
 
auf.
Die Ergebnismenge einer SQLQuery kann geprüft werden durch die ''fields'' Eigenschaft. Wie sie sehen können iterieren wir durch die Datensätze durch aufrufen von
+
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
 
  SQLQuery1.Next;
 
  SQLQuery1.Next;
 
Wenn wir alle verfügbaren Datenbanken zu unserer Combobox hinzugefügt haben, schließen wir die SQLQuery wieder.
 
Wenn wir alle verfügbaren Datenbanken zu unserer Combobox hinzugefügt haben, schließen wir die SQLQuery wieder.
  
 
==== Auswahl einer Datenbank ====
 
==== Auswahl einer Datenbank ====
Wenn der Benutzer eine Datenbank in der DatabaseComboBox auswählt, aktivieren wir den "Select Database" Button. In dem OnClick Ereignis dieses Buttons setzen wir ''DatabaseName'' der MySQLConnection1, und fordern eine Liste der Tabellen an. Die letzte Anweisung dieser Prozedur aktiviert den "Open Query" Button, so daß der Benutzer eine Abfrage in der "Command" Editbox eingeben kann und diese an den Server sendet.
+
 
 +
Wenn 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.
 +
<syntaxhighlight lang=pascal>
 
  procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
 
  procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
 
  begin
 
  begin
Line 133: Line 159:
 
       MySQLConnection1.DatabaseName := Items[ItemIndex];
 
       MySQLConnection1.DatabaseName := Items[ItemIndex];
 
     ShowString('Retreiving list of tables');
 
     ShowString('Retreiving list of tables');
 +
    SQLTransaction1.Starttransaction;
 
     SQLQuery1.SQL.Text := 'show tables';
 
     SQLQuery1.SQL.Text := 'show tables';
 
     SQLQuery1.Open;
 
     SQLQuery1.Open;
Line 140: Line 167:
 
     end;
 
     end;
 
     SQLQuery1.Close;
 
     SQLQuery1.Close;
 +
    SQLTransaction1.Commit;
 
     ShowString('List of tables received');
 
     ShowString('List of tables received');
 
   end;
 
   end;
 
   OpenQueryButton.Enabled := True;
 
   OpenQueryButton.Enabled := True;
 
  end;
 
  end;
 +
</syntaxhighlight>
 
MySQL 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.
 
MySQL 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.
+
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.
  
 
==== Felder in einer Tabelle ====
 
==== Felder in einer Tabelle ====
In MySQL you can again use a form of "SHOW" um die Felder in einer Tabelle zu erhalten. In diesem Fall "SHOW COLUMNS FROM <tablename>". Wenn der Benutzer eine Tablle aus der TableComboBox auswählt wird das OnChange Ereignis dieser ComboBox ausgelöst, welches die FieldListbox füllt.
+
In 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.
 +
<syntaxhighlight lang=pascal>
 
  procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
 
  procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
 
  begin
 
  begin
 
   FieldListBox.Clear;
 
   FieldListBox.Clear;
 +
  SQLTransaction1.Starttransaction;
 
   SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text;
 
   SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text;
 
   SQLQuery1.Open;
 
   SQLQuery1.Open;
Line 159: Line 190:
 
   end;
 
   end;
 
   SQLQuery1.Close;
 
   SQLQuery1.Close;
 +
  SQLTransaction1.Commit;
 
  end;
 
  end;
 +
</syntaxhighlight>
 
Ebenso 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.
 
Ebenso 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.
  
 
==== Anzeigen der Daten ====
 
==== Anzeigen der Daten ====
Wie wir bereits sagten 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 grid zu zeigen, mit den vom Benutzer angeforderten Daten. Dieses Formular wird gezeigt, wenn der Benutzer ein SQL Kommando im "Command" editbox eingegeben und danach auf den "Open Query" Button geklicht hat. Dies ist das OnClick Ereignis:
+
 
 +
Wie 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:
 +
<syntaxhighlight lang=pascal>
 
  procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 
  procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 
  begin
 
  begin
Line 174: Line 209:
 
   SQLQuery1.Close;
 
   SQLQuery1.Close;
 
  end;
 
  end;
 +
</syntaxhighlight>
 
Das ShowQuery Formular sieht etwa so aus:
 
Das ShowQuery Formular sieht etwa so aus:
 
<center>[[Image:Mysqlshow.png]]</center>
 
<center>[[Image:Mysqlshow.png]]</center>
Line 189: Line 225:
 
| TButton || Caption || Close
 
| TButton || Caption || Close
 
|}
 
|}
Der Button wird auf dem Panel plaziert.
+
Die 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, this means that it will have the focus of our application until it is closed. When it is closed, we "free" it and close SQLQuery1 again.
+
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.
 +
 
 +
The 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:
 +
 
 +
Add a Button at the bottom of the ShowQuery Form named AddButton and with Caption 'Add'. Erzeugen sie eine Methode für AddButtonClick wie diese:
 +
 
 +
procedure TShowQueryForm.AddButtonClick(Sender: TObject);
 +
begin
 +
  DataSource1.DataSet.Append;
 +
end;
 +
 
 +
Ändern sie den Code für OpenQueryButtonClick, to allow for updates to the database when we finish with the Query Form.
 +
 
 +
procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 +
begin
 +
  ShowQueryForm := TShowQueryForm.Create(nil);
 +
  try
 +
    ShowQueryForm.DataSource1.DataSet := SQLQuery1;
 +
    // We will write in the database, so let's set ReadOnly to false,
 +
    // and for that we need to set ParseSQL true
 +
    SQLQuery1.ParseSQL:=true;
 +
    SQLQuery1.ReadOnly:=false;
 +
    SQLQuery1.SQL.Text := CommandEdit.Text;
 +
    SQLQuery1.Open;
 +
    ShowQueryForm.ShowModal;
 +
  finally
 +
    // set up update mode, and update database
 +
    SQLQuery1.UpdateMode:=upWhereChanged;
 +
    SQLQuery1.ApplyUpdates;
 +
    SQLTransaction1.Commit;
 +
    ShowQueryForm.Free;
 +
    SQLQuery1.Close;
 +
    // set read-only and parsesql back to default
 +
    SQLQuery1.ParseSQL:=false;
 +
    SQLQuery1.ReadOnly:=true;
 +
  end;
 +
end;
 +
 
 +
Wir 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.
  
 
==Quellen==
 
==Quellen==
 +
 
Die Quellen für dieses Projekt können von [http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download hier] heruntergeladen werden.
 
Die Quellen für dieses Projekt können von [http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download hier] heruntergeladen werden.
 
Für mehr Demoprojekte siehe [http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359 Sourceforge].
 
Für mehr Demoprojekte siehe [http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359 Sourceforge].

Latest revision as of 00:43, 21 February 2020

Deutsch (de) English (en) français (fr) 日本語 (ja) polski (pl) slovenčina (sk)

Work in progress

Einleitung

Im 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.

Verfügbare Komponenten

SQLdb Komponenten

Eine 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).

Wenn 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.

Wenn sie nicht wissen, wie man Komponenten / Packages installiert, dann schauen sie auf dieser 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.

Ü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.

Erläuterung der verwendeten Komponenten

TMySQLConnection

TMySQLConnection 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.

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.

TSQLTransaction

Eine 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.

 ...
 SQLQuery1.ExecSQL;
 SQLTransaction1.Commit;
 ...

oder

 SQLQuery1.SQL.Text:='SELECT text FROM testtab';
 SQLTransaction.StartTransaction;//Falls die Funktionalität der Transaction nicht benötigt wird, kann das in SQLQuery1BeforeOpen ausgeführt werden.
 SQLQuery1.Open;
 while not SQLQuery1.EOF do
  begin
   ListBox1.Items.Add(SQLQuery1.Fields[0].AsString);
   SQLQuery1.Next;
  end;
 SQLQuery1.Close;
 SQLTransaction.Commit;//Falls die Funktionalität der Transaction nicht benötigt wird, kann das in SQLQuery1AfterClose ausgeführt werden.

TSQLQuery

TSQLQuery 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.

TDataSource

Ein 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.

TDBGrid

Ein 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.

Unser Programm

Die Grundlagen

Wir werden versuchen, ein Programm zu erstellen, das auf diesem hier (auf holländisch) basiert, welches auf dem Original (auf englisch) von Chris basiert.

Das Hauptformular

Wir 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.
Trymysql.png
Vom SQLdb-Tab platzieren sie eine TMySQLConnection, eine TSQLTransaction und eine TSQLQuery 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:

Komponente Eigenschaft Wert
MySQLConnection1 Transaction SQLTransaction1
SQLTransaction1 Database MySQLConnection1
SQLQuery1 Database MySQLConnection1
SQLQuery1 Transaction SQLTransaction1

Die 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.

Der Code

Wie 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." :)

Bevor ich damit beginne, ihnen den Code mitzuteilen, möchte ich betonen, dass es mehr Fehlerbehandlung im Code geben sollte. Kritische Abschnitte sollten in

try ... finally

oder

try ... except

Konstruktionen platziert werden .

Verbinden mit einem Server

Das 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.

 procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
 begin
   // Prüfen, ob wir eine aktive Verbindung haben. Falls ja, schliessen wir sie.
   if MySQLConnection1.Connected then CloseConnection(Sender);
   // Die Verbindungsparameter setzen.
   MySQLConnection1.HostName := HostEdit.Text;
   MySQLConnection1.UserName := UserEdit.Text;
   MySQLConnection1.Password := PasswdEdit.Text;
   MySQLConnection1.DatabaseName := 'mysql'; // MySQL ist immer vorhanden!
   ShowString('Opening a connection to server: ' + HostEdit.Text);
   MySQLConnection1.Open;
   // Zuerst eine Liste der verfügbaren Datenbanken abfragen.
   if MySQLConnection1.Connected then begin
     ShowString('Connected to server: ' + HostEdit.Text);
     ShowString('Retrieving list of available databases.');
     SQLTransaction1.Starttransaction;
     SQLQuery1.SQL.Text := 'show databases';
     SQLQuery1.Open;
     while not SQLQuery1.EOF do begin
       DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
       SQLQuery1.Next;
     end;
     SQLQuery1.Close;
     SQLTransaction1.Commit;
     ShowString('List of databases received!');
   end;
 end;

Zuerst 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.

Ü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.

Mit der Parameterzusammenstellung können wir mit dem Server verbinden. Dies wird durch den Aufruf von

MySQLConnection1.Open; erreicht.

In 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

SQLQuery1.Open;

auf. 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

SQLQuery1.Next;

Wenn wir alle verfügbaren Datenbanken zu unserer Combobox hinzugefügt haben, schließen wir die SQLQuery wieder.

Auswahl einer Datenbank

Wenn 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.

 procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
 begin
   // Eine Datenbank wurde ausgewählt, lassen sie uns die Tabellen darin abfragen.
   CloseConnection(Sender);
   if DatabaseComboBox.ItemIndex <> -1 then begin
     with DatabaseComboBox do
       MySQLConnection1.DatabaseName := Items[ItemIndex];
     ShowString('Retreiving list of tables');
     SQLTransaction1.Starttransaction;
     SQLQuery1.SQL.Text := 'show tables';
     SQLQuery1.Open;
     while not SQLQuery1.EOF do begin
       TableComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
       SQLQuery1.Next;
     end;
     SQLQuery1.Close;
     SQLTransaction1.Commit;
     ShowString('List of tables received');
   end;
   OpenQueryButton.Enabled := True;
 end;

MySQL 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.

Felder in einer Tabelle

In 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.

 procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
 begin
   FieldListBox.Clear;
   SQLTransaction1.Starttransaction;
   SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text;
   SQLQuery1.Open;
   while not SQLQuery1.EOF do begin
     FieldListBox.Items.Add(SQLQuery1.Fields[0].AsString);
     SQLQuery1.Next;
   end;
   SQLQuery1.Close;
   SQLTransaction1.Commit;
 end;

Ebenso 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.

Anzeigen der Daten

Wie 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:

 procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 begin
   ShowQueryForm := TShowQueryForm.Create(self);
   ShowQueryForm.Datasource1.DataSet := SQLQuery1;
   SQLQuery1.SQL.Text := CommandEdit.Text;
   SQLQuery1.Open;
   ShowQueryForm.ShowModal;
   ShowQueryForm.Free;
   SQLQuery1.Close;
 end;

Das ShowQuery Formular sieht etwa so aus:

Mysqlshow.png

und enthält ein

TPanel Align alBottom
TDataSource
TDBGrid Align alClient
DataSource DataSource1
TButton Caption Close

Die 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.

The 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:

Add a Button at the bottom of the ShowQuery Form named AddButton and with Caption 'Add'. Erzeugen sie eine Methode für AddButtonClick wie diese:

procedure TShowQueryForm.AddButtonClick(Sender: TObject);
begin
  DataSource1.DataSet.Append;
end; 

Ändern sie den Code für OpenQueryButtonClick, to allow for updates to the database when we finish with the Query Form.

procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
begin
  ShowQueryForm := TShowQueryForm.Create(nil);
  try
    ShowQueryForm.DataSource1.DataSet := SQLQuery1;
    // We will write in the database, so let's set ReadOnly to false, 
    // and for that we need to set ParseSQL true
    SQLQuery1.ParseSQL:=true;
    SQLQuery1.ReadOnly:=false;
    SQLQuery1.SQL.Text := CommandEdit.Text;
    SQLQuery1.Open;
    ShowQueryForm.ShowModal;
  finally
    // set up update mode, and update database
    SQLQuery1.UpdateMode:=upWhereChanged;
    SQLQuery1.ApplyUpdates;
    SQLTransaction1.Commit;
    ShowQueryForm.Free;
    SQLQuery1.Close;
    // set read-only and parsesql back to default
    SQLQuery1.ParseSQL:=false;
    SQLQuery1.ReadOnly:=true;
  end;
end;
 

Wir 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.

Quellen

Die Quellen für dieses Projekt können von hier heruntergeladen werden. Für mehr Demoprojekte siehe Sourceforge.