Delphi-PRAXiS
Seite 31 von 36   « Erste     21293031 3233     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi MySQL ohne Komponenten (https://www.delphipraxis.net/6543-mysql-ohne-komponenten.html)

samso 28. Okt 2009 06:05

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").

xFrankx 28. Okt 2009 10:41

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

samso 28. Okt 2009 21:08

Re: MySQL ohne Komponenten
 
Ich habe ein neues Thema angelegt:

Binäre Daten in Blob speichern

mrbrown 13. Nov 2009 07:38

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:
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;
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.
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

samso 13. Nov 2009 10:01

Re: MySQL ohne Komponenten
 
Zunächst mal finde ich die Sequenz
Delphi-Quellcode:
ini.Readstring('Server','Datenabnk','')
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".
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;

DeddyH 13. Nov 2009 10:06

Re: MySQL ohne Komponenten
 
Zitat:

SQL-Code:
INSERT INTO testtable(titel, datum , von, bis, text) VALUES (titel, datum, von, bis, text)

Was soll denn da eingetragen werden? So wie es da steht wird es jedenfalls nicht funktionieren.

[edit] Damit klar wird, was ich meine:
SQL-Code:
INSERT INTO testtable(titel, datum , von, bis, text) VALUES ('Hallo Welt', '2009-11-10', '2009-11-09', '2009-11-12', 'Dideldum')
Wobei man das Datum dann wohl besser auch als Datum(TDate) übergibt. [/edit]

samso 13. Nov 2009 11:08

Re: MySQL ohne Komponenten
 
Ich gehe ja wohl auch davon aus, daß
SQL-Code:
INSERT INTO testtable(titel, datum , von, bis, text) VALUES (titel, datum, von, bis, text);
eher symbolisch gemeint war, oder? Wenn nicht, dann gibt es ja nun auch eine Fehlermeldung!

DeddyH 13. Nov 2009 11:22

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)?

mrbrown 13. Nov 2009 13:19

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.

samso 13. Nov 2009 14:04

Re: MySQL ohne Komponenten
 
Dann vielleicht etwa so:
Delphi-Quellcode:
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;
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)
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.
Seite 31 von 36   « Erste     21293031 3233     Letzte »    

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