![]() |
Re: MySQL ohne Komponenten
Binäre Daten werden an die Bibliothek genauso übergeben wie alle anderen Daten. Man speichert das Bild (oder andere binäre Daten) in dem man diese
1) zunächst in einen AnsiString überträgt, 2) dann mit der Funktion QuoteString die Anführungszeichen hinzufügt 3) und diesen AnsiString zu dem SQL-Statement hinzufügt. Die eventuell vorkommendenden #0-Char sind deshalb kein Problem, weil an die Funktion "mysql_real_query" die Länge des Strings (oder besser eigentlich das array of Byte) übergeben wird. Die Library braucht also nicht nach einem abschließenden #0-Char zu suchen um die Länge des Strings zu ermitteln (im Unterschied zur veralteten Funktion "mysql_query"). |
Re: MySQL ohne Komponenten
samo ich Danke dir für deine Antwort.
Frage ? hättest du ein Demo oder noch etwas mehr Infos wie ich das machen könnte ? Gruß Frank |
Re: MySQL ohne Komponenten
|
Re: MySQL ohne Komponenten
Hu,
kann mir wer bezüglich eines kleinen Problems helfen? Nutze die MySQL Verbindung wie im ersten Post erklärt mit der neuen .pas datei. Folgdener Code:
Delphi-Quellcode:
Wie man sieht soll eine MySQL Verbindung aufgebaut werden. In die Datenbank sollen dann 4 Werte (titel, datum, von, bis) sowie eine ID (Autoincrement, muss also nicht übergeben werden) eigetragen werden.
procedure TForm4.Button1Click(Sender: TObject);
var _myCon: PMySQL; //unseren Verbindungsdeskriptor host, user, pass, db: PChar; //die Anmeldedaten query: PChar; titel, datum, von, bis, test :string; begin titel := Edit1.text; von := Edit2.Text; bis := Edit3.Text; test := RichEdit1.Text; libmysql_load(nil); ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+ 'konfig.ini'); //wir werden uns als Root-Benutzer in localhost einloggen, ohne eine //bestimmte Datenbank auszuwählen host := Pchar(ini.Readstring('Server','ServerIp','')); user := Pchar(ini.Readstring('Server','Username','')); pass := Pchar(ini.Readstring('Server','Passwort','')); db := Pchar(ini.Readstring('Server','Datenabnk','')); //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; mysql_select_db(_myCon, Pchar(ini.Readstring('Server','Datenbank',''))); //zu Datenbank wechseln mysql_real_query(_myCon, 'INSERT INTO testtable(titel, datum , von, bis, text) VALUES (titel, datum, von, bis, text)', Length(query)); //zum Schluss wird die Verbindung wieder geschlossen mysql_close(_myCon); close; end; Problem ist, dass nichts übergeben wird. Ebenso bin ich mir nicht mal sicher ob er überhaupt die DB auswählt. Könnte mir da ml wer helfen? Gruß MrBrown |
Re: MySQL ohne Komponenten
Zunächst mal finde ich die Sequenz
Delphi-Quellcode:
verdächtig. Hier müßte es ja wohl 'Datenbank' heißen. Außerdem sollten alle PChar in PAnsiChar geändert werden, um halbwegs die Kompatibilität zu Delphi2009 herzustellen. Sie schreiben "Problem ist, dass nichts übergeben wird". Hmm, soll vermutlich soviel heißen, wie "Der Eintrag wird nicht vorgenommen, aber ich erhalte auch keine Fehlermeldung".
ini.Readstring('Server','Datenabnk','')
Ich würde sagen, das liegt an der nicht initialisierten Variable "query". Richtig müßte es heißen:
Delphi-Quellcode:
var
query: AnsiString; begin ... query := 'INSERT INTO testtable(titel, datum , von, bis, text) VALUES (titel, datum, von, bis, text)'; if mysql_real_query(_myCon, PAnsiChar(query), Length(query))<>0 then raise Exception.Create('Schon wieder was falsch - ' + mysql_error(_myCon)); ... end; |
Re: MySQL ohne Komponenten
Zitat:
[edit] Damit klar wird, was ich meine:
SQL-Code:
Wobei man das Datum dann wohl besser auch als Datum(TDate) übergibt. [/edit]
INSERT INTO testtable(titel, datum , von, bis, text) VALUES ('Hallo Welt', '2009-11-10', '2009-11-09', '2009-11-12', 'Dideldum')
|
Re: MySQL ohne Komponenten
Ich gehe ja wohl auch davon aus, daß
SQL-Code:
eher symbolisch gemeint war, oder? Wenn nicht, dann gibt es ja nun auch eine Fehlermeldung!
INSERT INTO testtable(titel, datum , von, bis, text) VALUES (titel, datum, von, bis, text);
|
Re: MySQL ohne Komponenten
Davon gehe ich eben nicht aus, wozu sollte jemand eine einigermaßen umfangreichen Quelltext posten und an dieser Stelle plötzlich symbolische Werte eintragen (bei Passwörtern etc. macht das ja noch Sinn, aber hier)?
|
Re: MySQL ohne Komponenten
nein es sollte keine symbolischen werte sein sondern an dieser stelle sollten die variablen die mit den edits gefpüllt werden, an mysql weitergegeben werden.
|
Re: MySQL ohne Komponenten
Dann vielleicht etwa so:
Delphi-Quellcode:
Das setzt allerdings voraus, daß in "datum", "von" und "bis" das Datum bereits im korrekten Foramt vorliegt. Ist das nicht der Fall, muss der Datumsstring vorher noch in das richtige Format gebracht werden (yyyy-mm-dd oder yyyymmdd)
var
query: AnsiString; begin ... query := 'INSERT INTO testtable(titel, datum , von, bis, text) VALUES (' + QuoteString(titel) + ',' + QuoteString(datum) + ',' + QuoteString(von) + ',' + QuoteString(bis) + ',' + QuoteString(text) + ')'; if mysql_real_query(_myCon, PAnsiChar(query), Length(query))<>0 then raise Exception.Create('Schon wieder was falsch - ' + mysql_error(_myCon)); ... end; N.B. Falls Delphi2009 eingesetzt wird, muss noch die ein oder andere Stringkonvertierung hinzugefügt werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 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