Tech-Ecke / Delphi Inhalt / MySQL Datenbanken

 

     MySQL Datenbanken


Die hier gezeigte Vorgehensweise funktionier gleichermaßen mit einem MySQL- und MariaDB-Server. Wer noch keinen Server am laufen hat und noch nicht so recht weiß wie, der kann sich diesen Beitrag mal anschauen. Auch wenn in der Überschrift PHP steht, so ist das Installieren und einrichten des SQL-Servers genau das gleiche. Den Apache-Server braucht man eigentlich nicht, jedoch muss dieser zum Einrichten des MySQL-Servers mittels phpMyAdmin auch gestartet werden.

Für die nachfolgend gezeigten Beispiele kann die Datenbanktabelle hier herunter geladen werden:

MeineTabelle.sql (gezipt, 1 KB)

Bevor die Tabelle inkl. Daten importiert werden kann, muss die benötigte Datenbank "Delphi" händisch über phpMyAdmin angelegt werden. Das sollte dann so aussehen:

 

Wichtig: Auch muss man sich für den Zugriff via Delphi einen "richtigen" Benutzer mit entsprechenden Rechten und Passwort anlegen. Für dieses Beispiel ist dies der "Max" mit dem Passwort "passwort". Wie das geht ist hier zu finden.

   TSQLConnetion 

Als erstes stellt man mittels TSQLConnection eine Verbindung zur MySQL-Datenbank her. Diese lässt sich direkt in der IDE-Umgebung aufbauen und somit testen.
Nachdem man die Komponente auf die Form gezogen hat geht man in den Objektinspektor und gibt folgendes einstellen:

   Driver MySQL

dann Driver über [+] aufklappen und...

   Database Delphi
   HostName localhost
   Password passwort
   UserName Max

Jetzt kann die Verbindung gestartet werden, indem im Obektinspektor "Connect" auf "true" gesetzt wird. Im darauf erscheinendem Login-Fenster brauch das Passwort nicht angegeben werden, da es ja bereits hinterlegt ist. Möchte man das Login-Fenster unterdrücken, so setzt man "LoginPromt" auf "false".

Kommt es beim Setzen von "Connect" auf "true" zu der Fehlermeldung:

DBX Error: Driver could not be properly initialized...
DBX-Fehler: Der Treiber konnte nicht korrekt initialisiert werden...

So liegt das Problem aller Wahrscheinlichkeit nach an der fehlenden oder in der falschen Version vorliegenden "libmySQL.dll" und/oder "dbxmys.dll" (bzw. "dbxmss30.dll" vor D2007). Die "libmySQL.dll" kommt mit der Installation von MS SQL-Connector auf den Rechner. beide DLL's müssen aber auch zueinander kompatibel sein und es war eine ewig andauerndes Rumeiern bis ich es am Laufen hatte. Darum gibt's die DLL's hier mal als Download für XE und auch die "dbxmss30.dll" für Delphi 2007.
Im Internet ist überall zu lesen dass diese in den "Windows/System32" gepflanzt werden sollen, bei mir war es allerdings der Ordner "Windows/System" in die sie rein mussten (Win7 x64). Eventuell ist auch meine Installation verballert, wie auch immer, so funktioniert es jedefalls. 

SQL DLL's (1 MB)
 

Damit sich nicht bereits eine Verbindung zur Datenbank beim Programmstart aufbaut stellt man nun "Connect" wieder auf "´false" und am besten "LoginPromt" auch gleich auf "false". Und weiter geht's mit dem ersten Query via TSQLQuery.



   TSQLQuery 


Nachdem die Komponente auf die Form gezogen ist verlinkt man sie im Objektinspektor bei Connection mit der "SQLConnection1".

Daten schreiben

Mit folgendem Code schreibt man einen neuen Datensatz in die Datenbank: 

  SQLConnection1.Connected := true;

