Du hast recht, so müsste es gehen. Ich habe mittlerweile einen Teil-Erfolg erzielt. Mit folgenden Proceduren kann ich ein Image in der
DB speichern und auch wieder auslesen. Aber dazu muss ich es als ein VARCHAR() definieren. Wenn ich es mit einem Blob versuche, kommen irgendwie keine Daten wieder zurück...
Speicher-Procedure
Delphi-Quellcode:
function TDataModule_Client.Save_NewLogo(Logo_string: string): boolean;
begin
Try
if DataSet_NewLogo.State=dsBrowse then
DataModule_Client.DataSet_NewLogo.Insert;
DataSet_NewLogo.FieldByName('company_id').AsInteger:=DataSet_NewCompany.FieldByName('company_id').AsInteger;
if Logo_string<>'' then begin
DataSet_NewLogo.FieldByName('logo').AsString:=Logo_string; //Das ist das Blob-Feld
DataSet_NewLogo.FieldByName('logo_string').AsString:=Logo_string; //Der gleiche Wert noch einmal in das VARCHAR Feld
end;
DataSet_NewLogo.Post;
DataSet_NewLogo.ApplyUpdates;
Result:= true;
Except
Result:= false;
End;
end;
Dabei wurde der Logo_String beim Aufruf erzeugt und übergeben:
Delphi-Quellcode:
var IMG_Base64: string;
begin
IMG_Base64:=Img_Logo2.DataURL;
DataModule_Client.Save_NewLogo(Img_Base64);
Wenn ich das Image wieder aus der
DB lade weise ich es mit dieser Procedure dem Image wieder zu:
Delphi-Quellcode:
var Img_Base64: string;
begin
DataModule_Client.DataSet_NewLogo.Cancel;
DataModule_Client.DataSet_NewLogo.Open;
Img_Base64:='data:image/png;base64,'+DataModule_Client.DataSet_NewLogo.FieldByName('logo_string').AsString;
Img_Logo2.URL:=Img_Base64;
end;
Das klappt, wenn ich das mit dem VARCHAR-Feld "Logo_String mache, wenn ich stattdessen das Blob-Feld "logo" heranziehe, erhalte ich keinen auslesbaren Wert.
Verwenden tue ich eine MariaDB 10 und definiert ist das Feld einfach als Blob...
Ich würde es wirklich gerne mit einem Blob realisieren, denn sonst darf das Feld nur ca. 21.800 Zeichen haben. Und ich muss im weiteren Programm-Verlauf auch noch PDF-Dokumente speichern...
Vielen Dank für jede Anregung
Patrick