[meta]Interbase Firebird IB FB Blob Blobstream Dataset Blobfeld Blobfield TBlobfield[/meta]
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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| var datei,blob:TStream; begin IBSQL.SQL.Text:='INSERT INTO testtabelle(id) VALUES('+inttostr(id)+')'; IBtesttabelle.SelectSQL.Text:='SELECT * FROM rechnungen WHERE id='+inttostr(id)+';'; IBtesttabelle.Open; IBtesttabelle.Edit; blob:=mainform.IBtesttabelle.CreateBlobStream(IBtesttabelle.FieldByName('blobdata'),bmWrite); try blob.Seek(0,soFromBeginning); datei:=TFileStream.Create('C:\testdatei.jpg',fmOpenRead or fmShareDenyWrite); try blob.CopyFrom(datei,datei.Size); IBtesttabelle.Post; finally datei.Free; end; finally blob.Free; end; 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.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var blob:TStream; begin blob:=mainform.IBtesttabelle.CreateBlobStream(IBtesttabelle.FieldByName('blobdata'),bmRead); try blob.Seek(0,soFromBeginning); with TFileStream.Create('C:\testdatei.jpg',fmCreate) do try CopyFrom(blob,blob.Size); finally Free; end; finally blob.Free; end; end; |
Finale Anmerkung: Seid nicht ganz so hart, wenn Fehler drin sind, das ist mein erstes Tut und ich hab versucht es möglichst allgemein zu machen, hoffe also, dass es funktioniert.
Moderiert von Udontknow: Meta-Tags hinzugefügt.