Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Binärdaten speichern (blob) (https://www.delphipraxis.net/163651-binaerdaten-speichern-blob.html)

DelTurbo 8. Okt 2011 16:28

Datenbank: mysql • Version: 5 • Zugriff über: DirectMySql

Binärdaten speichern (blob)
 
Ich suche schon länger im netz und auch hier im Board, wie man z.b. eine jpg datei übergeben kann. Also Binary daten speichern kann. Kann mir vielleicht jemand sagen wie das geht?

Unter sqlite3 wäre das z.b. DataBase.UpdateBlob bzw. ms:=Table.FieldAsBlob

Danke im voraus

DelTurbo 9. Okt 2011 11:23

AW: Binärdaten speichern (blob)
 
Hi, nachdem keiner geantwortet hat, dachte ich mir, die ist sooo doof das keiner mit reden will. ;)

Ich habe mir das DirectMySql mal angesehen und nach dem wort "blob" gesucht. Es gibt eine Function mit namen EscapeStr. Damit kann man dann ganz "normal" das query aufrufen.

Was ich nicht weiss bzw. gefunden habe ist, wenn ich den datensatz wieder lese, wie kommt er zurück? Als binärdaten? Oder kommt der gleiche String zurück? Wenn ja, wie bekomme ich daraus wieder binärdaten? Dafür habe ich keine Function gefunden.

geskill 9. Okt 2011 12:39

AW: Binärdaten speichern (blob)
 
Es ist eigentlich keine so gute Idee ein ganzes Bild in einer DB abzusichern. Besser wäre es, wenn du das Bild in einem Verzeichnis speicherst, davon den MD5 oder so nimmst und es so benennst. Dann schreibst du in die DB nur den MD5 Wert.

Ansonsten würde ich es so probieren:
Delphi-Quellcode:
var
  StringStream: TStringStream;
begin
  StringStream := TStringStream.Create('');
  with StringStream do
    try
      Position := 0;
      Image1.Picture.Graphic.SaveToStream(StringStream);

      // diesen Wert in die DB speichern: StringStream.DataString
    finally
      Free;
    end;
Wenn du das Bild von einem TFileStream hast funktioniert es genauso. Das Laden einfach umgekehrt mit WriteString(); den Wert aus der DB in den TStringStream schreiben und dann den Stream in das Image oder eben den Filestream speichern.

DeddyH 9. Okt 2011 12:42

AW: Binärdaten speichern (blob)
 
Zitat:

Zitat von geskill (Beitrag 1129450)
Es ist eigentlich keine so gute Idee ein ganzes Bild in einer DB abzusichern. Besser wäre es, wenn du das Bild in einem Verzeichnis speicherst, davon den MD5 oder so nimmst und es so benennst.

Das ist jetzt aber ein bisschen sehr verallgemeinert, oder? Beide Vorgehensweisen haben ihre Vor- und Nachteile, so dass es von der fallspezifischen Anforderung abhängt, welcher man nun den Vorzug geben sollte.

[edit] Achja, als escapeter String sollte das wie beschrieben funktionieren. Nach dem Auslesen sollte man mit UnescapeStr wieder an die ursprünglichen Daten gelangen. [/edit]

DelTurbo 9. Okt 2011 12:59

AW: Binärdaten speichern (blob)
 
Zitat:

Zitat von DeddyH (Beitrag 1129451)
[edit] Achja, als escapeter String sollte das wie beschrieben funktionieren. Nach dem Auslesen sollte man mit UnescapeStr wieder an die ursprünglichen Daten gelangen. [/edit]

Leider finde ich dazu nix. Hast du noch eine idee wonach ich suchen könnte?

DelTurbo 10. Okt 2011 14:04

AW: Binärdaten speichern (blob)
 
Ich habs mir grade selber gemacht. (Wer nun an was anderes denk, ist ein Ferkel :-D )
Falls es mal jemand braucht...

Delphi-Quellcode:
{------------------------------------------------------------------------------
  function UnEscapeStr(aString:String;var ms:TMemoryStream):Integer - 10.10.2011 14:50
   Convertiert einen EscString in einen MemoryStream zurueck
------------------------------------------------------------------------------}
function UnEscapeStr(aString:String;var ms:TMemoryStream):Integer;
var
   i       :Integer;
   line   :String;
   pc      :PChar;
begin
      Result:=0;
      i:=1;
      line:='';
      while ( i<Length(aString) ) do begin
         if ( aString[i]='\' ) then begin
            inc(i);
         case aString[i] of
           't': line:=line+#9;
           'n': line:=line+#10;
           'r': line:=line+#13;
           '0': line:=line+#0;
         else
           line:=line+aString[i];
         end;
         end else begin
            line:=line+aString[i];
         end;
         inc(i);
      end;
     pc:=PChar(line);
     ms.write(pc^,Length(line));
      Result:=ms.Size;
end; {function UnEscapeStr(aString:String;var ms:TMemoryStream):Integer}

DeddyH 10. Okt 2011 14:11

AW: Binärdaten speichern (blob)
 
Du solltest aber den Funktionskopf noch etwas ändern:
Delphi-Quellcode:
function UnEscapeStr(const aString:String; ms:TMemoryStream):Integer;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 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