![]() |
Image.Picture.SaveToStream in ein Datenbankfeld
Huhu.
Mit folgendem Code versuche ich ein Stream aus einem TImage in ein Graphic - Feld einer Datenbank zu schreiben. Es scjeint, als wäre der Stream leer, da beim Lesen des Feldes immer eine Fehlermeldung erzeugt wird. Code für das Schreiben:
Delphi-Quellcode:
Code für das Auslesen:
var
BlobStream: TStream; PictureStream: TStream; begin PictureStream := TMemoryStream.Create; Image1.Picture.SaveToStream(PictureStream); BlobStream :Table1.CreateBlobStream(Table1.FieldByName('Thumbnail'), bmWrite); BlobStream.Write(PictureStream, PictureStream.SIZE); BlobStream.Free; PictureStream.Free; end;
Delphi-Quellcode:
Ist der Fehler beim Schreiben oder beim Lesen zu suchen?
var
JpegImage: TJPEGImage; BlobStream: TStream; begin BlobStream := Table1.CreateBlobStream(Table1.FieldByName('Thumbnail'), bmRead); JpegImage := TJPEGImage.Create; JpegImage.LoadFromStream(BlobStream); // <--- Hier wird eine Exception ausgelöst, BlobStrem ist () (leer?) Image1.Picture.Assign(JpegImage); Image1.Visible := True; JpegImage.Free; BlobStream.Free; end; LG Mathias |
AW: Image.Picture.SaveToStream in ein Datenbankfeld
Was passiert, wenn Du beim Schreiben statt
Delphi-Quellcode:
das hier verwendest?
// Alt
BlobStream.Write(PictureStream, PictureStream.SIZE);
Delphi-Quellcode:
// Neu
BlobStream.CopyFrom(PictureStream, 0); |
AW: Image.Picture.SaveToStream in ein Datenbankfeld
Du musst nach dem SaveToStream den PictureStream wieder auf den Anfang setzen. Außerdem ist Write nicht der richtige Weg, sondern CopyFrom (wie Detlef schon bemerkt hat).
|
AW: Image.Picture.SaveToStream in ein Datenbankfeld
Außerdem kannst du dir den Umweg über PictureStream ganz sparen:
Delphi-Quellcode:
BlobStream := Table1.CreateBlobStream(Table1.FieldByName('Thumbnail'), bmWrite);
try Image1.Picture.SaveToStream(BlobStream); finally BlobStream.Free; end; |
AW: Image.Picture.SaveToStream in ein Datenbankfeld
Oder direkt ein TDBImage?
Früher konnte das nur TBitmap, aber da Picture.LoadFromStream inzwischen die MagicBytes erkennt und danach entscheiden kann, kann TImage/TDBImage auch alle anderen bekannten TGraphic-Ableger aus Stream laden/anzeigen. (ohne dass man manuell den passenden GraphicTypen erstellt) |
AW: Image.Picture.SaveToStream in ein Datenbankfeld
Zitat:
Zitat:
Und auf so einfache Dinge komme ich immer nicht. Dir auch ganz vielen Dank! Ihr seid toll! LG Mathias |
AW: Image.Picture.SaveToStream in ein Datenbankfeld
Hallo nochmal,
ich muss den Thread bitte nochmal ausgraben. Durch eine Änderung klappt der Code nicht mehr. Als Fehlermeldung wird mir immer angezeigt, dass ein Tabellenfeld einen Wert haben muss. Dieses Feld ist tatsächlich mit NOT NULL definiert. Aber eigentlich sollte folgender Code einen Inhalt im Tabellenfeld erzeugen:
Delphi-Quellcode:
Erkennt jemand eventuell, warum das Grafikfeld (Blob) angeblich leer sein soll?// { Tabelle für Bilder } { Tabellenname } TableName: 'table_thumbnail'; { SQL Tabelle für die Bilder } SQL: 'CREATE TABLE table_thumbnail(id AUTOINC NOT NULL MINVALUE 0,' + ' thumbnail_picture GRAPHIC BLOBBlockSize 102400 BLOBCompressionAlgorithm BZIP BLOBCompressionMode 9 NOT NULL,' + ' thumbnail_sha512 VARCHAR(255))'; // MyABSTable ist ein Record var FileStream: TFileStream; BlobStream: TStream; Dummy_String_SHA512: String; Dummy_Bool_SHA512: Boolean; begin { :: Bild hinzufügen / bearbeiten - } if OpenPictureDialog1.Execute then begin try FileStream := TFileStream.Create(OpenPictureDialog1.FileName, fmOpenRead or fmShareDenyNone); Dummy_String_SHA512 := GetStreamToHashSHA256Hex(FileStream); Dummy_Bool_SHA512 := MyABSTable.atable_construct[4].Table.Locate(MyABSTable.atable_construct[4].FieldNames[2], Dummy_String_SHA512, []); case Dummy_Bool_SHA512 of True: { benötige ich nicht, ist nur für meine Lesbarkeit } ; False: begin MyABSTable.atable_construct[4].Table.Insert; BlobStream := MyABSTable.atable_construct[4].Table.CreateBlobStream(MyABSTable.atable_construct[4].Table.FieldByName(MyABSTable.atable_construct[4].FieldNames[1]), bmWrite); BlobStream.Seek(0, soFromBeginning); BlobStream.CopyFrom(FileStream, FileStream.Size); // mit ,0); wird es auch nicht besser MyABSTable.atable_construct[4].Table.FieldByName(MyABSTable.atable_construct[4].FieldNames[2]).AsString := Dummy_String_SHA512; MyABSTable.atable_construct[4].Table.Post; // HIER knallt immer eine Exception rein, mit der Meldung: Feld 'xyz' muss einen Wert haben // Feld 'xyz' ist definitiv mein Blob Field end; end; if assigned(FileStream) then FileStream.Free; if assigned(BlobStream) then BlobStream.Free; MyABSTable.atable_construct[0].Table.Edit; MyABSTable.atable_construct[0].Table.FieldByName(MyABSTable.atable_construct[0].FieldNames[13]).AsInteger := MyABSTable.atable_construct[4].Table.RecNo; MyABSTable.atable_construct[0].Table.Post; ABSTable1AfterScroll(MyABSTable.atable_construct[0].Table); except MyABSTable.atable_construct[4].Table.Cancel; MyABSTable.atable_construct[0].Table.Cancel; end; end; { - Bild hinzufügen / bearbeiten :: } Edit: Nachdem ich den Code umgestellt habe und die Streams direkt nach der Zuweisung wieder freigebe, ist das Datenbankfeld wieder gefüllt. Sehr eigenartig, aber es klappt nun wieder.
Delphi-Quellcode:
{..}
BlobStream.CopyFrom(FileStream, FileStream.Size); // ab hier if assigned(FileStream) then FileStream.Free; if assigned(BlobStream) then BlobStream.Free; // bis hier hatte gefehlt MyABSTable.atable_construct[4].Table.FieldByName(MyABSTable.atable_construct[4].FieldNames[2]).AsString := Dummy_String_SHA512; MyABSTable.atable_construct[4].Table.Post; {..} LG Mathias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 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-2025 by Thomas Breitkreuz