AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Server

mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Server

Ein Thema von Mamphil · begonnen am 16. Sep 2004 · letzter Beitrag vom 29. Sep 2004
Antwort Antwort
Benutzerbild von Mamphil
Mamphil

Registriert seit: 17. Jul 2004
Ort: Garching b. München
149 Beiträge
 
Delphi 7 Professional
 
#1

mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Server

  Alt 16. Sep 2004, 14:52
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 mysqld_s.pas gefunden und mir das Beispiel angeguckt.

Dementsprechend habe ich den folgenden Code zur Verwendung mit Delphi 7 und der libmysqld.dll aus MySQL 4.0.21 zusammengebaut:
Delphi-Quellcode:
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;
Die Funktion mysql_error(_db) liefert "Unknown MySQL error" und die mysql_errno(_db) "2000" zurück - mit beidem kann ich nichts anfangen.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Mamphil
Mamphil

Registriert seit: 17. Jul 2004
Ort: Garching b. München
149 Beiträge
 
Delphi 7 Professional
 
#2

Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se

  Alt 16. Sep 2004, 19:33
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:
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;
Nur der Vollständigkeit halber sei das folgende erwähnt:

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 MySQL ohne Komponenten erklärt, wie per mysql.pas auf einen MySQL-Server zugegriffen wird, der nicht embedded ist. Die Vorgehensweise ist bei der mysqld_s.pas aber mit der bei der mysql.pas identisch, bis auf das oben genannten mysql_server_init(...)

Mamphil
  Mit Zitat antworten Zitat
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#3

Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se

  Alt 28. Sep 2004, 10:55
Hi Mamphil,

wie hast du denn Datenbanken und Tabellen bei einem embedded MySQL-Server erstellt.

Gruß
Marcus
  Mit Zitat antworten Zitat
Benutzerbild von Mamphil
Mamphil

Registriert seit: 17. Jul 2004
Ort: Garching b. München
149 Beiträge
 
Delphi 7 Professional
 
#4

Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se

  Alt 28. Sep 2004, 12:54
Hi Marcus!
Zitat von marcus:
wie hast du denn Datenbanken und Tabellen bei einem embedded MySQL-Server erstellt.
Für den embedded MySQL-Server kenne ich (noch) keine Administrationsoberfläche wie zum Beispiel phpMyAdmin für MySQL-Datenbanken bei Webservern. Daher habe ich die Datenbanken und Tabellen mit ganz normalem MySQL-Code erstellt:
Delphi-Quellcode:
  sql := 'CREATE DATABASE kleinerTest';
  mysql_real_query(_db, sql, Length(sql));
Mamphil
  Mit Zitat antworten Zitat
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#5

Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se

  Alt 28. Sep 2004, 13:34
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
  Mit Zitat antworten Zitat
Benutzerbild von Mamphil
Mamphil

Registriert seit: 17. Jul 2004
Ort: Garching b. München
149 Beiträge
 
Delphi 7 Professional
 
#6

Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se

  Alt 28. Sep 2004, 13:54
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
  Mit Zitat antworten Zitat
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#7

Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se

  Alt 28. Sep 2004, 19:17
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:
    sql := 'create database test;';
    showmessage(inttostr(mysql_real_query(mysql,sql,length(sql))));
liefert mir die funktion mysql_real_query -1 zurück, was glaube ich soviel heißt wie - is nich.

Mit der Funktion
mysql_create_DB(mysql,pchar(DBNAME)) stürzt das ganze Programm mit einer Zugriffsverletzung im Modul libmysqld.dll ab.
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
  Mit Zitat antworten Zitat
Benutzerbild von Mamphil
Mamphil

Registriert seit: 17. Jul 2004
Ort: Garching b. München
149 Beiträge
 
Delphi 7 Professional
 
#8

Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se

  Alt 28. Sep 2004, 20:42
Hi Marcus!
Zitat von marcus:
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:
    sql := 'create database test;';
    showmessage(inttostr(mysql_real_query(mysql,sql,length(sql))));
liefert mir die funktion mysql_real_query -1 zurück, was glaube ich soviel heißt wie - is nich.
Guck mal in deinem DB-Ordner nach. (Vgl. 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:
  ShowMessage('Fehlerbeschreibung: '
             + mysql_error(_db)
             + #10#13'MySQL-Fehlercode: '
             + IntToStr(mysql_errno(_db)));
Mamphil
  Mit Zitat antworten Zitat
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#9

Re: mysqld_s.pas : Datenbankverbindung zum embedded MySQL-Se

  Alt 29. Sep 2004, 09:56

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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz