Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Sa 31.05.03 21:53 
[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:

ausblenden 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
//Neuen Datensatz in Tabelle erstellen
IBSQL.SQL.Text:='INSERT INTO testtabelle(id) VALUES('+inttostr(id)+')';
IBtesttabelle.SelectSQL.Text:='SELECT * FROM rechnungen WHERE id='+inttostr(id)+';';
IBtesttabelle.Open;
IBtesttabelle.Edit;
//Datei einlesen
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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var blob:TStream;
begin
//Datei auslesen
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 user profile iconUdontknow: Meta-Tags hinzugefügt.