AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Blob auslesen mit libmysql.dll
Thema durchsuchen
Ansicht
Themen-Optionen

Blob auslesen mit libmysql.dll

Ein Thema von campula · begonnen am 5. Apr 2011 · letzter Beitrag vom 14. Apr 2011
Antwort Antwort
campula

Registriert seit: 17. Jan 2011
6 Beiträge
 
#1

Blob auslesen mit libmysql.dll

  Alt 5. Apr 2011, 12:09
Datenbank: mysql • Version: 5.0.51b • Zugriff über: 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
  Mit Zitat antworten Zitat
campula

Registriert seit: 17. Jan 2011
6 Beiträge
 
#2

AW: Blob auslesen mit libmysql.dll

  Alt 5. Apr 2011, 23:06
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

Geändert von campula ( 5. Apr 2011 um 23:17 Uhr)
  Mit Zitat antworten Zitat
dirki

Registriert seit: 14. Apr 2011
3 Beiträge
 
#3

AW: Blob auslesen mit libmysql.dll

  Alt 14. Apr 2011, 09:18
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ß
  Mit Zitat antworten Zitat
dirki

Registriert seit: 14. Apr 2011
3 Beiträge
 
#4

AW: Blob auslesen mit libmysql.dll

  Alt 14. Apr 2011, 15:20
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ß
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:54 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