![]() |
Datenbank: mysql • Version: 5.0.51b • Zugriff über: libmysql.dll
Blob auslesen mit libmysql.dll
Ich greife über die libmysql.dll auf meine mysql-Datenbank zu. Über google habe ich schnell eine Möglichkeit gefunden, darüber ein Bild in der Datenbank zu speichern. Das klappt alles wunderbar:
Code:
Aber wie bekomme ich das Bild da wieder raus? Ich habe es unter anderem so versucht:
var
s: AnsiString; query: AnsiString; f: TFileStream; begin f := TFileStream.Create('test.jpg', fmOpenRead + fmShareDenyWrite); try SetLength(s, f.Size); f.ReadBuffer(Pointer(s)^, Length(s)); finally f.Free; end; query := 'insert test set b=' + QuoteString(s); mysql.mysql_real_query(conn, PAnsiChar(query), Length(query)); end;
Code:
Aber das funktioniert nicht. Hat jemand eine Idee, wie man den Blob wieder in eine Datei bekommt?
var
_myRes: PMySQL_Res; query_string: string; Row : PMySQL_Row; Blob: TBlobField; f: TFileStream; begin f := TFileStream.Create('test2.jpg', fmCreate); query_string := 'select b from test;'; mysql_real_query(_myCon, PAnsiChar(query_string), Length(query_string)); _myRes := mysql_store_result(_myCon); Row := mysql_fetch_row(_myRes); f.WriteBuffer(Row[0],length(Row[0])); end; Mike |
AW: Blob auslesen mit libmysql.dll
Mittlerweile bin ich etwas weiter:
Code:
Es wird auch eine Datei erzeugt, die auf dem Byte genau, der Größe des Originals entspricht. Aber die Datei ist beschädigt und das Bild wird nicht angezeigt.
f := TFileStream.Create('image/test.jpeg', fmOpenReadWrite);
mysql_query(_myCon, 'select b from test;'); _myRes := mysql_store_result(_myCon); Row := mysql_fetch_row(_myRes); len := mysql_fetch_lengths(_myRes); f.position = 0; f.WriteBuffer(Row[0],len[0]); Der Hex-Editor verrät, dass am Anfang und Ende der Datei einige Bits hinzugefügt wurden. Hmm, wo kommen die nur her? Mike |
AW: Blob auslesen mit libmysql.dll
Hi,
ich denke, das Quotedstring ist nicht korrekt. Um Blob zu speichern, wandle ich z.Z. den Stream in einen entsprechenden String um. function StreamToBlobStr(const stream: TStream): ansistring; var i: integer; begin Result:='0x';//steht für hex-string for i:=0 to stream.Size-1 do Result:=Result+IntToHex(stream.ReadByte,2); end; Wenn ich jetzt den std. Insert Befehl von Mysql an. Gruß 8-) |
AW: Blob auslesen mit libmysql.dll
Zweite Variante nur über sql
-------------------------------------------------------------------------------- update tabelle set img=LOAD_FILE("c:/bilder/bild1.jpg") where id=1 -------------------------------------------------------------------------------- insert into tabelle (img) values(LOAD_FILE("c:/bilder/bild1.jpg")) -------------------------------------------------------------------------------- select img INTO DUMPFILE "c:/bilder/bild1.jpg" from tabelle where id=1 gruß:-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 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