为什么doc不能存进数据库呢(提供源码)(100分)

  • 主题发起人 大内密探
  • 开始时间

大内密探

Unregistered / Unconfirmed
GUEST, unregistred user!
如果想要源程序的话,可以到ftp://qqpp.myip.org下载(不一定经常开)。
提示保存成功,可是程序关闭后重新启动,原先的保存在数据库里面的数据就没了。
不知道什么原因,请路过的高手赏个脸吧~~~~~~~~~~~~~~~~

procedure TForm1.Button2Click(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TBlobStream;
filename:string;
begin
OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC';
if OpenDialog1.Execute then
begin
filename:=OpenDialog1.FileName;
MyFile:=TFileStream.Create(fileName,fmOpenRead);
with table1 do
begin
Open;

insert;
// edit;
Stream := TBlobStream.Create(FieldByName('Doc') as TBlobField, bmWrite);{‘Doc’为BLOB字段名}
MemSize := MyFile.Size;
Inc(MemSize);
//增加的一字节给结尾的null
Buffer := AllocMem(MemSize);
try
Stream.Seek(0, soFromBeginning);
//流指针位置放到最前
MyFile.Read(Buffer^,MemSize);
Stream.Write(Buffer^,MemSize);
FieldByName('Name').Asstring:=ExtractFileName(fileName);
FieldByName('Size').Asstring:=inttostr(MemSize-1);
statictext1.caption:='文件名:'+ExtractFileName(fileName);
statictext2.caption:='文件大小:'+inttostr(Memsize-1)+'字节';
finally
MyFile.Free;
Stream.Free;
end;
try
Post;
except
showmessage('保存失败!');
halt;
end;
showmessage('保存成功,正在加载文档!');
Doc_ole.CreateObjectFromFile(fileName,False);
Doc_ole.Run;
end;
end;
end;
提示保存成功,可是程序关闭后重新启动,原先的数据就没了。不知道什么原因,请路过的高手赏个脸吧~~~~~~~~~~~~~~~~
 
to 大内密探:
1.你的代码应该可以使用,至于数据没了,可能是你没有更新至后台.
2.如果你仅仅是要将原来的Word文档保存至Blob数据字段,完全可以做得简单些,不用像你
的代码那么麻烦:

procedure TForm1.Button1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
Filter:='WORD文檔(*.DOC)|*.DOC';
if Execute then
begin
with Table1 do
begin
Open;
Insert;
TBlobField(FieldByName('Doc')).LoadFromFile(FileName);
Post;
end;
end;
end;
end;
 
我没仔细看你的程序,不过我做过类似的程序,可以。贴给你供参考吧。
procedure TForm1.Button1Click(Sender: TObject);
var
str:Tmemorystream;
begin
str:=Tmemorystream.Create;
str.LoadFromFile('e:/a.doc');
str.Position:=0;
query1.Append;
Tblobfield(query1.FieldByName('doc')).loadfromstream(str);
try
query1.Post;
finally
str.Free;
end;
end;//存储文件

procedure TForm1.Button2Click(Sender: TObject);
var
str:Tmemorystream;
begin
str:=Tmemorystream.Create;
str.Position:=0;
Tblobfield(query1.FieldByName('doc')).savetostream(str);
OleContainer1.LoadFromStream(str);
str.SaveToFile('e:/b.doc');
str.Free;//导出文件
end;
 
以前有过类似的帖子,你也可以找一下.另外转贴给你篇文章.你自己修炼吧.
---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台
工具。在以Delphi为前台,一些大型数据库为后台的MIS系统中,图
形的处理不可避免;即从以Delphi开发的前台界面输入图形,并保
存到相应的数据库字段中。在这种形式的图形处理中,BMP文件的处
理比较简单,因为Delphi本身有Image和DBImage构件,用这些构件
与数据库中可以保存图形的大型字段BLOB比较容易地进行数据交
换。以这种方式进行图形处理已应用在许多MIS软件中,包括处理人
员照片的人事档案系统等。
---- 但是,BMP文件一般都比较大。而且有时要录入的是自己在计
算机上画的简图,并伴随大量文字说明。这种情况用Win95中的画图
板等处理BMP文件的工具处理就比较困难。一般应用人员都喜欢用
WORD画图和写说明文字,然后保存到数据库中。
---- 经过一段时间的摸索,我们解决了这个问题,并经过完善,在
应用中运行较好。程序如下:
procedure TsampleForm.OpenDOCClick(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TBlobStream;
begin
OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC';{从对话窗选择
文件}
if OpenDialog1.Execute then
begin
MyFile:=TFileStream.Create(OpenDialog1.FileName,fmOpenR
ead);
with table1 do {‘table1’为含BLOB字段的表名}
begin
Open;
Edit;
Stream := TBlobStream.Create(FieldByName('Doc') as
TBlobField, bmWrite);{‘Doc’为BLOB字段名}
MemSize := MyFile.Size;
Inc(MemSize); {Make room for the buffer's null
terminator.}
Buffer := AllocMem(MemSize); {Allocate the
memory.}
try
Stream.Seek(0, soFromBeginning); {Seek 0 bytes
from the stream's end point}
MyFile.Read(Buffer^,MemSize);
Stream.Write(Buffer^,MemSize);
finally
MyFile.Free;
Stream.Free;
end;
try
Post;
except
on E: EDatabaseError do
if HandelException(E)< >0 then
exit
else
raise;
end;
end;
Doc_ole.CreateObjectFromFile(OpenDialog1.FileName,False
);
Doc_ole.Run;{Doc_ole为ToleContainer构件名}
end;
end;
---- 以上为向数据库中写入的程序,应用中从对话窗取出文件在
ToleContainer构件中显示的同时存入数据库。

procedure TsampleForm.GetDocClick(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TBlobStream;
begin
MyFile:=TFileStream.Create('c:/temp.tmp',fmCreate);
with Query1 do
begin
Stream := TBlobStream.Create(FieldByName('Doc') as
TBlobField, bmRead);
MemSize := Stream.Size;
Inc(MemSize); {Make room for the buffer's null
terminator.}
Buffer := AllocMem(MemSize); {Allocate the
memory.}
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');
Doc_ole.CreateObjectFromFile('c:/temp.DOC',False);
Doc_ole.Run;
end;
end;

---- 以上程序为从数据库从将WORD文档取出,并放在temp.doc的临
时文件上并在ToleContainer构件中显示。

---- 在程序的其他部份应准确控制表记录指针,使WORD文档的存取
发生在正确的记录位置。

 
如何存取
 
不知道你上的各种方法是否可以,反正我试过以上的各种方法从ORACLE
的BLOB字段中存取Excel文件,效果都不理想,最后只好采用变通的方法
先将文件压缩再存,取出时也是先取出然后解压,这样才算解决了问题。
不知道各位有何高见。(我说的是针对Oracle的BLOB字段)
 
顶部