Zugriff auf MySQL mit der MySQL-C-API
Fast jeder, der schon mit PHP gearbeitet hat, kennt wohl den Datenbankserver
MySQl, und die meisten von euch werden wohl auch schon von PHP aus damit gearbeitet haben.
Während das mit PHP sehr einfach und unkompliziert ist, erscheint es mit Delphi am Anfang recht kompliziert. Gerade wenn man noch keine Datenbankerfahrungen mit Delphi verbuchen kann, erscheint die Benutzung der Zeos-Komponenten oder auch der
ODBC-Schnittstelle aufwändig und kompliziert. Ganz zu schweigen von der Tatsache, dass Komponenten, die von Zeos benötigt werden, bei den Standard- und Personal-Versionen von Delphi nicht dabei sind.
Was liegt also näher, als auf diese Komponenten zu verzichten und eine Alternative zu suchen? Besonders, wenn man bereits mit PHP und
MySQL gearbeitet hat, dürfte man sehr gut mit der hier vorgestellten Methode zurechtkommen.
Das Tutorial handelt davon, wie man die C-
API von
MySQL in Delphi einsetzt. Ja, ihr habt richtig gelesen,
C-
API, so heißt es auf der
MySQL-Website. Nichtsdestotrotz kann man diese
API (=
Application
Programming
Interface) natürlich auch mit Delphi verwenden.
Anmerkung:
SQL-Kenntnisse werden hier nicht vermittelt. Die sind Voraussetzung zum Begreifen dieses Tutorials.
Dafür notwendig sind in erster Linie einmal die Pascal-Übersetzungen der C-Header für die
MySQL-Bibliothek (und natürlich die Bibliothek selbst). Die Header findet man unter
http://www.audio-data.de/mysql.html, die Bibliothek libmysql.dll ist bei dem
MySQL-Server dabei.
Die Pascal-
Unit mysql.pas importiert die Funktionen von libmysql.dll und stellt sie Programmmierern zur Verfügung. Um auf die
DLL zugreifen zu können, muss sie entweder im Programmverzeichnis liegen oder aber im Verzeichnis Windows, Windows\System oder Windows\System32.
Nachdem das getan ist, können wir die
DLL verwenden. Dazu muss die
Unit mysql.pas in unser Projektverzeichnis gelegt werden und per uses-Klausel eingebunden werden. Unsere
Unit sieht also so aus:
Code:
unit MysqlTest;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, [b]
mySQL[/b];
{ ... }
Bevor wir anfangen, mit dem
SQL-Server zu arbeiten, kommen einige kleine Anmerkungen.
Eine Übersicht und Dokumentation der Funktion ist auf
http://www.mysql.com/documentation/m...ction_overview verfügbar.
Von diesen werden in diesem Tutorial aber nur folgende verwendet:
mysql_close()
mysql_error()
mysql_fetch_row()
mysql_free_result()
mysql_init()
mysql_real_connect()
mysql_real_query()
mysql_store_result()
Die Verwendung der übrigen Funktionen sollte aber kaum Mühe bereiten, schon gar nicht, wenn man sie aus PHP kennt, da, wie man an der Auflistung sehen kann, die C-
API und die PHP-
API recht ähnlich sind.
Neben den Funktionen werden noch folgende Datentypen, die in
mysql.pas definiert sind, benutzt:
PMySQL
PMySQL_Res
PMySQL_Rows
So, es kann nun losgehen.
Im nachfolgenden Beispiel werden wir uns zu einem
MySQL-Server verbinden und ihn nach dem aktuellen Datum fragen.
Die einzelnen Schritte werden zunächst erläutert, bevor anschließend ein kurzes Code-Beispiel erklärt wird.
Bevor wir überhaupt eine Verbindung herstellen können, müssen wir unseren Verbindungsdeskriptor initialisieren. Dieser ist vom Typ
PMySQL.
Ist dies getan, können wir die Verbindung herstellen.Dafür wird
mysql_real_connect() benutzt.
mysql_real_connect() ist folgendermaßen augebaut:
mysql_real_connect: function(_mysql: PMYSQL; const host, user, passwd, db: pChar; port: longword; const unix_socket: pChar; clientflag: longword): PMYSQL; stdcall;
Die Erklärung der einzelnen Parameter findet sich auf
http://www.mysql.com/documentation/m...l_real_connect.
Als Rückgabe erhalten wir erneut unseren Verbindungsdeskriptor, der jetzt (hoffentlich) eine aktive Verbindung beschreibt.
Dies ist der Fall, wenn er ungleich
nil ist.
Mit den eigentlichen Transaktionen beschäftigen wir uns im nächsten Kapitel, deshalb wird jetzt lediglich die Verbindung getrennt.
Das geschieht mittels mysql_close().
Das Beispiel:
Delphi-Quellcode:
var
_myCon: PMySQL;
//unseren Verbindungsdeskriptor
host, user, pass,
db: PChar;
//die Anmeldedaten
begin
//wir werden uns als Root-Benutzer in localhost einloggen, ohne eine
//bestimmte Datenbank auszuwählen
host := '
localhost';
user := '
root';
pass :=
nil;
db :=
nil;
//jetzt wird _myCon initialisiert
_myCon := mysql_init(
nil);
if _myCon =
nil then
begin
ShowMessage('
Nicht genug freier Speicher, um Verbindungsdeskriptor zu initialisieren');
Exit;
end;
//anschließend wird die Verbindung hergestellt
if mysql_real_connect(_myCon, host, user, pass,
db, 3306,
nil, 0) =
nil then
begin
ShowMessage('
Die Verbindung konnte nicht hergestellt werden. Ursache: ' + mysql_error(_myCon));
Exit;
end;
ShowMessage('
Verbindung hergestellt');
//zum Schluss wird die Verbindung wieder geschlossen
mysql_close(_myCon);
end;
Im nächsten Teil werden wir ein paar einfache SELECT, INSERT, UPDATE und DELETE-Transmissionen durchführen.
[edit=Matze]Link korrigiert. MfG, Matze[/edit]