![]() |
mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Server
Hallo alle zusammen!
Ich schlage mich immer noch mit dem Zugriff auf Datenbanken herum und will nun erstmal zurück zu dem, was ich auf DB-Seite kann: nämlich MySQL. Für meine Zwecke ist wäre ein embedded SQL-Server ideal, dafür habe ich die ![]() Dementsprechend habe ich den folgenden Code zur Verwendung mit Delphi 7 und der libmysqld.dll aus MySQL 4.0.21 zusammengebaut:
Delphi-Quellcode:
Die Funktion mysql_error(_db) liefert "Unknown MySQL error" und die mysql_errno(_db) "2000" zurück - mit beidem kann ich nichts anfangen.
var
_db: PMySQL; dbhost, dbuser, dbpass, dbname: PChar; begin // die verschiedenen Einstellungen: dbhost := 'localhost'; dbuser := 'root'; dbpass := nil; dbname := nil; // Initialisierung der DB-Verbindung _db := mysql_init(nil); if (_db = nil) then begin ShowMessage('Verbindung konnte nicht initialisiert werden!'); Exit; end; // Datenbank-Verbindung aufbauen: if (mysql_real_connect(_db, dbhost, dbuser, dbpass, dbname, 3306, nil, 0) = nil) then begin ShowMessage('Konnte keine Verbindung zur Datenbank herstellen!' + #10#13 + 'Fehlerbeschreibung: ' + mysql_error(_db) + #10#13 + 'MySQL-Fehlercode: ' + IntToStr(mysql_errno(_db))); Close; Exit; end; end; Vielleicht liegt es an der Version der dll-Datei? Oder muss ich irgendwo angeben, wo die Datenbank im lokalen System gespeichert werden soll? Für Antworten, Ideen, Anregungen bin ich immer zu haben! Danke für eure Tipps! Mamphil EDIT: Als offene Frage markiert. |
Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se
Hi!
Dann werde ich mir mal selbst antworten: Der Fehler kam daher, dass der embedded Datenbank-Server noch nicht initialisiert war. Das geht übrigens per:
Delphi-Quellcode:
Nur der Vollständigkeit halber sei das folgende erwähnt:
var
pf : string; erg : integer; begin pf := ExtractFilePath(application.exename); pf := copy(pf,1,length(pf) -1); argv[0] := pchar(''); argv[1] := pchar('--basedir='+pf); argv[2] := pchar('--datadir='+pf+'\mydata'); argv[3] := pchar('--language='+pf); argv[4] := pchar('--skip-innodb'); //no innodb with embedded version erg := mysql_server_init(5,@argv,nil); if erg <> 0 then begin Showmessage('Can not initiate mysql-server'); end else Showmessage('Server successfull initiated!'); end; Wenn beim initialisieren des Servers die Anwendung ohne einen Mucks abstürzt bzw. sich beendet, findet man im Verzeichnis unter datadir angegebenen Verzeichnis (im Beispiel der Ordner "mydata" innerhalb des Projektverzeichnisses) eine <computername>.err-Datei, die ein paar hilfreiche Fehlermeldungen enthält. Ich bin noch über zwei weitere Hürden gestolpert: Natürlich müssen (wie in der readme.txt der mysqld_s.pas beschrieben) die Dateien libmySQLd.dll, errmsg.sys und errmsg.txt im Projektverzeichnis vorhanden sein (die mysqld_s.pas natürlich auch!). Diese Dateien bekommt man aus dem MySQL-Windows-Paket (das ohne Installer genügt). Die errmsg.*-Dateien finden sich zum Beispiel im Verzeichnis mysql-*.*.*-win\share\english und die dll-Datei in mysql-*.*.*-win\Embedded\DLL\release . Bei den Beispielen sind zwar schon die errmsg-Dateien dabei, selbige müssen aber zwingend ersetzt werden, da es sonst Versionskonflikte mit der DLL-Datei geben (kann), die auch nur in der .err-Datei als Fehlerquellen genannt werden. Und dann klappt's auch mit dem embedded Server. Nur zum Schluss sollte noch per mysql_server_end; der embedded Server beendet werden. (Ein letzter Tipp: das Tutorial ![]() Mamphil |
Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se
Hi Mamphil,
wie hast du denn Datenbanken und Tabellen bei einem embedded MySQL-Server erstellt. Gruß Marcus |
Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se
Hi Marcus!
Zitat:
Delphi-Quellcode:
Mamphil
sql := 'CREATE DATABASE kleinerTest';
mysql_real_query(_db, sql, Length(sql)); |
Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se
Ich habe es fast befürchtet, schade!
Momentan bin ich mir noch nicht sicher welche Datenbank ich für meine Anwendung verwenden soll. Firebird embedded oder MySQL embedded. Bei Firebird ist das mit den Transactions für mich fast schon zu umfangreich für eine Desktopdatenbank. Vielleicht tut sich ja noch was in der Richtung. Marcus |
Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se
Hi!
Ich habe vor, MySQL zu verwenden. Bei der Entwicklung werde ich nen lokal laufenden MySQL-Server + Webserver (also ein WAMP = Windows Apache MySQL PHP) laufen haben, über das ich per phpMyAdmin auf die DB zugreifen kann. Die fertige Anwendung soll dann im embedded Server laufen... Mamphil |
Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se
Also bei mir funktioniert das Erstellen einer Datenbank mit Hilfe des API's mysql_s.pas nicht. Wenn ich das per SQL
Befehl mache
Delphi-Quellcode:
liefert mir die funktion mysql_real_query -1 zurück, was glaube ich soviel heißt wie - is nich.
sql := 'create database test;';
showmessage(inttostr(mysql_real_query(mysql,sql,length(sql)))); Mit der Funktion
Delphi-Quellcode:
stürzt das ganze Programm mit einer Zugriffsverletzung im Modul libmysqld.dll ab.
mysql_create_DB(mysql,pchar(DBNAME))
Das mitgelieferte Testprogramm bei dem API mysql_s.pas verwendet genau diese Funktion. Also sollte es eigentlich funktionieren, aber irgendwas stimmt da nicht mit der libmysqld.dll. Gruß Marcus |
Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se
Hi Marcus!
Zitat:
Delphi-Quellcode:
)
argv[2] := pchar('--datadir='+pf+'\mydata');
Wenn dort eine neue Datei / ein neues Verzeichnis entsteht, sollte die Datenbank angelegt sein. Außerdem probier mal nach dem mysql_real_query(...) folgendes:
Delphi-Quellcode:
Mamphil
ShowMessage('Fehlerbeschreibung: '
+ mysql_error(_db) + #10#13'MySQL-Fehlercode: ' + IntToStr(mysql_errno(_db))); |
Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se
:oops:
Ich stelle mich virtuellen Sündenpfahl. Man sollte natürlich auch darauf achten, dass das angegebene Verzeichnis existiert. Ich bin bis jetzt davon ausgegegangen, dass es ggf. erstellt wird falls es nicht existiert. Naja manchmal sollte man einfach nicht zu viel und zu kompliziert denken. Auf jeden Fall, es funktioniert ohne Probleme und ich überlege mir ob ich mir ein kleines Administrationstool dazu schreibe. Oder hat vielleicht jemand schon eins?? Schau mer mal! Vielen Dank Mamphil für deine Bemühungen und ich werde mich jetzt auf der Stelle in die Ecke stellen, wegen so einem Dilettantenfehler. Gruß Marcus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz