一个老问题,关于Word和Database的,灌水的不要(200分)

  • 主题发起人 主题发起人 Chenlili
  • 开始时间 开始时间
C

Chenlili

Unregistered / Unconfirmed
GUEST, unregistred user!
要求:
1、word文档用ole的方式放在数据库中(这一布就不用灌水了)
2、能用word编辑这个ole字段
3、编辑以后,新的结果能保存到数据库中
以前我用的实现方式很臭,就不用说了。
我记得以前有人讲过的,可我这里速度太慢,检索不方便。
希望有高手能把符合要求的source贴上来,谢谢。
灌灌水也可以。
 
看看该目录底下的几个例子吧.....
.../Borland/Delphi5/Demos/Activex/Oleauto 对你应该有所帮助的!今天没有时间了,
明天或后天给你发个程序!!!你就明白了!
 
把字段读出来存成 .doc 文件,然后启动 word 进行编辑,结束后,
点一个按钮再存回去
 
呵呵,看来我捡着便宜了,看看下面的贴子吧,我粘来的。:)


来自:bigcorn 时间:00-11-29 16:24:24 ID:406556
在我的delphi程序中,我使用了OleContainer控件嵌入了一个word文档,当word文档是纯的文本
或是只有图象时,都可以在数据库中进行正常读取,但是如果在word文档中是图文形式的则
在数据库中存取不正常,取出后只能显示图象。我想是不是因为在word文档中嵌入了图象以后
则已经把word文档当作两个Ole对象,而在存取的时候只能存取一个对象,究竟该如何解决
希望大家能指点迷经。在下感激不尽。

我编程的开发环境是delphi4.0和SQL7.0 是使用的midas的三层结构
存取该word文档的字段类型是image
源程序如下

取出部分
var
sql:string;
str:TMemoryStream;
begin
sql:='select ZLPJ_BH,ZLPJ_BG from tbZLPJ where ZLPJ_BH='''+SPBH+'''';
zbClientDataSet.Close;
zbClientDataSet.Provider.DataQuest(sql);
zbClientDataSet.Open;
zbClientDataSet.Edit;
str:=TMemoryStream.Create();
TBlobField(zbClientDataSet.fieldbyname('ZLPJ_BG')).SaveToStream(str);
str.position:=0;
OleContainer2.LoadfromStream(str);
str.Free;
end;

存储部分

var
sql:string;
str:TMemoryStream;
begin
sql:='select ZLPJ_BH,ZLPJ_BG from tbZLPJ where ZLPJ_BH='''+SPBH+'''';
zbClientDataSet.Close;
zbClientDataSet.Provider.DataQuest(sql);
zbClientDataSet.Open;
zbClientDataSet.Edit;
str:=TMemoryStream.Create();
OleContainer1.SaveToStream(str);
str.Position:=0;
TBlobField(zbClientDataSet.fieldbyname('ZLPJ_BG')).LoadFromStream(str);
zbClientDataSet.Post;
zbClientDataSet.ApplyUpdates(0);
str.Free;
end;






--------------------------------------------------------------------------------
来自:jqw 时间:00-11-29 16:30:51 ID:406563
别忘了告诉我



--------------------------------------------------------------------------------
来自:wangxd 时间:00-11-29 17:29:59 ID:406656
把TMemoryStream换成TOleStream试试



--------------------------------------------------------------------------------
来自:thtfsyh 时间:00-11-29 18:21:13 ID:406724
这仅仅是因为你的BDE别名的blob size设置得太小了,
您设置大一些就行了,如10000
(单位为k,一定要大于文件大小!!!)
可在程序中动态设置
还有问题和我联系
h@sun.net.cn




--------------------------------------------------------------------------------
来自:bigcorn 时间:00-11-29 19:31:01 ID:406799
wangxd的方法我试了一下,但是不行,系统要报错。
请问一下thtfsyh,我存储word文档的字段类型是image,它在SQL server 中实际上只是存储
的只是一个指针,那要如何才能改变其大小?



--------------------------------------------------------------------------------
来自:bigcorn 时间:00-11-29 19:53:18 ID:406825
可能的确是字段的长度不够,当我的文档长度不长时,一切正常,一旦文档达到数百k就要
报一些莫名其妙的错误?请教thtfsyh如何在sql server中改变image字段的大小,它只是存储
的一个地址。请你能详细的给我介绍一下,我现在真的是十万火急。先谢过你了。



--------------------------------------------------------------------------------
来自:thtfsyh 时间:00-11-29 22:23:59 ID:407011
>这仅仅是因为你的BDE别名的blob size设置得太小了,
bde就是borland database engine,就是宝蓝数据库引擎了
在delphi安装的时候,都安装了的。

您可以启动
C:/Program Files/Borland/Delphi4/Bin/dbexplor.exe
点击您连接您的数据库的数据库别名,
然后在右边的详细信息(difinition)中的第三行blob size
设置一下,保存就行了。

不知我讲清楚了么?



--------------------------------------------------------------------------------
来自:bigcorn 时间:00-11-29 23:00:19 ID:407055
我已经按你的方法设置blob size为900,但是存储小文件可以,当我存储了一个含有图形
的大小为200多k的word文档,就不行了,存储进去的时候不报错,但是取出来的时候就报
“docfile 已被损坏”的信息,我就不知是怎么回事了,望指教。



--------------------------------------------------------------------------------
来自:sund 时间:00-11-30 16:26:26 ID:407814
sql server iamge型字段 最大存储长度?



--------------------------------------------------------------------------------
来自:bigcorn 时间:00-11-30 16:42:41 ID:407830
在这里感谢thtfsyh等各位仁兄,我的问题已经顺利解决了,问题还是出在bde的blob size
属性设置上,但是因为我的开发环境是delphi4和sql server2000,可能是delphi4的所带的
bde5.01的blob和sql server2000的image字段的兼容性的问题,后来我把sql server2000
卸了,重装了sql server7,一切就万事大吉了,存储大文件也没有问题了。
 
还是让我来结束这个帖子吧!!
程序如下!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables, OleCtnrs, ExtCtrls;
type
TOleF = class(TForm)
ole: TOleContainer;
Table1: TTable;
Panel1: TPanel;
Panel2: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
OleF: TOleF;
implementation
{$R *.DFM}
procedure TOleF.Button1Click(Sender: TObject);
var
oletest:Tstream;
begin
//新建OLE对象为用户编辑用
table1.open;
oletest:=table1.CreateBlobStream(table1.FieldbyName('blob'),bmread);
ole.CreateObject('word.document',false);
ole.DoVerb(ovshow);
oletest.free;
end;

procedure TOleF.Button2Click(Sender: TObject);
var stre:TMemoryStream;
begin
// ole对象中的内容写入到数据库中
table1.Edit;
table1.Append;
stre:=TMemoryStream.Create ;
ole.SaveToStream(stre);
TBlobField(table1.FieldbyName('blob')).LoadFromStream(stre);
ole.doverb(ovshow);
table1.post;
stre.free;
end;

procedure TOleF.Button3Click(Sender: TObject);
begin
ole.close; //关闭ole
end;

procedure TOleF.Button4Click(Sender: TObject);
begin
close; //退出本界面
end;

procedure TOleF.Button5Click(Sender: TObject);
VAR
oleDY:Tstream;
begin
//调用OLE对象为用户编辑用
table1.open;
table1.RecNo:=1;
oleDY:=table1.CreateBlobStream(table1.FieldbyName('blob'),bmread);
OLE.LoadFromSTREAM(OLEDY);
ole.DoVerb(ovshow);
oleDY.free;
end;

end.
 
xiao_Wen: 你那个 ole 变量在哪声明的?ole.CreateObject('word.document',false);
 
To Crab :
Ole :TOleContainer 呀! 它在delphi的system页!
很想和你交流交流,你有oicq号吗?可以发到我的信箱里!

To :Chenlili
“存盘退出”,你可以这样做:
var Stre:tmemorystream;
begin
Stre:=TMemoryStream.Create ;
Ole.SaveToStream(stre);
Table1.edit;
TBlobField(Table1.FieldbyName('blob1')).LoadFromStream(stre)
Table1.post;
Stre.free;
Ole.close;
Form.close;
end;

前一端时间也是为了解决这个问题,我都快见上帝了,后来终于让我琢磨出来了(当然我
作的是比你这个要求要复杂一些,“它需要吧数据库中的记录读到word摸板中,而且有的字段就是
一个word文档,等等,然后还要反过来吧摸板中的数据读到数据库中。。。。。。好在都做出来了
我也是在大富翁论坛看别人的回答。虽然很不满足自己的要求,但自己琢磨琢磨就出来了)

 
多人接受答案了。
 
后退
顶部