ClientDataSet的Data和Delta在服务端为何无区别?(100分)

  • 主题发起人 主题发起人 云淡风轻
  • 开始时间 开始时间

云淡风轻

Unregistered / Unconfirmed
GUEST, unregistred user!
在客户端ClientDataSet1的Data和Delta有区别(分别是所有数据和更新数据),可是
ClientDataSet1.ApplyUpdate(0)后,在应用程序服务器接收到的ClientDataSet的Data和Delta怎么都只
是更新的那部分数据?在中间层测试客户端返回来的ClientDataSet1.Data和ClientDataSet1.Delta的程
序如下:
procedure TServerRDM0519.DataSetProvider1BeforeUpdateRecord(
Sender: TObject;
SourceDS: TDataSet;
DeltaDS: TClientDataSet;
UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
Form1.ClientDataSet1.Data:=DeltaDS.Data;
Form1.ClientDataSet2.Data:=DeltaDS.Delta;

end;

服务端Form1中有两个DBGrid分别和ClientDataSet1及ClientDataSet2相联,显示结果一样,都是更改的
数据。按理,DeltaDS.Data该是全部数据的。怎么会这样呢?哪位帮忙答答疑。
 
你的想法与实际情况有一些出入,请看客户端applyupdate的源码:
function TClientDataSet.ApplyUpdates(MaxErrors: Integer): Integer;
begin
CheckBrowseMode;
if ChangeCount = 0 then
Result := 0 else
Reconcile(DoApplyUpdates(Delta, MaxErrors, Result));
//传递delta
end;

明白了吧,在存盘时,只传递了delta到服务器,这很容易理解,传递无变动的数据
不是浪费网络资源吗?
当然,由于服务器端只有delta数据,那么data(全部数据)与delta(变动数据)当然
相等了。
 
对了,delta只是包含修改了的数据
这也是ClientDataSet的一个优点,提高效率
 
谢谢myname的回答。我知道了可以通过DataSetProvider分别获得更新前的全部数据和更新后的全部数据
,代码如下:
procedure TServerRDM0519.DataSetProvider1BeforeApplyUpdates(
Sender: TObject;
var OwnerData: OleVariant);
begin
Form1.ClientDataSet1.data:=DataSetProvider1.Data;//ClientDataSet1容纳更新前的数据
end;

procedure TServerRDM0519.DataSetProvider1AfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
ADOQuery1.Active:=false;//其中,DataSetProvider.DataSet:=ADOQuery1,但不知道为什么要关闭ADOQuery1
Form1.ClientDataSet3.data:=DataSetProvider1.Data;//ClientDataSet3容纳更新后的数据
end;
 
多人接受答案了。
 
后退
顶部