MarshalOptions看说明,取值moMarshalModifiedOnly时,在序列化接口时只会传回异动的资料到中间层。
但是要注意以下几点:
(1)、要在TADODataSet Open后,设置moMarshalModifiedOnly才有效,Open前,如设计时,不会有效,可能算一个Bug,我测试Delphi15还是这样。
在中间层用接口来保存数据时,可以减少资料量。如:
procedure TADO2.SaveData(const ADataSet: _Recordset);
var
ADOC:TADOConnection;
ADOD:TADODataSet;
begin
ADOC:=TADOConnection.Create(nil);
ADOD:=TADODataSet.Create(nil);
try
ADOC.LoginPrompt:=false;
ADOC.ConnectionString:='xxxxxxxx';
ADOC.Open();
ADOD.LockType:=ltBatchOptimistic;
ADOD.CommandText:='select * from csUOMsSystems';
ADOD.Recordset:=ADataSet;
//顺序很重要,后设定Connection,否则保存不会成功
ADOD.Connection:=ADOC;
ADOD.SaveToFile('D:\ADO.xml',pfXML);
ADOD.UpdateBatch();
finally
ADOD.Free;
ADOC.Free;
end;
end;
(2)、moMarshalModifiedOnly对SaveToFile无效,即,SaveToFile是全部的资料。
这点比较讨厌,因为我们不能按自己的需要来序列化Delta,如,序列化成Byte Array,通过TCP传递到中间层。可惜ADO2.8后不再维护了。
如果用这种方式实现中间层更新资料,另一个比较纠结的问题是,DBMS产生的Auto Inc资料,default资料如何带回到客户端的DataSet中,否则,难道要Reopen吗?