clientdataset的savetofile问?(50分)

  • 主题发起人 主题发起人 dudajiang
  • 开始时间 开始时间
D

dudajiang

Unregistered / Unconfirmed
GUEST, unregistred user!
我看到李维的书上说,当用clientdataset的savetofile存数据时,有一个严重的缺点,就是
SAVETOFILE方法会向应用服务器取得数据表中的所有数据(有10000条就取10000条),为此他
还专门写了一个组件来解决这个问题,但是我发现不象他说的,例如我只向应用服务器取了
10条记录,然后我调用SAVETOFILE,存到AA.DAT中,再用LOADFROMFILE显示存的数据,结果只有
10条记录.请问到底是怎么样的?
 
clientdataset的savetofile存数据是存data,delta数据封包,
ftclientdataset的savetofile存数据是存delta数据封包,
我估计李维说的情况是在中间件相应的数据操纵控件的active属性为false的情况
由于应用服务器不负责维护中间件ado缓存中的数据,因此clientdataset
要向数据库服务器申请更多的数据.
你做的例子是否是设置中间件相应的数据操纵控件(例:adoquery,query)的active属性
为true?
 
如果FatchOnDemand 设为 True,并且 PacketRecords > 0 的时候就会出现李维说的情况。
 
to shsshashssha:
我的tquery也是false
to bbkxjy:
当FatchOnDemand =true时,我的PacketRecord就不起作用了,它总是在启动时将所
有记录一次全取过来,这样在savetofile时将所有的记录存下来也不会在再多占网络资源。
而我看李维的意思是如果我当前的clientdataset里只有10条记录,用savetofile时会将
所有的10000条记录取过来从而额外占用网络资源。而我并没有这种情况出现。
 
FetchOnDemand = True, PacketRecords = -1 时才在激活时将所有记录一次全取过来的。
我前面说了是 FetchOnDemand = True, PacketRecords > 0 时会出现李维所说的情况。
你可以试试。
 
原先的理解有偏差
代码:
procedure TDataModule2.ClientDataSet2BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);

begin
i:=i+1;
showmessage('第'+inttostr(i)+'次取数据封包');
end;

procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
i:=0;
end;


procedure TForm1.Button7Click(Sender: TObject);
begin
showmessage(inttostr(DataModule2.ClientDataSet2.RecordCount));

end;

procedure TForm1.Button3Click(Sender: TObject);
begin

DataModule2.ClientDataSet2.SaveToFile('temp.xml');
DataModule2.ClientDataSet2.LoadFromFile('temp.xml');

end;

DataModule2.DCOMConnection1.Connected:=true的情况下,
一共7笔
ClientDataSet2.fetchonDemand:=true;
ClientDataSet2.packet:=1;
ClientDataSet2open后,激活ClientDataSet2BeforeGetRecords事件
显见一共取7个数据包
在第4个数据包到客户端时,调用SaveToFile('temp.xml')//open//commandtext,adoquery
显然(4个)temp.xml:1.87k---DCOMConnection1.Connected:=false
(7个):2.58k----DCOMConnection1.Connected:=true
DataModule2.ClientDataSet2.CommandText:='select * from order1 where zdcode='+''''
+'2001-0901'+'''';
DataModule2.ClientDataSet2.Open;
2个 trmp.xml--1.40k---DCOMConnection1.Connected:=true
///服务器异常
DCOMConnection1.Connected:=false
SaveToFile('temp.xml');//存当前客户端的data数据包
2个 trmp.xml--1.40k(0.23k/1)

人为设置DCOMConnection1.Connected:=false,客户端重新连接中间件,直接要求中间件
提供数据,按adoquery.sql下载数据
 
小结:
ClientDataSet2.fetchonDemand:=true;ClientDataSet2.packet:<>-1;
中间件是一个状态对象,它要负责维护数据封包的游标,
open后,不断下载数据包直到计划的结果集全部下载完毕.
savetofile方法存储按原先打开的sql叙述下载的数据包和delta数据包,它是重新从
数据库下载数据来反映前的data数据集状态.
原因: clientdataset.savetofile方法仍会按照原先打开的sql叙述向数据库服务器
请求数据.
sql叙述: //执行优先级
1.clientdataset.commandtext
2.query.sql
所以,解决办法是clientdataset开始下载数据时,返回一个用户需要的子结果集,而不是
整个数据集.
///只有服务器异常的情况,savetofile方法才存当前客户端的data数据包
李维的控件的savetodeltafile方法通过属性设置,可以不重新请求,只存当前客户端的
data数据集和delta数据包
 
多人接受答案了。
 
后退
顶部