Einzelnen Beitrag anzeigen

jangbu

Registriert seit: 6. Apr 2006
158 Beiträge
 
Delphi 10.3 Rio
 
#1

Image mit FMX in DB speichern und zurücklesen

  Alt 29. Jun 2020, 14:38
Datenbank: MS-SQL • Version: 2014 • Zugriff über: SDAC
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:
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;
Das funktioniert alles wunderbar!

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:
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;
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?

jangbu
  Mit Zitat antworten Zitat