如何将数据库(access)中的一个ole域中内容取出并打开(100分)

  • 主题发起人 主题发起人 trancebaby
  • 开始时间 开始时间
T

trancebaby

Unregistered / Unconfirmed
GUEST, unregistred user!
域中内容为一个word文件.
是否可用TOleStream将其打开,
如果用这个类,
其constructor Create(const Stream: IStream);
中的istream怎样得到?
 
用二进制字段+数据流处理
 
能否具体一些?
 
to yjj100

'用二进制字段+数据流处理'
用哪种数据流呢?我试了tblobstream,
把文件读出再存起来,发现多了不少乱码,应该是access的附加的信息,
好像识别不出ole对象的格式嘛.
各位大虾救命.
真的比较急的说,我又是这方面的新手,多多伸出你们的援手吧.
 
不知道你是怎么保存进去的,保存和读出应该用相同的方法(方向相反)
tblobstream应该是没问题的,我曾经用它和TOleContainer配合用
 
access的字段应该用ole而不是memo
 

TBlobField.loadfromfile('文件名')
即可打开
TBlobField.savetofile('文件名')保存
TBlobField为你在access表中的字段名
access的字段应该用ole对象类型
 
to pipi.
>不知道你是怎么保存进去的,保存和读出应该用相同的方法(方向相反)

我的题目要求是这样的,数据库的操作由access完成,就是说ole对象的插入的
操作是由Access完成的,我的程序的功能是取出数据,在这些数据的基础上处理.
所以我没法做到这一点.
怎么办?
 
另:我是用Access中的ole域的,memo字段完成不了这样的功能的.
 
有没有人用过tolestream?我觉得有可能应该用这个的.
 
我用
str:=TBlobStream.Create(TBlobField(Table1.FieldByName('例图')),bmRead);//这个域的内容是一个word文件
OleContainer1.LoadfromStream(str);
试了一下,
error:'Invalid stream format.'
 
如果保存的时候是保存完整的文件进去,
应该 TBlobField(data.ieldByName('f_name')).SaveToFile('temp.doc')

然后打开 temp.doc
 
我试过了,它不仅保存了完整的文件,因为这样直接
save为文件,会多出很多乱码,应该是作为ole对象存放的,
但是用tblobstream的话,olecontainer装不进,
我有试了tadoblobstream,居然在运行到
str:=TADOBlobStream.Create
(table1.fieldbyname('ole')as TBlobField,bmRead);
时就出错了(invalid class typecast).
 
我的问题解决不了了吗?555...
 
我想到一个比较笨的解决办法,但已经很高兴了,因为总比没有好.
我想引起问题的原因应该是access和delphi的ole对象的格式不同,
想用delphi打开一个ole对象,这个对象就应该是delphi插入的,
所以就编了另一个程序用delphi的方法插入ole对象.
不过这样在access中就打不开了.
 
请看
我注释掉了无关的代码
procedure TdlgFile.btnBrowClick(Sender: TObject);
var
Ext:string;//文件扩展名,
TxtFileName:string;//保存文件名
v:Olevariant;
begin
//if lstFile.ItemIndex<0 then
// exit; // 将所有的
// strTitle:=lstFile.Items.Strings[lstFile.itemindex];
// frmData.QryPhoto.First;
// frmData.QryPhoto.MoveBy(lstFile.itemindex);
Ext:=frmData.qryphoto.fieldbyname('Ext').asstring; //保存的拓展名
TxtFileName:=RUNPATH+'output/'+FILENAME+Ext; //一个临时文件名


TBLOBField(frmData.qryphoto.fieldbyname('Ole')).SaveToFile(TxtFileName);

if (Comparetext(Ext,'.Doc')=0) or (Comparetext(Ext,'.rtf')=0) or (Comparetext(Ext,'.Txt')=0) then
begin
try
try
v:=GetActiveOleObject('Word.Application');
except
v:=CreateOleObject('Word.Application');
end;
v.Documents.Open(TxtFileName);
v.Visible:=True;
Except
Application.MessageBox('没有安装Office!',Pchar(Application.Title),MB_ICONINFORMATION);
V.quit;
end;
end else if Comparetext(Ext,'.Xls')=0 then //Excel
begin
try
V:=GetActiveOleObject('Excel.Application');
except
V:=CreateOleObject('Excel.Application');
end;
V.WorkBooks.Open(TxtFileName);
V.visible:=True;
end;
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部