怎样将word 文档村到数据表内?急急急。。。(100分)

  • 主题发起人 主题发起人 小匆匆
  • 开始时间 开始时间

小匆匆

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
我做了一个三层结构系统,先需将word文档内容(当然包含文本、表格、图片、艺术字
之类的内容)村到sql server 7的一个字段中(字段类型为image),但是始终找不到办法。
我在一本书上看到,首先通过word文档创建一个文件流,然后根据待插入内容的字段(
TBlobField)创建一个Blob流,然后将文件流内容写道Blob流之中,但我建立不了这个Blob
流,出现一个Invalid class Type def 之类的错误!请问大虾:
(1)我应该注意什么事项?
(2)除了以上方法还是否有其他方法?
因为我在写毕业论文,急需解决此问题,望大虾关注。。。
 
ADOTable1WordFile :TBlobField;
直接ADOTable1WordFile.LoadFromFile ('c:/EJob08.doc')不就完了.
 
我用过你说的方法,而且用了流的方法,但是得到的多时乱码,虽然往表字段存了东西,
但是让他在用word来打开的时候,原来就包括几个字的文件竟然旁达到7页长,他好像把
word的格式也一块存进取,不只还有什么方法?
 
我想是不是有直接在WORD保存时保存至数据库的方法呢?用VBA写个类似功能,我见过,但没见VBA的原程序。有认知道请侍教。
 
var
FieldCont : TBlobStream;
filestm : TFileStream;
begin
ADOQuery1.Open;
FileStm := TFileStream.Create('D:/华南/ccc.doc',fmCreate);
FieldCont := TBlobStream(ADOQuery1.CreateBlobStream(ADOQuery1.FieldByName('content'),bmRead));
FileStm.CopyFrom(FieldCont,FieldCont.size);
FileStm.Free;
FieldCont.Free;
end;
 
我是不是没有说清楚:
我做了一个三层结构系统,现需将word文档内容(当然包含文本、表格、图片、艺术字
之类的内容)存到sql server 7的一个字段中(字段类型为image),但是始终找不到办法。
我在一本书上看到,首先通过word文档创建一个文件流,然后根据待插入内容的字段(
TBlobField)创建一个Blob流,然后将文件流内容写道Blob流之中,但我建立不了这个Blob
流,出现一个Invalid class Type def 之类的错误!请问大虾:
(1)我应该注意什么事项?
(2)除了以上方法还是否有其他方法?
因为我在写毕业论文,急需解决此问题,望大虾关注。。。

 
var
filestm : TFileStream;
begin
FileStm := TFileStream.Create('xxx.doc',fmOpenRead));
Table1.Append;

//在数据库中添加一条记录
TBlobField(Table1.FieldbyName('doc')).LoadFromStream(FileStm );
Table1.Post;
end
这是大致算法,其实和前几位差不多,只是用这种方法时要考虑BLOB的32K限制
 
BLOB的32K限制可以在BDE的配置中改大的
 
各位大虾:我已经试过了差不多所有的方法,但是将word文件存到sql server 以后(是
Image类型字段)在把它读出来就不是原来的内容了,所以我纳闷是不是sqlserver的iMAGE
字段不支持存下word文档呢?或者要求先把文档内容变成图片以后在存?但是如果这样的话
我再把这字段值从中读出来的时候他就不是word文档了呀?
后来我改用paradox数据库,能实现将word文档读进表字段中,而且也可以读出来,但是
在三层结构中用paradox数据库可以吗?有谁用过或试过吗?
 
sql server中用image或是text字段都行,可以保存任何文件类型,读出时还可以改名
procedure TForm1.Button1Click(Sender: TObject);//保存文件
var str:Tmemorystream;
begin
str:=Tmemorystream.Create;
str.LoadFromFile('f:/page.doc');
str.Position:=0;
adoquery1.Append;
Tblobfield(adoquery1.FieldByName('tt')).loadfromstream(str);
try
adoquery1.Post;
finally
str.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);//读取文件
var str:Tmemorystream;
begin
str:=Tmemorystream.Create;
str.Position:=0;
Tblobfield(adoquery1.FieldByName('tt')).savetostream(str);
str.SaveToFile('F:/page.doc');
str.Free;
end;
 
我试一试,你说得能在三层应用中实现呢?
 
用TBlobstream得到的就是乱码,但读出后确不是!?
 
我也遇到同样的问题。
to terry_lzs:
你的方法在两层结构中是没问题的,但是在三层结构中,我试过,不能保存到数据库,
不过在执行过程中没报任何错误,只不过数据死活就是没存到数据库。不知道是何原因。
能否给一段三层结构的程序。先谢谢了!
 
var
tfStream:TFileStream;
tbStream:TBlobStream;
nbufsize:integer;
pbuf:PChar;
// i,imglsh:integer;
begin
With ADOTable1do
begin
if Active = false then
Active := true;
Append;
try
tfStream:=TFileStream.Create(FilePath,fmOpenRead);
nbufsize:=tfStream.Size +1;
pbuf:=AllocMem(nbufsize);
tfStream.Read(pbuf^,nbufsize);
tbStream:=TBlobStream.Create((fieldbyname('TestImage') as TBlobField),bmWrite);
tbStream.Seek(0,SoFrombegin
ning);
tbStream.Write(pbuf^,nbufsize);
finally
tfStream.Free ;
tbStream.Free ;
post;
FreeMem(pbuf,nbufsize);
Active:=False;
end;
end;
end;
 
不用什么,在中间件加入一个方法就可实现:
server:
function GetFile(const FileName: string): OleVariant;
var
P: Pointer;
begin
VarClear(Result);//不知D5有没。
with TFileStream.Create(FileName, fmShareDenyNone)do
try
Result := VarArrayCreate([0, Size], varByte);
P := VarArrayLock(Result);
Read(P^, Size);
finally
Free;
VarArrayUnLock(Result);
end;
end;

client;
procedure GetFile(const FileName: string);
var
P: Pointer;
Data: OleVariant;
Count: Integer;
begin
Data := SocketConnection1.AppServer.GetFile(FileName);
with TFileStream.Create('c:/temp/'+ ExtractFileName(FileName), fmCreate)do
try
P := VarArrayLock(Data);
Count := VarArrayHighBound(Data, 1);
Write(P^, Count);
finally
Free;
VarArrayUnLock(Data);
end;
end;
 
http://www.playicq.com/
作品推荐图文处理
 
trichview7.11
 
后退
顶部