Eine beliebige Datei in einem IB/FB-Blobfeld speichern

Viele haben sich das schon gefragt, ich habe aber selten eine befriedigende Antwort gefunden. Der folgenden Code basiert auf dem vom Swissdelphicenter, aber dieser enthält eine Ungereimtheit: Ich habe bei Interbase immer den Fehler bekommen: "Nicht im Bearbeitungsmodus". Und außerdem wurde blob als TBlobStream deklariert nie angenommen.

Ich verwende eine Beispieltabelle testtabelle mit dem BLOB-Feld blobdata. Einen neuen Datensatz erstelle ich mit einer SQL-Anweisung, alternativ kann man auch mit Append einen erzeugen, er muss eben der aktive Datensatz sein.

Hier ist der Code um eine Datei in einen neuen Datensatz einzufügen:

  1. var datei,blob:TStream;
  2. begin
  3. //Neuen Datensatz in Tabelle erstellen
  4. IBSQL.SQL.Text:='INSERT INTO testtabelle(id) VALUES('+inttostr(id)+')';
  5. IBtesttabelle.SelectSQL.Text:='SELECT * FROM rechnungen WHERE id='+inttostr(id)+';';
  6. IBtesttabelle.Open;
  7. IBtesttabelle.Edit;
  8. //Datei einlesen
  9. blob:=mainform.IBtesttabelle.CreateBlobStream(IBtesttabelle.FieldByName('blobdata'),bmWrite);
  10. try
  11. blob.Seek(0,soFromBeginning);
  12. datei:=TFileStream.Create('C:\testdatei.jpg',fmOpenRead or fmShareDenyWrite);
  13. try
  14. blob.CopyFrom(datei,datei.Size);
  15. IBtesttabelle.Post;
  16. finally
  17. datei.Free;
  18. end;
  19. finally
  20. blob.Free;
  21. end;
  22. end;

Um diese Datei zu lesen, verwendet ihr einfach folgenden Code, wieder wird der Datensatz erst selektiert und dann das BLOB-Field gelesen. Es empfiehlt sich hier natürlich mit einer Eingrenzung der zu übertragenden Datensätzen mit WHERE zu arbeiten, um die Menge der zu übertragenden Daten ein bisschen einzugrenzen.

  1. var blob:TStream;
  2. begin
  3. //Datei auslesen
  4. blob:=mainform.IBtesttabelle.CreateBlobStream(IBtesttabelle.FieldByName('blobdata'),bmRead);
  5. try
  6. blob.Seek(0,soFromBeginning);
  7. with TFileStream.Create('C:\testdatei.jpg',fmCreate) do
  8. try
  9. CopyFrom(blob,blob.Size);
  10. finally
  11. Free;
  12. end;
  13. finally
  14. blob.Free;
  15. end;
  16. end;