![]() |
Datenbank: MS-SQL • Version: 2014 • Zugriff über: SDAC
Image mit FMX in DB speichern und zurücklesen
Hallo,
ich speichere mit meiner FMX Application images als blob in der MS-SQL-DB, kann sie korrekt wieder zurücklesen und auch wieder als image anzeigen. DaAbei benutze ich folgenden Code:
Code:
Das funktioniert alles wunderbar!
procedure TForm2.btn_save_to_DBClick(Sender: TObject);
var MStream : TMemoryStream; begin MStream := TMemoryStream.Create; try MSQuery1.SQL.Text := 'INSERT INTO sign (ID,image1,DateTime,ok) VALUES (:ID,:image1,:DateTime,:ok)'; Image1.Bitmap.SaveToStream(MStream) MStream.Seek(0,0); try MSQuery1.ParamByName('ID').AsInteger := 109; MSQuery1.ParamByName('image1').LoadFromStream(MStream, ftBlob); MSQuery1.ParamByName('DateTime').AsDateTime := now; MSQuery1.ParamByName('ok').AsBoolean := false; MSQuery1.ExecSQL(); except on E: Exception do ShowMessage('Error on ExecSQL! ' + e.Message); end; MStream.Free; finally MSQuery1.Close; end; end; procedure TForm2.btn_readClick(Sender: TObject); var BlobStream : TStream; begin if not MSConnection1.Connected then MSConnection1.Connected := true; try MSQuery1.Close; MSQuery1.SQL.Clear; MSQuery1.SQL.Add('select * from sign where id = ''' + edt_id.Text + ''''); MSQuery1.Open; BlobStream := MSQuery1.CreateBlobStream(MSQuery1.FieldByName('image1'),TBlobStreamMode.bmRead); Image3.Bitmap.LoadFromStream(BlobStream); // *** FMX-Version*** BlobStream.Free; except on E: Exception do ShowMessage('Fehler bei lesen blob from DB ' + e.Message); end; end; Wenn ich jedoch mit einer windows-VCL-Application versuche die Images von der DB wieder zurückzulesen, die mit der FMX-Applikation (Android) in die DB geschrieben wurden, bekomme ich den Fehler: "DB Bitmap ist ungültig"
Code:
Fazit: mit FMX gespeicherte Images lassen sich auch mit FMX wieder zurücklesen, das gleiche gilt für VCL. Wie lassen sich jedoch mit FMX gespeicherte Images mit VCL korrekt zurücklesen und anzeigen?
procedure TfrmMain.btn_read_from_DBClick(Sender: TObject);
var BlobStream : TStream; begin if not MSConnection1.Connected then MSConnection1.Connected := true; try MSQuery1.Close; MSQuery1.SQL.Clear; MSQuery1.SQL.Add('select * from sign where id = ''' + edt_id.Text + ''''); MSQuery1.Open; BlobStream := MSQuery1.CreateBlobStream(MSQuery1.FieldByName('image1'),TBlobStreamMode.bmRead); Image2.Picture.Bitmap.LoadFromStream(BlobStream); // *** VCL-Version BlobStream.Free; except on E: Exception do ShowMessage('Fehler bei lesen blob from DB ' + e.Message); end; end; jangbu |
AW: Image mit FMX in DB speichern und zurücklesen
Je nach Platform werden
![]() Ich bin da auch nicht sicher ob die dann immer 100% übereinstimmen, ich vermute mal da gibt es auch kleine Implementierungsunterschiede, je nach Platform. Ich würde versuchen das über ein PNG oder JPG als einigermaßen standarisiertes Transferformat zu speichern. |
AW: Image mit FMX in DB speichern und zurücklesen
Mal von dem grundsätzlichen Hinweis von Rollo62 abgesehen:
Unter FMX ist das Standard-"Bitmap" eine PNG.Datei, wenn Du einen Stream explizit als ".bmp" speichern willst, müsstest Du einen kleinen Umweg gehen. Daher gehe ich davon aus, dass Deine Bitmap in Wahrheit als PNG-Datei gespeichert wird. Die VCL.Bitmap kann aber kein PNG laden, Du könntest aber unter VCL mit Image.picture(.grafic) versuchen, ob die Datei als png geladen werden kann. |
AW: Image mit FMX in DB speichern und zurücklesen
Hmm, welches Format wäre denn am sinnvollsten um Images als blob von FMX und VCL speichern und auslesen zu können.
Wie könnte ich denn das (image)blob-feld beim Auslesen aus der DB so wandeln, dass es VLC versteht? |
AW: Image mit FMX in DB speichern und zurücklesen
|
AW: Image mit FMX in DB speichern und zurücklesen
Zitat:
|
AW: Image mit FMX in DB speichern und zurücklesen
ja, so geht es jetzt! Danke!
Code:
png.create;
BlobStream.Position := 0; png.LoadFromStream(BlobStream); Image2.Picture.Graphic := png; png.Free; |
AW: Image mit FMX in DB speichern und zurücklesen
@Klugscheißer :stupid:
1. try/finally vergessen? :zwinker: 2. Das steht mit Sicherheit in einem "with" Block...wegen unqualifizierten Namen. "with" ist "neuerdings :zwinker:" bäääh. 3.
Delphi-Quellcode:
ist unnötig, da nach dem Create die Position eh auf 0 steht.
BlobStream.Position := 0;
:wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz