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