Autor Téma: Blob - read/write z Firebirdu cez FireDAC  (Přečteno 1632 krát)

Offline František

  • Hrdina
  • ****
  • Příspěvků: 492
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Blob - read/write z Firebirdu cez FireDAC
« kdy: 12-06-2018, 22:35:49 »
takto čítam
Kód: [Vybrat]
  function GetBlobText(SQLQ:TFDQuery; bField:string ):string;
  var
    bs: TMemoryStream;
    sl: TStringList;
  begin
    sl := TStringList.Create;
    bs := TMemoryStream.Create;
    try
      TBlobField(SQLQ.FieldByName(bField)).SaveToStream(bs);
      bs.Position := 0;
      if bs.Size > 0
        then begin
                sl.LoadFromStream(bs);
                result := sl.Text;
        end
        else result := '';

    finally
      bS.Free;
      sl.Free;
    end;
  end;

a takto zapisujem
Kód: [Vybrat]
procedure SetBlobText(trQuery:TFDQuery; text:string );
var
    msp: TMemoryStream;
    pSL: TStringList;
    trQuery: TFDQuery;
begin
        msp := TMemoryStream.Create();
        pSL := TStringList.create;
        pSL.Text := text;
        pSL.SaveToStream(msp);
        try
          trQuery.sql.DefaultEncoding := System.SysUtils.TEncoding.UTF8;
          trQuery.SQL.Clear;
          trQuery.SQL.Add('UPDATE XXX SET ');
          trQuery.SQL.Add('POZITIV = :POZITIV ');
          trQuery.SQL.Add('WHERE IDT = 1');
          trQuery.ParamByName('POZITIV').SetBlobRawData(msp.Size,msp.Memory);
          trQuery.ExecSQL;
        finally
             pSL.Free;
             msp.Free;
        end;
end;
v podstate to funguje, ale bol som upozornený, že existuje niečo elegantnejšie
(pre XE5)
ak máte nejaké vylepšenie, sem s ním,
vďaka aj za iných

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 195
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Blob - read/write z Firebirdu cez FireDAC
« Odpověď #1 kdy: 13-06-2018, 08:05:47 »
Toto teď používám k plné spokojenosti v XE6, v XE5 to snad pojede taky. Přenáším obsah blobu z jedné tabulky do jiné tabulky:
Kód: Delphi [Vybrat]
  1. var
  2.   Pozn: TStream;
  3.  
  4. if not FDQuery1.FieldByName('PAR_BLOB').IsNull then
  5. begin
  6.   Pozn := FDQuery1.CreateBlobStream(FDQuery1.FieldByName('PAR_BLOB'), bmRead);
  7.   Pozn.Position := 0;
  8.   FDQuery2.ParamByName('BLOB_CIL').LoadFromStream(Pozn, ftBlob);
  9.   Pozn.Free;
  10. end;
  11.