MySQLDatabases/de

From Lazarus wiki
Jump to navigationJump to search

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

Verfügbare Komponenten

MySQL Komponenten

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

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

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 ein Programm entwickeln mit den SQLdb Komponenten.

Ü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

The TMySQLConnection is used to store parameters to connect to the database server. It enables you to set the host to connect to and the userid and password to use in the connection. Another property of the TMySQLConnection is used to indicate the database you want to use. The 'LoginPrompt' is not functional yet, so make sure that next to the HostName and DatabaseName the UserName and Password properties have values as well before you try to open the connection. Be sure to use a TSQLTransaction as well and connect it to your MySQLConnection be setting the Transaction property, or you will not be able to open a SQLQuery.

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.

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 verfügbar zum Anzeigen. Ein TDatasource kann nur mit einem einzigen dataset verbunden werden zur selben Zeit, 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

We will use the same main screen and build all functionality from scratch :) As you will see there is 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.
Trymysql.png
Vom SQLdb-Tab plazieren ein TMySQLConnection, ein TSQLTransaction und ein TSQLQuery Components.png auf diese Formular. Ändern sie nicht die vorgegebenen Namen dieser Komponenten. 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, daß 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 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." :)

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

try ... finally

oder

try ... except

Konstruktionen.

Verbinden mit einem Server

The first thing we have to do is get connected to our server. 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 a valid DatabaseName in the properties of the MySQLConnection. You will see in the code that I am using the "mysql" database. This database is used by mysql for some housekeeping so it will always be there.

procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
begin
  // Check if we have an active connection. If so, let's close it.
  if MySQLConnection1.Connected then CloseConnection(Sender);
  // Set the connection parameters.
  MySQLConnection1.HostName := HostEdit.Text;
  MySQLConnection1.UserName := UserEdit.Text;
  MySQLConnection1.Password := PasswdEdit.Text;
  MySQLConnection1.DatabaseName := 'mysql'; // MySQL is allways there!
  ShowString('Opening a connection to server: ' + HostEdit.Text);
  MySQLConnection1.Open;
  // First lets get a list of available databases.
  if MySQLConnection1.Connected then begin
    ShowString('Connected to server: ' + HostEdit.Text);
    ShowString('Retrieving list of available databases.');
    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;
    ShowString('List of databases received!');
  end;
end;

The first thing we do is check to see if we are connected to a server, if we are then we call a private method "CloseConnection". In this method some more housekeeping is done. like disabling buttons and clearing comboboxes and listboxes. Then we set the necessary parameters to connect to server.

Throughout our program you may see calls to ShowString. This method adds a line to the memo on our form which acts like a kind of log.

With the parameters set, we can connect to the server. Dies wird erreicht durch den Aufruf von

MySQLConnection1.Open;

In a proper application one would place this in an exception handling construct to present a friendly message to the user if the connection failed. When we are connected we want to get a list of databases from the server. To get data from the server a TSQLQuery is used. The SQL property is used to store the SQL-statement send to the server. 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. The result set of a SQLQuery can be examined through the fields property. As you can see we iterate through the records be calling

SQLQuery1.Next;

When we have added all available databases to our combobox, schließen wir die SQLQuery wieder.

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.

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');
    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;
    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 you can again use a form of "SHOW" to get the fields in a table. 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.

procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
begin
  FieldListBox.Clear;
  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;
end;

As well as the names of the fields, the result set contains information on the type of field, if the field is a key, if nulls are allowed and some more.

Anzeigen der Daten

Well as we said we would use components to get connected to the database, lets use some components to show the data as well. We will use a second form to show a grid with the data requested by the user. This form will be shown when the user typed a SQL command in the "Command" editbox and afterwards clicks the "Open Query" button. 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

Der Button 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.

Quellen

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