SQLQuery1.SQL.Text := 'INSERT INTO meineTabelle(Straße,Hausnummer) VALUES(:s1, :s2)';
SQLQuery1.ParamByName('s1').Value := 'Hintergasse';
SQLQuery1.ParamByName('s2').Value := '5';
SQLQuery1.ExecSQL;
SQLQuery1.Close;

SQLConnection1.Connected := false;
 


Daten abrufen


Mit folgendem Code filtert man die Datensätze nach "Hausnummer" = "5", sortiert das Ergebnis nach der "id" (bis hier noch alles auf dem Server), holt die Daten ab und schreibt sie z.B. in eine TMemo. 

  var s: String;
.
.
.

SQLConnection1.Connected := true;

SQLQuery1.SQL.Text := 'SELECT * FROM `meinetabelle` WHERE `hausnummer` = :i1';
SQLQuery1.ParamByName('i1').Value := '10';
Memo1.Lines.clear;
SQLQuery1.Open;
while not SQLQuery1.Eof do
  begin
    s := SQLQuery1.FieldByName('id').AsString;
    s := s +' - ' +SQLQuery1.FieldByName('straße').AsString;
    s := s +' - ' +SQLQuery1.FieldByName('hausnummer').AsString;
    Memo1.Lines.Add(s);
    SQLQuery1.next;
  end;
SQLQuery1.Close;

SQLConnection1.Connected := false;
 

 

   TDataSource , TSQLSimpleDataSet und TDBGrid    (Daten Lesen)

Nachdem man alle drei Komponenten auf die Form gezogen hat dann:
- Verlinkt man die DataSource im Objektinspektor bei Connection mit der "SQLConnection1".
- Die SQLSimpleDataSet sollte sich automatisch mit SQLConnection1 und DataSource verbunden haben, bei mir stand bei aber Connection SQLConnection1.InternalDataSet, hier musste ich händisch auf (nur) SQLConnection1 umstellen, also das ".InternalDataSet" wegnehmen.
- Zum Schluss verlinkt man noch die DBGrid bei DataSource mit DataSource1.

Ist das erledigt, dann bei SQLConnetion1 im Objectinspektor "connected" und bei SQLSimpleDataSet1 "Active" auf "true" setzen.
Jetzt ein Doppelklick auf die DBGrid und es öffnet sich folgendes Fenster, in dem man dann auf den Button "Add All Fileds" klickt.

          

DBGrid

Die Felder der Tabelle erscheinen nun im Fenster und auch in der DBGrid. Selektiert man ein Feld, so kann man im Objektinspektor über "Width" die Spaltenbreite anpassen. Bei mir war z.B. die Spalte "Hausnummer" nicht zu sehen, da die Spalte "Straße" viel zu breit vordefiniert war.

Ist das alles abgeschlossen, dann kann bei
SQLConnetion "connected" wieder auf "false" gesetzt werden und ebenfalls SQLSimpleDataSet1 "Active" wieder auf "false".

Nun kann die DBGrid in Laufzeitumgebung mit den aktuellen Daten der Datenbank befüllt werden: 

   SimpleDataSet1.Active := true;  // mit Datenbank verbinden und DBGrid befüllen
 

  SimpleDataSet1.Active := false;  // Verbindung wieder trennen
 

 

   TClientDataSet    (Daten schreiben)

Die in der DBGrid geänderte Daten können mit TClientDataSet zurück in die Datenbank gespielt werden. Die Komponente muss dazu nicht auf die Form gezogen werden, aber "DBClient" sollte dann in die Uses geschrieben werden. Der Aufruf sieht wie folgt aus:

  TClientDataSet(SimpleDataSet1).ApplyUpdates(-1);
 

Bevor man die Daten zurückspielt kann man sich auch die Anzahl der Änderungen ausgeben lassen, das geht so:

  showmessage(IntToStr(TClientDataSet(SimpleDataSet1).ChangeCount));
 

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 30.03.2023]