高手请进来帮帮忙呀!关于Blob类型字段的处理!进来帮顶者有分(200分)

  • 主题发起人 主题发起人 wujer
  • 开始时间 开始时间
W

wujer

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是这样的,在表中有一个字段是存附件用的。字段类型Bolb。我将选取文件的“文件名”,“大小”,“文件数据”存放在字段中。
当我时同存入几个文件时。我怎么把每一个文件取出来。
提示,我知道可以提出来,但方法是要建一个临时文件放在磁盘上,再用ShellExecute打开。
但现在碰到了权限问问题,因为使用终端时有的没有权限写磁盘的。所以现在要换个方法了。我想到了用OLE的方法。
就是先读入先把数据读入MemoryStream,再用OleContainer1.LoadFormStream的方法打开。
我不知道此方法可不可行,如果可行,不知如果在Blob中提取中所想要的文件。
如果不行,敢问有什么好的方法可以实现,希望大家广提意见,一经采纳,立即给分。
如提好见意,也有分得。先谢谢大家了。
 
不是灌水
ding 顶~关注~
 
我也想知道
关注中。。。
帮你顶
 
关注~~~,有空也研究一下.
 
这个问题有点意思,关注!
 
我都不知道你要干什么
 
完全可以!!!
我还是建议你用另外一个关联表保存附件,如果你在一个字段保存几个附件的内容,保存时需要写入标记,Load时需要进行流的定位处理。
 
我的意思是一个字段只保存一个附件的内容,很容易处理,我就是这样作的。
分开两个表:
表一: 文件编号 文件名称 ....
表二: 文件编号 附件内容
--------------------------
表一跟表二关联。
 
当然可以,用BLOBSTREAM,不就是一SELECT * FROM TABLE WHERE ID=?的语句嘛,把那个内容的字段 AS tBLOBSREAM就OK 了。然后用OLE。LOADFROMSTREAM就OK了
 
如果把BLOB数据压缩,调用流的load 和 save 就没有问题了吧。
 
没问题,用OleContainer1可以实现!下面是他实现的完整代码!
var
sfilename:string;
sb:tadoblobstream;//文件流
i:integer;
begin
sb:=tadoblobstream.Create(tblobfield(adoquery1.FieldByName('nr')),bmread);
sfilename:=extractfilepath(application.ExeName)+'temp/'+adoquery1.fieldbyname('wjmc').AsString;
sb.SaveToFile(sfilename);olecontainer1.CreateLinkToFile(sfilename,false);
end;
说明:存一个文件至少要用两个字段,上面代码中的nr存的是文件内容,wjmc存的是文件名称!
 
大家请看清楚:[blue]当我时同存入几个文件时[/blue]
所以我建议分开两个表,一个表专门保存附件的内容。
 
唉,存一个文件当然是没有问题的啦,问题是数据结构都这样定了。
现在存进去了,我们已经写了一个可以读的,不过是用临时文件的方法,
因有的机子设及到权限问题,不能写文件,所以行换个方法。
难道就真不能实现存放多个文件,然后用OLE一个个读出来吗??
 
天上掉馅饼---关注![8D]
 
唉,存一个文件当然是没有问题的啦,问题是数据结构都这样定了。
现在存进去了,我们已经写了一个可以读的,不过是用临时文件的方法,
因有的机子设及到权限问题,不能写文件,所以行换个方法。
难道就真不能实现存放多个文件,然后用OLE一个个读出来吗??

当然是可以做到,要用到流的指针定位(seek),把一个流分拆成几个流,
例如:
流 fileses
file1,file2,file3, 然后用OLE1从file1,OLE2从file2,OLE3从file3分别读出。
----
如果你有很多附件(例如50个),你用上面的方法也很难应付的,你可以用另外一个子表保存附件,一个记录保存一个附件,操作相当简单!

 
呵呵,我看过相关函数,不过不懂用。可以给个例子吗?
 
后退
顶部