Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi mySQL-Datenbankzugriff über C-API: mysql_create_db(...) (https://www.delphipraxis.net/15265-mysql-datenbankzugriff-ueber-c-api-mysql_create_db.html)

Steffen 25. Jan 2004 13:15


mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Hallo!

Ich arbeite gerade daran über die C-API und mysql.pas auf meine mySQL-Datenbank zu zugreifen.

es klappt eigentlich auch ganz gut, nur bekomme ich gerade einen komischen Fehler und ich weiß nicht woran es liegt...

Nachdem ich mit mit der Datenbank verbunden habe, möchte ich eine Datenbank erstellen. Eigentlich gibt's in der API die Funktion "mysql_create_db(<name>)" mit der man eine Datenbank anlegen kann. (Intern macht die Funktion nichts anderes, als "CREATE DATABASE + <name>")

Ich habe also folgendes versucht:
Delphi-Quellcode:
uses
  ...
  mySQL;

var
  DataBaseSocket: PMySQL;
  ...
function TDataBaseModule.CreateDatabase(strDatabaseName : String) : Boolean;
begin
  if Connected then
    begin
      Result := True;
      try
        mysql_create_db(DataBaseSocket, PAnsiChar(strDataBaseName)) // Hier entsteht der Fehler!
      except
        Result := False;
        ShowMessage('Fehler bei CreateDataBase!' + mysql_error(DataBaseSocket));
      end
    end
  else
    begin
      ShowMessage('Um eine Datanbankanfrage auszuführen muss eine Verbindung zur Datenbank bestehen!');
      Result := False
    end
end;
Wobei ich einen Speicherzugriffsfehler von Delphi geliefert bekomme.

Wenn ich aber anstatt der Funktion "mysql_create_db()" folgendes mache:
Delphi-Quellcode:
mysql_real_query(DataBaseSocket, PAnsiChar('CREATE DATABASE ' + strDataBaseName),Length('CREATE DATABASE ' + strDataBaseName))
dann funktioniert alles bestens und es wird eine Datenbank angelegt.

Hat jemand damit etwas mehr Erfahrung, als ich und kann mir sagen woran das liegt?

Vielen Dank im Voraus,
Steffen

Chewie 25. Jan 2004 13:35

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Hi Steffen, ich kann dein Problem nicht nachvollziehen. Bei mir funktioniert mysql_create_db tadellos, die Datenbank wird erstellt und ich bekomme auch keine Fehlermeldung.

Die Tatsache, dass es keine MySQL-Fehlermeldung gibt, sondern eine AccessViolation, macht mich etwas stutzig. Access Violations, die ich mir nicht erklären konnte, hatte ich auch ein Mal. Damals hatte ich glaub ich die DLL, die as auf der von dir genannten Homepage gibt. Nachdem ich diese durch die beim MySQL-Server mitgelieferte ersetzt hab, ging alles glatt.

Ein kleiner Hinweis übrigens noch. In der Dokumentation zu der Funktion heißt es:

Zitat:

This function is deprecated. It is preferable to use mysql_query() to issue an SQL CREATE DATABASE statement instead.

Steffen 25. Jan 2004 13:42

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Ich habe mir mal die DLL von http://www.fichtner.net/delphi/mysql.delphi.phtml runtergeladen, aber damit passiter genau das selbe...

Steffen 25. Jan 2004 13:44

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Könntest Du mal das Stück Code posten, mitdem Du eine Datenbank erstellst...?

Chewie 25. Jan 2004 13:52

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Versuch mal das Testprogramm hier:

Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}
uses mysql, windows;


var
  _connector: PMySQL;
  sqlresult: PMySQL_Res;
  sqlrow: PMySQL_Row;
  Host, Login, Password, Query: PChar;
begin
  //Parameter festlegen
  Host := '??';
  Login := ??;
  Password := ??;

  //Zugangskennung initialisieren
  _connector := mysql_init(nil);

  //Verbindung herstellen
  _connector := mysql_real_connect(_connector,Host,Login,Password,nil,3306,nil,0);
  if _connector = nil then
  begin
    WriteLn('Die Verbindung ist fehlgeschlagen');
    Exit;
  end;

  if mysql_create_db(_connector, 'TestDB') <> 0 then
    WriteLn(mysql_error(_connector));

  //Verbindung schließen
  mysql_close(_connector);
  ReadLn;

Das klappt bei mir.

Steffen 25. Jan 2004 13:58

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Ich bekomme den Fehler:

"Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000"...

ist irgendwas nicht initialisiert?

Chewie 25. Jan 2004 14:05

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Das sieht mir so aus, als könnte er den Einstiegspunkt in der DLL nicht finden. Ist sie im richtigen Verzeichnis? Wenn ja, hast du es schonmal mit der DLL probiert, die beim MySQL-Server 3.23x dabei ist?

Steffen 25. Jan 2004 14:08

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Die DLL ist da. ich werde mal die v3.23-DLL runterladen.
Mal sehen, was dann passiert.

Steffen 25. Jan 2004 14:17

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
auch mit der 3.23-DLL passiert nichts anderes...

Irgendwie muss der Fehler woanders liegen...

Steffen 25. Jan 2004 14:20

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Immerhin bekomme ich jetzt keine AccessViolation mehr, sondern es wird der except-Teil ausgeführt...

Chewie 25. Jan 2004 14:20

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Hast du bei meinem Testprojekt die Zugangsdaten durch deine ersetzt?

