Einzelnen Beitrag anzeigen

Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#1

ParadoxDB: BLOB nicht geöffnet

  Alt 26. Jan 2008, 14:39
Datenbank: Paradox • Version: ?? • Zugriff über: BDE
Hallo!

Ich habe eine Paradox-Datenbank, in der ich Jpg-Bilder speichern will. Das funktioniert inzwischen auch.
Allerdings bekomme ich beim Lesen aus dem BLOB-Field, welches ich für das Jpg-Bild verwende manchmal einen Fehler.
Wenn ich direkt nach dem Schreiben in die Datenbank das Bild wieder auslesen möchte, bekomme ich den Fehler "BLOB nicht geöffnet". Wenn ich das Programm gerade erst gestartet hab, funktioniert alles wunderbar, auch wenn ich zwischendurch ein anderes Bild noch speichere kann ich das davor öffnen, nur immer das letzte nicht.

Hier mein Code zum Schreiben (das Bild wird geladen (BMP oder JPG) und wird erst auf eine bestimmte Größe verkleinert):
Delphi-Quellcode:
procedure TMainForm.LoadPictureAndPost(const FN: String);
var
 BMP, BMP2: TBitmap;
 JPG: TJpegImage;
 M: TStream;
 f: Double;
 r1, r2: Double;
begin
 BMP := TBitmap.Create;
 try
   if LowerCase(ExtractFileExt(FN)) = '.jpgthen begin
      Jpg := TJPEGImage.Create;
      try
        Jpg.LoadFromFile(FN);
        BMP.Assign(Jpg);
      finally
        Jpg.Free;
      end;
   end else BMP.LoadFromFile(FN);

   BMP2 := TBitmap.Create;
   try
     r1 := PIC_MAX_HEIGHT / PIC_MAX_WIDTH;
     r2 := BMP.Height / BMP.Width;

     if r1 > r2 then begin
        f := PIC_MAX_WIDTH / BMP.Width;
        BMP2.Width := PIC_MAX_WIDTH;
        BMP2.Height := Trunc(BMP.Height * f);
     end else begin
        f := PIC_MAX_HEIGHT / BMP.Height;
        BMP2.Height := PIC_MAX_HEIGHT;
        BMP2.Width := Trunc(BMP.Width * f);
     end;

     BMP2.Canvas.StretchDraw(BMP2.Canvas.ClipRect, BMP);

     Jpg := TJPEGImage.Create;
     try
       Jpg.Assign(BMP2);

       M := PersonTable.CreateBlobStream(PersonTable.FieldByName('Bild'), bmWrite);
       try
         Jpg.SaveToStream(M);
         PersonTable.Post;
       finally
         M.Free;
       end;
     finally
       Jpg.Free;
     end;
   finally
     BMP2.Free;
   end;
 finally
   BMP.Free;
 end;
end;
Code zum lesen:
Delphi-Quellcode:
procedure TMainForm.DBGrid1CellClick(Column: TColumn);
var
 M: TStream;
 Jpg: TJPegImage;
begin
 if TBlobField(PersonTable.FieldByName('Bild')).IsNull then Exit;

 M := PersonTable.CreateBlobStream(TBlobField(PersonTable.FieldByName('Bild')), bmRead);
 try
   M.Position := 0;

   Jpg := TJPEGImage.Create;
   try
     Jpg.LoadFromStream(M);
     Image1.Picture.Assign(Jpg);
   finally
     Jpg.Free;
   end;
 finally
   M.Free;
 end;
end;
PS: Habe auch schon im Forum gesucht, allerdings hat mir dieser Thread nicht geholfen bzw weiß ich nicht wie ich die API einsetzen soll?
  Mit Zitat antworten Zitat