还是delphi+oracle数据库,带偶的博士要求能够在delphi下直接把数据库中的word文档打开,找了半天找到一个demo,可以在数据库中存储word文档,是用ole来实现,如下:unit oleUnit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtnrs, StdCtrls, DB, DBTables;type
TForm1 = class(TForm)
Table1: TTable;
OpenDialog1: TOpenDialog;
Button1: TButton;
Button2: TButton;
OleContainer1: TOleContainer;
Database1: TDatabase;
Button3: TButton;
Table1NAME: TStringField;
Table1SIZE1: TStringField;
Table1DOC: TBlobField;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
memsize:integer;
buffer:pchar;
myfile:tfilestream;
stream:tblobstream;
begin
myfile:=tfilestream.Create('c:\temp.tmp',fmcreate);
with table1 do
begin
open;
stream:=tblobstream.Create(fieldbyname('doc')as tblobfield,bmread);
memsize:=stream.Size;
inc(memsize);
buffer:=allocmem(memsize);
try
stream.Read(buffer^,memsize);
myfile.Write(buffer^,memsize);
finally
myfile.Free;
stream.Free;
end;
end;
if fileexists('c:\temp.doc') then
deletefile('c:\temp.doc');
if fileexists('c:\temp.tmp') then
begin
renamefile('c:\temp.tmp','c:\temp.doc');
OleContainer1.CreateObjectFromFile('c:\temp.doc',false);
OleContainer1.Run;
end;end;procedure TForm1.Button2Click(Sender: TObject);
var
memsize:integer;
buffer:pchar;
myfile:tfilestream;
stream:tblobstream;
filename:string;
begin
opendialog1.filter:='(*.doc)|*.doc';
if opendialog1.Execute then
begin
filename:=opendialog1.FileName;
myfile:=tfilestream.Create(filename,fmopenread);
with table1 do
begin
open;
edit;
stream:=tblobstream.Create(fieldbyname('doc')as tblobfield,bmwrite);
memsize:=myfile.Size;
inc(memsize);
buffer:=allocmem(memsize);
try
stream.Seek(0,sofrombeginning);
myfile.Read(buffer^,memsize);
stream.Write(buffer^,memsize);
fieldbyname('name').AsString:=extractfilename(filename);
fieldbyname('size1').AsString:=inttostr(memsize-1);
finally
myfile.Free;
stream.Free;
end;
try
table1.Post;
except
showmessage('保存失败');
halt;
end;
showmessage('保存成功');
OleContainer1.createobjectfromfile(filename,false);
OleContainer1.run;
end;
end;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
OleContainer1.CleanupInstance;
OleContainer1.Refresh;
end;end.出的问题;1.小文档存取没有问题,可是40K以上,就报错project oleproject1.exe raised exception class EDBEngineError with message'Invalid BLOB length.'.Process stopped....2。只是反复在数据库的第一条记录上存取。这也太不实际了,我可是有上千条记录等着输入啊。哪位大侠给点提示方案,等着救命呢
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtnrs, StdCtrls, DB, DBTables;type
TForm1 = class(TForm)
Table1: TTable;
OpenDialog1: TOpenDialog;
Button1: TButton;
Button2: TButton;
OleContainer1: TOleContainer;
Database1: TDatabase;
Button3: TButton;
Table1NAME: TStringField;
Table1SIZE1: TStringField;
Table1DOC: TBlobField;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
memsize:integer;
buffer:pchar;
myfile:tfilestream;
stream:tblobstream;
begin
myfile:=tfilestream.Create('c:\temp.tmp',fmcreate);
with table1 do
begin
open;
stream:=tblobstream.Create(fieldbyname('doc')as tblobfield,bmread);
memsize:=stream.Size;
inc(memsize);
buffer:=allocmem(memsize);
try
stream.Read(buffer^,memsize);
myfile.Write(buffer^,memsize);
finally
myfile.Free;
stream.Free;
end;
end;
if fileexists('c:\temp.doc') then
deletefile('c:\temp.doc');
if fileexists('c:\temp.tmp') then
begin
renamefile('c:\temp.tmp','c:\temp.doc');
OleContainer1.CreateObjectFromFile('c:\temp.doc',false);
OleContainer1.Run;
end;end;procedure TForm1.Button2Click(Sender: TObject);
var
memsize:integer;
buffer:pchar;
myfile:tfilestream;
stream:tblobstream;
filename:string;
begin
opendialog1.filter:='(*.doc)|*.doc';
if opendialog1.Execute then
begin
filename:=opendialog1.FileName;
myfile:=tfilestream.Create(filename,fmopenread);
with table1 do
begin
open;
edit;
stream:=tblobstream.Create(fieldbyname('doc')as tblobfield,bmwrite);
memsize:=myfile.Size;
inc(memsize);
buffer:=allocmem(memsize);
try
stream.Seek(0,sofrombeginning);
myfile.Read(buffer^,memsize);
stream.Write(buffer^,memsize);
fieldbyname('name').AsString:=extractfilename(filename);
fieldbyname('size1').AsString:=inttostr(memsize-1);
finally
myfile.Free;
stream.Free;
end;
try
table1.Post;
except
showmessage('保存失败');
halt;
end;
showmessage('保存成功');
OleContainer1.createobjectfromfile(filename,false);
OleContainer1.run;
end;
end;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
OleContainer1.CleanupInstance;
OleContainer1.Refresh;
end;end.出的问题;1.小文档存取没有问题,可是40K以上,就报错project oleproject1.exe raised exception class EDBEngineError with message'Invalid BLOB length.'.Process stopped....2。只是反复在数据库的第一条记录上存取。这也太不实际了,我可是有上千条记录等着输入啊。哪位大侠给点提示方案,等着救命呢
解决方案 »
- 如何获取局域网中指定计算机名的IP地址
- 如何在程序中继承另一窗体内的控件
- 请教关于FastReport打印的一个很简单的问题.如何将Form1.Edit1的值赋给报表的memo1.
- 请教个问题,string变量能否显式释放
- dbgrid中如何可以一次选择多行?
- 用delphi 怎样把我的一些资源文件(图标,图片...)通过编译包含进入生成的可执行文件?
- 程序员游戏爱好大调查
- 光盘加密的网址或资料?请大家帮忙!
- 如何用DELPHI实现智能小区的GIS???
- 谁有Windows消息大全?
- 关于“为CSDN喝彩”那个帖中没领到分的兄弟再来领分
- 请教一个显示随机算法查找结果的问题!!!~~~~(毕业设计着急中)
bde默认的blob size是32k 超过这个数值会自动截断
解决的方法是在建立bde连接时将 database的blob size 改大 如
database1.params['blob size']:=1024 则可存放1m的文件了
Table1.First;
while not Table.Eof do begin
........
........
Table.Next
end;
在
procedure TForm1.Button2Click(Sender: TObject);
var
memsize:integer;
buffer:pchar;
myfile:tfilestream;
stream:tblobstream;
filename:string;
begin
opendialog1.filter:='(*.doc)|*.doc';
if opendialog1.Execute then
begin
filename:=opendialog1.FileName;
myfile:=tfilestream.Create(filename,fmopenread);
with table1 do
begin
open;
edit;
——————————
后面添加语句:
if table1.bof=true then
showmessage ('ok');
if table1.eof=false then
showmessage('ok');运行程序后,两个对话框相继弹出,说明现在指针指的是第一条记录,而且不是最后一条。然后,我在showmessage('保存成功');
OleContainer1.createobjectfromfile(filename,false);
OleContainer1.run;
——————————————————————
后面添加
table1.next;单步调试程序,一直到弹出‘保存成功’的对话框都是好的,可是一运行table1.next
就报错:microsoft ODBC驱动程序管理器错误。如果我改成table1.prior,就可以运行。但是指针明明是在第一条记录上的啊,怎么能还往前移呢?运行了几次,回头再看数据库,还只是在第一条也是唯一一条记录上反复修改。想了半天都不知道为什么,还望高手指点!
用一个table,dbnavigator就可以了,代码如下begin
if opendialog1.execute then begin
table1name.asstring:=extractfilename(opendialog1.filename);
olecontainer1.creatobjectfromfile(opendialog1.filename,false);
olecontainer1.savetofile('temp');
table1files.loadfromfile('temp');
end;
end;
http://expert.csdn.net/Expert/topic/1830/1830978.xml?temp=.5713465