Steffen 25. Jan 2004 14:20

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
ja, habe ich.

Chewie 25. Jan 2004 14:21

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Wo hast du denn die DLL liegen?

Steffen 25. Jan 2004 14:23

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Sie lieg da, wo auch die Anwendung liegt, beide im gleichen Verzeichnis

Chewie 25. Jan 2004 14:24

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Zitat:

Zitat von Steffen
Immerhin bekomme ich jetzt keine AccessViolation mehr, sondern es wird der except-Teil ausgeführt...

Und welche Fehlermeldung wird ausgegeben?

Steffen 25. Jan 2004 14:26

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Bei dem Code:

Delphi-Quellcode:
uses
  ...
  mySQL;

var
  DataBaseSocket: PMySQL;
  ...
function TDataBaseModule.CreateDatabase(strDatabaseName : String) : Boolean;
begin
  if Connected then
    begin
      Result := True;
      try
        mysql_create_db(DataBaseSocket, PAnsiChar(strDataBaseName)) // Hier entsteht der Fehler! 
      except
        Result := False;
        ShowMessage('Fehler bei CreateDataBase!' + mysql_error(DataBaseSocket));
      end
    end
  else
    begin
      ShowMessage('Um eine Datanbankanfrage auszuführen muss eine Verbindung zur Datenbank bestehen!');
      Result := False
    end
end;
Bekomme ich "Fehler bei CreateDataBase! " (allerding gibt mysql_error(DataBaseSocket) nur '' zurück...)

Chewie 25. Jan 2004 14:29

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Dann überprüf mal den Rückgabewert. Hier findest du eine Auflistng der möglichen Rückgabewerte.

Leider finde ich in der MySQL-Unit keine numerischen Entsprechungen der Konstanten, aber vielleicht hast du in den Original-C-Header mehr Glück.

Steffen 25. Jan 2004 14:36

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Ich habe jetzt folgendes gemacht...

Delphi-Quellcode:
function TDataBaseModule.CreateDatabase(strDatabaseName : String) : Boolean;
begin
  if DataBaseModule.Connected then
    begin
      Result := True;
      try
        //ExecuteQuery('CREATE DATABASE ' + strDataBaseName);
        ShowMessage(IntToStr(mysql_create_db(DataBaseModule.DataBaseSocket, PAnsiChar(strDataBaseName))));
      except
        Result := False;
        ShowMessage('Fehler bei CreateDataBase!' + mysql_error(DataBaseModule.DataBaseSocket));
      end
    end
  else
    begin
      ShowMessage('Um eine Datanbankanfrage auszuführen muss eine Verbindung zur Datenbank bestehen!');
      Result := False
    end
end;
aber ich bekomme keine Meldung... welchen Wert die Funktion mysql_create_db zurückliefert...

Chewie 25. Jan 2004 14:41

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Geh doch im Einzelschrittverfahren durch deinen Code durch, dann siehst du genau, welche Anweisungen ausgeführt werden.

Steffen 25. Jan 2004 14:45

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
mache ich ja, wenn ich beim Befehl mysql_create_db ankomme habe ich wieder 'ne AccessViolation. Deshalt liefert die Funktion auch keinen Integer zurück.

Chewie 25. Jan 2004 14:48

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Tut mir leid, aber jetzt hab ich wirklich keine Idee mehr. Aber du hast gesagt, mit einem CREATE DATABASE-Statement klappt es, dann würde ich es so machen. Schließlich ist es auch das, was die Jungs von MySQL empfehlen.

Steffen 25. Jan 2004 14:50

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Jo, das ist wohl am einfachsten.
Ist halt nur komisch, dass das nicht klappt.

P.S. Vielen Dank für das großartige Tutorial!
Wird es noch weidere Teile geben?

Chewie 25. Jan 2004 14:52

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Zitat:

Zitat von Steffen
P.S. Vielen Dank für das großartige Tutorial!
Wird es noch weidere Teile geben?

Hatte ich eigentlich nicht vor, da es den grundlegenden Umgang mit der API erläutert und die Funktionen, die nicht behandelt werden, genauso gehandhabt werden wie die anderen.
Na ja, das dachte ich zumindest bis du gepostet hast :?

Steffen 25. Jan 2004 15:04

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Verstehen tut man die ganzen Methoden wirklich gut, nur der "Fehler" den ich hier habe ist ja nicht wirklich nachvollziehbar.
Die C-API-Methoden unter Delphi nutzen ist nach dem Tutorial wirklich kein Problem mehr.

Sicherlich wird es auch einige geben, die noch nie C/C++ programmiert haben, die werden jedoch auch noch kurzem überlegen die C-API Beispiele von der mySQL-Webseite verstehen.

Die Frage war eigentlich darauf gerichtet, ob Du noch irgendwelche Tipps für eine schöne Handhabung auf Lager hast.
Wobei ich selber nicht denke, dass noch irgendwelche Tipps nötig sind... Aber man weiß ja nie! ;-)

Chewie 26. Jan 2004 10:36

Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
 
Na ja, ein Tipp von meiner Seite wäre, in einem größeren Programm nicht direkt diese API zu benutzen, da eine reinprozedurale Schnittstelle immer mehr Fehlerquellen bietet als eine klassenbasierte mit wohlüberlgter Kapselung. Aber direkt zur API hab ich keine Tipps mehr.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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