UGrohne - Sa 31.05.03 21:53
Titel: ... eine beliebige Datei in einem IB-BLOB-Feld speichern?
[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. :wink:
Moderiert von Udontknow: Meta-Tags hinzugefügt.