CreateOLEObject

MONITOR
Дата: 13.03.2003 23:48:02
Кто-нибудь знает, как после создания и работы с документом Word осуществить его сохранение не в файл, а, например, в поток или в память для последующей записи его в поле базы данных?
oleg_e
Дата: 14.03.2003 17:19:07
C OleContainer можно например так:

BlobStream: TblobStream;
...
BlobStream:=TBlobStream.Create(<твой BlobField>, bmWrite);
OleContainer1.SaveToStream(BlobStream);
BlobStream.Free;
MONITOR
Дата: 14.03.2003 23:11:00
Только, по-моему, TOleContainer - компонент визуальный, а мне надо это дело без всяких визуальных элементов сделать!!!
Charly
Дата: 28.07.2004 16:06:53
Ну так как это сделать? Никто не знает?
mv
Дата: 28.07.2004 16:14:25
TOleContainer + MS Word = у меня очень хреново работал.

Использую вызов MS Word как COM - сервера, и когда он (юзер, например) пытается сделать Save, я перехватываю это дело, сохраняю в tmp - файл - а его - куда хошь Хоть в стрим, хоть в блоб.
Charly
Дата: 28.07.2004 16:24:28
Есть процедура

var stm,stm1:TMemoryStream;
begin
stm := TMemoryStream.Create;
stm.LoadFromFile(feNameReport.FileName);
adqLoad.SQL.Text := 'insert into adreg.reports r (id, name, doc, info) values (reports_seq.nextval, :name, :doc, :info)';
adqLoad.Parameters.ParamByName('NAME').Value := feNameReport.FileName;
adqLoad.Parameters.ParamByName('INFO').Value := edInfo.Text;
adqLoad.Parameters.ParamByName('DOC').LoadFromStream(stm, ftBlob);
adqLoad.Prepared := True;
adqLoad.ExecSQL;
stm.Free;

С маленькими файлами(около 5к) работает нормально, а вот с большими (500 к) вываливается ошибка - "Получен конец файла по комутационному каналу".
Что это может быть????
mv
Дата: 28.07.2004 16:31:28
А можно узнать, чего это все через промежуточный TMemoryStream делают?

Ну, вот Вам процедурка для работы (загрузка поизвольного файла в произвольную таблицы, с указанием значения ключевого поля (в моем случае его имя всегда ИмяТаблицы_Id)). Надеюсь, все понятно.

procedure TForm1.SaveFileToBlob(AFileName, ATableName, AFieldName: String;
  AId: Integer); // Помещение файла в базу

var DQry : TpFIBQuery; fs : TFileStream; begin DQry := TpFIBQuery.Create(Self); DQry.Database := dbMain; DQry.Transaction := trWrite; fs := TFileStream.Create(AFileName, fmShareDenyNone ); try DQry.SQL.Text := 'select count(*) from '+ ATableName + ' where ' + ATableName + '_Id = ' + IntToStr(AId); if not DQry.Transaction.InTransaction then DQry.Transaction.StartTransaction; try DQry.ExecQuery; if DQry.Fields[0].AsInteger = 0 then begin DQry.Close; DQry.SQL.Text := 'Insert into ' + ATableName + ' (' + AFieldName + ') values (:Field_Name)'; end else begin DQry.Close; DQry.SQL.Text := 'Update ' + ATableName + ' set '+ AFieldName + ' =:Field_Name'; end; DQry.SQL.Add('where ' + ATableName + '_ID = :ID'); DQry.Prepare; DQry.ParamByName('ID').AsInteger := dtMain.FieldByName('TBL_ID').AsInteger; DQry.ParamByName('Field_Name').LoadFromStream(fs); DQry.ExecQuery; if DQry.Transaction.InTransaction then DQry.Transaction.Commit; if dtMain.QRefresh.SQL.Text <> '' then dtMain.QRefresh.ParamByName('OLD_TBL_ID').AsInteger := dtMain.FieldByName('TBL_Id').AsInteger; dtMain.Refresh except on E: Exception do begin if DQry.Transaction.InTransaction then DQry.Transaction.Rollback; raise Exception.Create('Ошибка при занесении данных в базу.'+ #13 + 'SQL - предложение: '+ #13 + DQry.SQL.Text + #13 + 'Ошибка:' + E.Message); end; end; finally DQry.Free; fs.Free; end; end;
Charly
Дата: 28.07.2004 16:45:48
Всё повторил... ошибка не исчезла... Я пользуюсь ADO и поэтому некоторые параметры квери не такие...
Кпримеру в таком виде
DQry.ParamByName('Field_Name').LoadFromStream(fs);
не захотела принимать, сделал
DQry.Parametrs.ParamByName('Field_Name').LoadFromStream(fs, fsBlob);

СОС!!!!
mv
Дата: 28.07.2004 17:06:40
А если так:

begin
  adqLoad.Close;
  adqLoad.SQL.Text := 'insert into adreg.reports r (id, name, doc, info) values (reports_seq.nextval, :name, :doc, :info)';
  adqLoad.Prepare;
  adqLoad.Parameters.ParamByName('NAME').Value := feNameReport.FileName;
  adqLoad.Parameters.ParamByName('INFO').Value := edInfo.Text;
  adqLoad.Parameters.ParamByName('DOC').LoadFromFile(feNameReport.FileName);

  adqLoad.ExecSQL;

?
Charly
Дата: 28.07.2004 17:47:09
Разобрался... Оказывается я использовал не тот провайдер. Поменял на OLEDB и всё заработало. Спасибо!