Einzelnen Beitrag anzeigen

Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
325 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Image.Picture.SaveToStream in ein Datenbankfeld

  Alt 18. Apr 2021, 20:50
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:

// { 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 :: }
Erkennt jemand eventuell, warum das Grafikfeld (Blob) angeblich leer sein soll?



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
Mathias

Geändert von NoGAD (19. Apr 2021 um 10:18 Uhr)
  Mit Zitat antworten Zitat