Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Speichern Image als Blob-Field (https://www.delphipraxis.net/204649-speichern-image-als-blob-field.html)

jangbu 15. Jun 2020 19:35

Datenbank: MSSQL • Version: 2016 • Zugriff über: SDAC

Speichern Image als Blob-Field
 
Hallo,

ich versuche mit Delphi 10.3.3. FMX Images (Kamera Bilder) in MSSQL zu speichern und verwende dabei folgenden Code:
In der Datenbank wird zwar der Datensatz angelegt, jedoch bekomme ich beim Auslesen der Daten aus der DB die Meldung: "Nicht unterstütztes Stream-Format".
MSQuery ist die Query-Komponente von SDAC.
Images, die ich in der VCL-Version mit LoadFromFile eingelesen und in die DB geschrieben habe, lassen sich korrekt auslesen und anzeigen.


procedure TForm2.save_blob_to_DB(Sender: TObject);
var MStream: TMemoryStream;
sql_str : string;
_rec_cnt : integer;
begin
MStream := TMemoryStream.Create;
try
MSQuery1.Close;
MSQuery1.SQL.Clear;
sql_str := 'select * from sign';
MSQuery1.SQL.Add(sql_str);
MSQuery1.Open;

_rec_cnt := MSQuery1.RecordCount;

MStream.Position := 0;
Image2.Bitmap.SaveToStream(MStream);
MSQuery1.Append;

MSQuery1.FieldByName('ID').AsInteger := _rec_cnt + 1;
MSQuery1.FieldByName('DateTime').AsDateTime := now;
TBlobField(MSQuery1.FieldByName('image1')).LoadFro mStream(MStream);
MSQuery1.Post;
MSQuery1.Close;
except
on E: Exception do
begin
ShowMessage('Error: ' + E.ClassName + ' ' + E.Message);
end;
end;
MStream.Free;
end;


Wo könnte mein Problem liegen?

Gruß
jangbu

OlafSt 15. Jun 2020 22:36

AW: Speichern Image als Blob-Field
 
CreateBlobStream ist dein Freund.

hoika 15. Jun 2020 22:50

AW: Speichern Image als Blob-Field
 
Hallo,
Delphi-Quellcode:
MStream.Position := 0;
Image2.Bitmap.SaveToStream(MStream);
Kann es sein, dass danach wieder das Zurücksetzen fehlt
MStream.Position := 0;
fehlt?

Sonst lädt das
TBlobField(MSQuery1.FieldByName('image1')).LoadFro mStream(MStream);
gar nichts in dein image1-Feld.

himitsu 16. Jun 2020 00:14

AW: Speichern Image als Blob-Field
 
Jupp, viel LoadFrom- und SaveTo-Methoden arbeiten ab der aktuellen Position (bis zum Ende).
Ist Position nicht am Anfang oder gar ganz am Ende, dann das eine Länge von 0 ergeben.

Wenn an der Codeposition die Quelle nicht 100% bekannt ist, weil nicht erst wenige Zeilen davor der Stream erstellt wurde und definitiv am Anfang steht,
und wenn immer alles behandelt werden muß, dann am Besten direkt davor immer Position:=0 einfügen.

Eventuell auch nochmal danach, wenn der Stream raus aus der Methode geht und du sicherstellen willst, dass es später nicht ebenfalls vergessen. (z.B. nach dem Laden des Streams mit LoadFrom/Write/Copy/...)

jangbu 17. Jun 2020 18:10

AW: Speichern Image als Blob-Field
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, keine Ahnung was hier falsch ist!?
Ich habe jetzt auch noch das abschließende Zurücksetzen hinzugefügt, ändert aber nichts!

Code:
procedure TForm2.save_blob_to_DB(Sender: TObject);
var MStream: TMemoryStream;
  sql_str : string;
  _rec_cnt : integer;
begin
  MStream := TMemoryStream.Create;
  try
    MSQuery1.Close;
    MSQuery1.SQL.Clear;
    sql_str := 'select * from sign';
    MSQuery1.SQL.Add(sql_str);
    MSQuery1.Open;
    _rec_cnt := MSQuery1.RecordCount;

    MStream.Position := 0;
      Image2.Bitmap.SaveToStream(MStream);
    MStream.Position := 0;

    MSQuery1.Append;

    MSQuery1.FieldByName('ID').AsInteger := _rec_cnt + 1;
    MSQuery1.FieldByName('DateTime').AsDateTime := now;
    TBlobField(MSQuery1.FieldByName('image1')).LoadFromStream(MStream);
    MSQuery1.Post;
    MSQuery1.Close;
  except
    on E: Exception do
    begin
      ShowMessage('Error: ' + E.ClassName + ' ' + E.Message);
    end;
  end;
  MStream.Free;
end;

Pfaffe 17. Jun 2020 19:02

AW: Speichern Image als Blob-Field
 
Muss man bei FMX auch die unit jpeg einbinden ...

jangbu 17. Jun 2020 21:14

AW: Speichern Image als Blob-Field
 
Nein, wenn man eine Komponente verwendet die die Unit jpeg braucht, also z.B. wenn man im OpenPictureDialog nicht nur *.png angezeigt bekommt aber das ist hier nicht der Fall.


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