Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Blob auslesen mit libmysql.dll (https://www.delphipraxis.net/159610-blob-auslesen-mit-libmysql-dll.html)

campula 5. Apr 2011 12:09

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:
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;
Aber wie bekomme ich das Bild da wieder raus? Ich habe es unter anderem so versucht:

Code:
  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;
Aber das funktioniert nicht. Hat jemand eine Idee, wie man den Blob wieder in eine Datei bekommt?

Mike

campula 5. Apr 2011 23:06

AW: Blob auslesen mit libmysql.dll
 
Mittlerweile bin ich etwas weiter:
Code:
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]);
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.
Der Hex-Editor verrät, dass am Anfang und Ende der Datei einige Bits hinzugefügt wurden. Hmm, wo kommen die nur her?

Mike

dirki 14. Apr 2011 09:18

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

dirki 14. Apr 2011 15:20

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 20:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz