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 и всё заработало. Спасибо!