有把WORD文档存入SQLSERVER数据库的高手来看下~~~(100分)

  • 主题发起人 主题发起人 madeagle
  • 开始时间 开始时间
M

madeagle

Unregistered / Unconfirmed
GUEST, unregistred user!
有把WORD文档存入SQLSERVER数据库的高手来看下~~~

程序是这样的,
通过TBLOBSTREAM把WORD文档存入SQLSERVER的IMAGE字段,
用OLECONTAINER取出显示,
在做批量增加文档时,出现一些错误:
如果WORD版本不是当前的版本(比如2000,或97)就会出现WORD要重启被关闭以安全模式启动WORD,要么出现一个OFFICE的安装框,
后来没办法,就又做了一个批量转换WORD到当前版本的程序(搜索目录中WORD文档,用SAVEAS(FILENAME,FORMAT=WDFORMATDOCUMENT)的办法),但转换后在批量增加时还是会出现以上两个问题,但是错误少多了,不知道大家有没有什么根治的办法!
此外还有个问题,WORD存入数据库后数据库容量呈几何级增长,外面2M多的文档,存入数据库后居然会达到50多M,受不了,呵呵
 
第一个问题没试过,不知道
第二个格式问题
 
可能是化为二进制的问题吧,一个1.7兆的带图片的WORD文档另存为RTF格式,居然会达到39兆之大,转为二进制原理上可能也是相通的
 
保存到数据库
procedure TForm_main.bsSkinButton1Click(Sender: TObject);
var str:Tmemorystream;
templateName: OleVariant;
begin
str:=Tmemorystream.Create;
templateName :=edtfilepath.Text;
if templateName ='' then
begin
Msg.MessageDlg(NO_SELECTFILE,mtError,[mbok],0);
Exit;
end;
NoSelectCase(csedtno.Text);
str.LoadFromFile(templateName);
str.Position:=0;
Data.Query2.Close;
Data.Query2.Sql.Clear;
Data.Query2.SQL.Text := 'select * from tablename;
Data.Query2.Open;
Data.Query2.Append;
Tblobfield(Data.Query2.FieldByName('wordtext')).loadfromstream(str);//文件流
Data.Query2.FieldByName('wordfilename').AsString :=strFileName;//文件全名
Data.Query2.FieldByName('wordnumber').AsString :=strnumber;//文件大小
Data.Query2.FieldByName('wordid').AsString :=Data.GetDJNO('WD','wordid','T_Op_SaveWord');//文件编号
Data.Query2.FieldByName('caseid').AsString :=csedtno.Text;
try
Data.Query2.Post;
GetCaseDocument(csedtno.Text);
Msg.MessageDlg(OPER_SUCCESS,mtInformation,[mbok],0);
edtfilepath.Clear;
finally
str.Free;
end;
end;
读取也类似
 
joseph1018没弄明白我说的是啥问题,粘一堆代码,呵呵
导入和显示数据已经实现,就是批量导入的时候如果WORD版本不兼容总出问题
此外,WORD文档入库后容量太大,导致数据库空间呈几何级指数增长
主要是这两个问题
 
1、容量太大问题,可以在存数据库前先压缩,用delphi自带的TCompressionStream,读出来后用TDeCompressionStream解压缩。
2、保存到数据库本来不应该涉及到Word版本问题啊,本质上就是一个Binary文件而已。
 
压缩的我试一下,
WORD版本的问题呢是这样的
我批量添加的时候先用OLECONTAINER显示出来
CREATEFROMOBJECT();之后DOVERB
再用OLECONTAINER.COMOBJECT.RANGER.TEXT取WORD的文字内容作为简介
然后用OLECONTAINER.SAVETOSTREAM来存入数据库
出问题的时候就是DOVERB的时候
 
试了一哈,没的版本问题,不知道你是怎么做的
 
那是你的文档都是近年的,呵呵,我这儿有的文档是97的,有的是2000的,共有几千个文档,从9几年到现在的跨近十年的文档,你试下,有的里边有很多图片,有的里边的其他的东西,你是试的少呀
我是在批量添几十几百个文件时出的问题
 
文件确定是最近的,但版本是word97,2000,2003,不知道跟时间有没有关系.
 
我先前自己做的时候,批量添加是没问题的,
结果交付客户后,客户一用才知道这个是会出问题的,呵呵
后来又做了一个通用的批量转换WORD到当前版本的程序(搜索目录中WORD文档,用SAVEAS(FILENAME,FORMAT=WDFORMATDOCUMENT)的办法),错误发生的机率小多了
但还是会有一些问题,比如突然跳出个OFFICE安装框,让修复安装OFFICE
要么直接发生错误,要求以安全模式启动WORD,要调试,什么发送错误到微软等等
 
如果不是非得用OLEContainer不可,用Word打开吧
 
直接用COMOBJ打开WORD和OLECONTAINER打开WORD底层原理应该是一样的。
用OLE能和界面融为一起。看起来更专业一点,呵呵,当然是糊弄不懂的同志们的
 
用什么并无区别,
应该是你的代码有问题,具体是什么原因,没有代码不好说,
 
代码贴不上来,可能有什么限制
下面网址可以下载:
http://bbs.2ccc.com/attachments/2008/madeagle_2008115164825.rar
 
嗯,今晚有时间的话看看再说
 
有个问题没有搞清楚哈:为什么要用Ole打开,没看出有什么用处啊
你上面的代码,我测试了officeXP,2000,正常
 
真接用filestream应该能解决你的问题
 
主要是懒省事儿,另一个界面里放一个OLE用来单个添加和浏览WORD的,直接把代码拷过来,加个循环就完事了,
不出事儿是你测试的文档少,呵呵,我的客户的文档有很多,累积十几年的,啥格式的
.DOC都有
也可以直接用FILESTREAM存,关键是存的时候还要用RANGE.TEXT存内容简介,要取得简介就必须把该文档打开,没有别的办法,不用OLE,直接用COM方式打开也一样出问题,我试过了
我再想想别的办法吧,贴子再放两天,周末结贴
 
也许是吧,没有测试条件,帮不到你了
 

Similar threads

S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
后退
顶部