Hallo, ich versuche in eine
Access Datenbank Bilder zu speichern und zu laden.
Speichern funktioniert. Nur bekomme ich jedes mal bei dem Versuch das Jpeg Bild zu laden den Jpeg Fehler #53.
MS-
Access schneidet beim Einspeichern von JPG-Grafiken den JPEG-Header ab. Den muß man dann beim Anzeigen wieder herstellen. Da ich aber nicht mehr mit
Access arbeite, wenn in der
DB Grafiken abgelegt werden sollen, kann ich dir nur eine Uralt-Methode vorstellen, mit der ich einmal gearbeitet habe. Mit diesen beiden Methoden werden JPG-Dateien aus einer
Access-Datenbank in einem TJpegImage dargestellt:
Delphi-Quellcode:
{*****************************************************************************
*** JPG-HEADER WIEDER HERSTELLEN ***
*****************************************************************************}
FUNCTION JpegStartsInBlob(PicField:TBlobField):integer;
VAR
bS : TADOBlobStream;
buffer : Word;
hx : string;
BEGIN
Result := -1;
bS := TADOBlobStream.Create(PicField, bmRead);
TRY
WHILE (Result = -1) and (bS.Position + 1 < bS.Size) do
BEGIN
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'FF' then begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'D8' then Result := bS.Position - 2
else if hx = 'FF' then
bS.Position := bS.Position-1;
end; //if
END; //while
FINALLY
bS.Free
END; //try
END;
{*****************************************************************************
*** BILD LADEN ***
*****************************************************************************}
PROCEDURE Bild_Laden(Wert : Byte);
VAR
bS : TADOBlobStream;
Pic : TJpegImage;
BEGIN
IF NOT DatMod.ACon.Connected THEN EXIT;
CASE Wert OF
1 : bS := TADOBlobStream.Create(DatMod.Aset_WaffenBild, bmRead);
2 : bS := TADOBlobStream.Create(DatMod.Aset_FunkBild , bmRead);
END;
try
CASE Wert OF
1 : bS.Seek(JpegStartsInBlob(DatMod.Aset_WaffenBild), soFromBeginning);
2 : bS.Seek(JpegStartsInBlob(DatMod.Aset_FunkBild) , soFromBeginning);
END;
Pic:=TJpegImage.Create;
try
Pic.LoadFromStream(bS);
CASE Wert OF
1 : FormMain.JvImg_Waffe.Picture.Graphic := Pic;
2 : FormMain.JvImg_Funk.Picture.Graphic := Pic;
END;
finally
Pic.Free;
end;
finally
bS.Free
end;
END;
Zum Verständnis: Es handelt sich dabei um eine nicht fertiggestellte Anwendung für einen kleinen Waffenfachhändler, der seine gesammelten Kenntnisse über Schußwaffen in einer Datenbank speichern wollte. Er bekam dann eine Anwendung mit Firebird-Datenbank, mit der sich quasi alles problemlos speichern und abrufen läßt.
Der übergebene Byte-Wert in der Procedure Bild_Laden bestimmt, aus welchem Blob-Feld die Datei abgerufen wird. Ich hatte es damals nicht hinbekommen, JPG-Grafiken via Delphi-Programm in
Access einzulesen, die in der
DB vorhandenen Bilder wurden direkt mit der
Access-Anwendung eingespeist. Aber das kriegst du sicher selber noch aus, wie das geht. Am besten, du verwendest
Access erst gar nicht, wenn du Grafiken oder TDBRich oder sonstigen Binärkram in deiner Datenbank speichern möchtest.