![]() |
mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Hallo!
Ich arbeite gerade daran über die C-API und ![]() 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:
Wobei ich einen Speicherzugriffsfehler von Delphi geliefert bekomme.
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; Wenn ich aber anstatt der Funktion "mysql_create_db()" folgendes mache:
Delphi-Quellcode:
dann funktioniert alles bestens und es wird eine Datenbank angelegt.
mysql_real_query(DataBaseSocket, PAnsiChar('CREATE DATABASE ' + strDataBaseName),Length('CREATE DATABASE ' + strDataBaseName))
Hat jemand damit etwas mehr Erfahrung, als ich und kann mir sagen woran das liegt? Vielen Dank im Voraus, Steffen |
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:
|
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Ich habe mir mal die DLL von
![]() |
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Könntest Du mal das Stück Code posten, mitdem Du eine Datenbank erstellst...?
|
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. |
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? |
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?
|
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. |
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
auch mit der 3.23-DLL passiert nichts anderes...
Irgendwie muss der Fehler woanders liegen... |
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Immerhin bekomme ich jetzt keine AccessViolation mehr, sondern es wird der except-Teil ausgeführt...
|
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Hast du bei meinem Testprojekt die Zugangsdaten durch deine ersetzt?
|
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
ja, habe ich.
|
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Wo hast du denn die DLL liegen?
|
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Sie lieg da, wo auch die Anwendung liegt, beide im gleichen Verzeichnis
|
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Zitat:
|
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Bei dem Code:
Delphi-Quellcode:
Bekomme ich "Fehler bei CreateDataBase! " (allerding gibt mysql_error(DataBaseSocket) nur '' zurück...)
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; |
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Dann überprüf mal den Rückgabewert.
![]() Leider finde ich in der MySQL-Unit keine numerischen Entsprechungen der Konstanten, aber vielleicht hast du in den Original-C-Header mehr Glück. |
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Ich habe jetzt folgendes gemacht...
Delphi-Quellcode:
aber ich bekomme keine Meldung... welchen Wert die Funktion mysql_create_db zurückliefert...
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; |
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.
|
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.
|
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.
|
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? |
Re: mySQL-Datenbankzugriff über C-API: mysql_create_db(...)
Zitat:
Na ja, das dachte ich zumindest bis du gepostet hast :? |
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! ;-) |
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