Пример записи и чтения БЛОБ.

 
Готовый пример чтения и записи блоба при помощи IBDataSet. 
С IBQuery+IBUpdateSQL проверяйте сами, должно работать точно так же.

"Механизьм" был проверен в режимах insert/edit (write) и browse (read),
на двух файлах - iometer.zip (2.5Mb) и interbase.gif (6Kb).
После всовывания и высовывания в/из БД файлы остались целыми, т.е.
небитыми.

Описание задачи:
IBDatabase, IBTransaction, IBDataSet, TDataSource, TDBGrid.
таблица из трех полей - ID INTEGER (PK), NAME CHAR(30), B BLOB.
(блоб без типа, это пофигу).
Необходимо вкачивать и выкачивать файлы в блоб.
Пишем запросы для IBDataSet:
 
    DeleteSQL.Strings = ('delete from t where id = :id')
    InsertSQL.Strings = ('insert into t (id, name, b) values (:id, :name, :b)')
    RefreshSQL.Strings = ('select id, name, b from t where id = :id')
    SelectSQL.Strings = ('select  ID, NAME, B from T')
    ModifySQL.Strings = ('update t set name = :name, b=:b where id = :id')

Далее, кнопка втыкания блоба из файла в поле:
 
procedure TForm1.Button1Click(Sender: TObject);
var
 blb, f: TStream;
begin
  if (DataSource1.State in [dsEdit, dsInsert]) then
    begin
      blb:=IBDataSet1.CreateBlobStream(IBDataSet1.FieldByName('B'),bmWrite);

      f := TFileStream.Create(Edit1.Text, fmOpenRead);
      blb.CopyFrom(f, f.Size);

      f.Free;
      blb.Free;
    end
  else
    ShowMessage('DataSet not in Insert or Edit mode!');
end;

Еще раз напомню, что IBDataSet.Post должен вызываться ПОСЛЕ вызова
blb.Free.
Чехарда с потоками обусловлена тем, что IBDataSet.CreateBlobStream
возвращает указатель не на TIBBlobStream, а TIBDSBlobStream. Поэтому
ничего кроме TStream использовать не удается, а у него нет метода
LoadFromFile.
Можно делать при этом кислое лицо, но уверяю, IBBlobStream.LoadFromFile
содержит абсолютно такую же конструкцию с TFileStream.

Запись блоба в файл. Не различает режим датасета (browse или
редактирование-вставка) -
ему это пофигу. Но! До входа в режим edit/insert/delete или ДО Post опять
же
надо вызывать blb.Free. Т.е. чтобы при этих операциях блоб-поток БЫЛ
ЗАКРЫТ.
 
procedure TForm1.Button6Click(Sender: TObject);
var
 blb, f: TStream;
begin
  if not IBDataSet1.FieldByName('B').isNull then
    begin
      SaveDialog1.Execute;
      blb:=IBDataSet1.CreateBlobStream(IBDataSet1.FieldByName('B'),bmRead);

      f := TFileStream.Create(SaveDialog1.FileName, fmCreate);
      f.CopyFrom(blb, blb.Size);

      f.Free;
      blb.Free;
    end
  else
    ShowMessage('Blob is empty');
end;

ситуация обратная (блоб копируем в файл). Обратите внимание на смену
режима открытия блоба, и на то, что fmCreate у TFileStream в случае наличия файла
не ругается, а открывает файл на запись! Т.е. можно потерять старое
содержимое существующего файла.

-- 
(с)Dmitry Kuzmenko, Epsylon Technologies.
TechSupport Manager. InterBase support.

TopList Rambler's Top100