数据库中的OLE字段!!!!!!!!!!!!
我苦!
小弟在用Delphi数据库编程时,使用Access数据库引擎,当某一字段设为OLE对象时,在Access中能知道OLE对象类型,在Delphi中却不能,只显示成Blob字段,Why?
问题点数:250、回复次数:18Top
1 楼wm()回复于 2000-02-15 20:56:00 得分 0
热切盼望有人回答这个问题!Top
2 楼wm()回复于 2000-02-15 21:24:00 得分 0
大家都来看看这个问题呀!Top
3 楼Firing_Sky(火的天空)回复于 2000-02-15 21:53:00 得分 20
OLE对象归根结底还是一个Blob嘛!Top
4 楼Zhong()回复于 2000-02-15 22:00:00 得分 0
但是我很想知道OLE字段究竟包含什么OLE文档(Word文档?图片?),以便调用相应的OLE服务程序。Top
5 楼gypb(网螺)回复于 2000-02-16 19:24:00 得分 50
使用TOLECONTAINER可自动识别OLE文档。
ole字段其实是一个tBLOBSTREAM,可在一个FORM中放入ToleContainer,然后OLECONTAINER.LOADFROMESTREAM,修改完后用SAVETOSTREAM,如果是新建对象,用InsertObjectDialog,Top
6 楼Lin(林)回复于 2000-02-16 21:38:00 得分 0
gypb,先让我试试。Top
7 楼Lin(林)回复于 2000-02-16 21:59:00 得分 50
gypb:
你的方法好象是不行的。代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
try
(Table1.Fields[0] as TBlobField).SaveToStream(MS);
OleContainer1.LoadFromStream(MS);
finally
MS.Free;
end;
end;
当Button1 Click后,将出现‘Stream read error’错误提示。
Top
8 楼gypb(网螺)回复于 2000-02-17 18:53:00 得分 100
那是因为你的那字段为空,程序中我是这样编写的
子函数为
function LoadFromField:boolean;
var
TempStream:TMemoryStream;
begin
// tempstream:=createblobstream(currentfield,bmread);
result:=true;
try
Olecontainer1.LoadFromStream(loadstream);
with OleContainer1 do
DoVerb(ovshow);
except
result:=false;
end;
end;
//loadstream 为table.createblobstream(field,bmread)函数返回的结果
主程序这样写
procedure execute;
begin
if not loadfromfield then
begin
Insert1Click(Sender);//读失败,就新增一个OLE对象。
with OleContainer1 do
if NewInserted then
DoVerb(PrimaryVerb);
end;
我的方法很好用,以上代码是我自编的OLE数据感知控件TDBOLEEdit中的一段代码,利用他想往数据库插什么就插什么。而且可以及时查看。就更tdbIMAGE一样。Top
9 楼Zhong()回复于 2000-02-17 20:21:00 得分 0
gypb:
小弟不才,按照你的方法又引起'Invalid stream format'错误,其实OLE字段已存有内容。能否将TDBOLEEdit给我一份?
先谢。 and :)Top
10 楼gypb(网螺)回复于 2000-02-18 08:25:00 得分 20
先将含有OLE字段的记录删除,然后新增记录,这时再运行上述代码。
另要将OLECONTAINER1的OLDSTREAMFORMAT设为TRUE,COPYONSAVE设为TRUE。
造成你说的这种现象是因为:记录中已含有的OLE数据与当前OLECONTAINER格式并不相同。只有在OLE字段为空是用OLECONTAINER写入数据,下次才能正确读入数据。Top
11 楼gypb(网螺)回复于 2000-02-18 08:26:00 得分 0
另外:什么时候给分呀?!!!Top
12 楼gypb(网螺)回复于 2000-02-18 08:27:00 得分 0
另:你们有没有OICQ,我的是884977Top
13 楼gypb(网螺)回复于 2000-02-18 08:38:00 得分 10
另外:TDBOLEEDIT是公司内部资料,请原谅。(老总规定不应许外露)
当用LOADSFROMTREAM读人数据后,还要动太读入当前OLE对象支持的动作。具体从OLECONTAINER.ObjectVerbs[i]的到,在用DOVERB()调用。
用OleContainer1.ObjectPropertiesDialog可的知当前OLE对象的属性。Top
14 楼Zhong()回复于 2000-02-18 08:54:00 得分 0
gypb:
你的方法解决了一部分问题。其实我以前也尝试过,行倒是行。不过,当用上述方法写入数据后,再回到Access中,Access却又不能处理该字段了。咳,左右为难。
不过还是要谢谢的解答。嘻… and :=)Top
15 楼Zhong()回复于 2000-02-18 08:57:00 得分 0
gypb:
你的方法解决了一部分问题。其实我以前也尝试过,行倒是行。不过,当用上述方法写入数据后,再回到Access中,Access却又不能处理该字段了。咳,左右为难。
不过还是要谢谢的解答。分数嘛,目前还不能给你,因为…。不过,至少总会有你的一半。嘻… and :=)
Top
16 楼Lin(林)回复于 2000-02-18 13:34:00 得分 0
Zhong:
解决了以后告我一下,我也很想知道!Top
17 楼Zhong()回复于 2000-02-21 09:06:00 得分 0
有捆绑数据库OLE字段的控件也行啊。Top
18 楼gypb(网螺)回复于 2000-02-21 09:09:00 得分 0
我的解答对你一点作用也没有吗,一分都不给,气死我了Top




