TOleContainter中嵌入Word97后,怎样把数据存到数据库中去,怎样读出来,(100分)

  • 主题发起人 主题发起人 bobowen
  • 开始时间 开始时间
B

bobowen

Unregistered / Unconfirmed
GUEST, unregistred user!
这是一个较难的问题:
TOleContainter中嵌入Word97,然后怎样把word中的数据存到数据库中去,怎样把数据从库中读出来返回到word上.
哪位高手有想法请与我联系:bobowen@263.net
 
用blob字段(f4为例子)

保存:

var
str:TMemoryStream;
begin
str:=TMemoryStream.Create();
table1.edit;
OleContainer1.SaveToStream(str);
TBlobField(table1.fieldbyname('f4')).LoadFromStream(str);
table1.Post;
str.Free;
end;

装入:

var
str:TBlobStream;
begin
str:=TBlobStream.Create(TBlobField(table1.fieldbyname('f4')),bmRead);
OleContainer1.LoadfromStream(str);
str.Free;
end;
 
Pipi: 谢谢你的解答,但我用你的方法把数据保存到数据库中去后,数据库中只显示‘BDOC’四个字母,从数据库中读出来时又出错。 提示‘ Read Stream Error'
我希望与您建立联系,我的E-mail:bobowen@263.net,我的总分目前不多,20分以表心意
 
还要再倒出来olecontainer中才能看啊
 
Pipi师兄:您好!
我还是个新手,你说的再倒出来 olecontainer 才能看是怎么一回事。有源码?
那个‘read stream error’错不出了,但在执行了
OleContainer1.LoadfromStream(str);
报错:‘1% 已存在’ 提示!
希望您的指导

 
你用来保存ole的field的类型是什么?有些类型不行,
有些blob类型会将数据变了(变成可见字符)
比如dbf的memo就不行,我没有sqlserver,下面的f2是
paradox的blob binary field,没有任何问题。

保存到数据库:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Table1->Edit();
TBlobStream* str=new TBlobStream((TBlobField*)Table1->FieldByName("f2"),bmWrite);
OleContainer1->SaveToStream(str);
delete str;
Table1->Post();
}

从数据库读出到 olecontainer:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
TBlobStream* str=new TBlobStream((TBlobField*)Table1->FieldByName("f2"),bmRead);
OleContainer1->LoadFromStream(str);
delete str;
}
 
//试试我这个吧
用olecontainer显示的话
procedure savetodb;//保存到数据库
var
st:TStringStream;
begin
st := tstringstream.create('');
olecontainer1.createfromfile('c:/xxx.cdx',true);//也可以是..('xx.cdx',false);
olecontainer1.savetostream(st);
query1.sql.text := 'insert into TableX Doc_field values :Doc';
query1.parambyname('cdx').asblob := st.datastring;
query1.execsql;
st.free;
end;

procedure loadfromdb;//从数据库载入
var
st:TStringStream;
blobsteam:Tblobstream;
begin
st:= tstringstream.create('');
blobStream := TBlobStream.Create(Table1cdx, bmRead);
if BlobStream.Size = 0 then begin
BlobStream.Free;
Exit;
end;
st.CopyFrom(BlobStream, BlobStream.Size);
st.position:=0;//可能直接
olecontainer1.loadfromstream(st);
//可能直接blobstream.position:=0,olecontainer1.loadfromstream(blobstream);也行
st.free;
BlobStream.Free;
end;


 
Pipi: 用paradox作数据库确实可以,为什么我用MS SQL Server的Text类型的字段,存入数据与paradox一样,但执行olecontainer.LoadfromStream时,SQL Server就报错:‘1%已存在‘ ,为什么呢?

Hubdog: 你的程序没有测试!
 
是sqlserver7吗,sqlserver我没用过,听说bde访问它会有点问题,不知道是不是
bde 的问题
 
Pipi: 我用的是Sql server7.0! BDE的问题吗?
不知道还有谁有这方面的经验,能一起探讨?
谢谢Pipi
 
将 BDE 的 BOLB SIZE 改大,如2094.
用Image字段。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
739
SUNSTONE的Delphi笔记
S
S
回复
0
查看
749
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部