1.基本条件
    因为数据量比较大,所以每次获取数据的时候都是分段取回的。
    分段取回的处理是在服务器端执行SQL并取得一个ClientDataSet结果集,然后将结果集传回客户端并合并到客户端的ClientDataSet中。客户端的ClientDataSet是完全离线的,不跟服务器上的DataSetProvider发生任何联系。2.处理要求
   在本地ClientDataSet进行数据增删改,然后进行提交。
   现在我的做法是每处理一条数据,就向服务器提交一次。提交的处理完全是自己写代码完成,不通过控件提供的方法。提交的内容就是ClientDataSet的Delta。
   服务器接受到Delta之后,会根据Delta的更新标记(Insert、modify)做一些字段处理,然后用事务提交数据库(通过SQL语句实现),成功后将更新的数据集(用ClientDataset存储)返回客户端,客户端再将最新的数据更新到本地ClientDataSet中。
   举一个简单的例子吧,譬如用自增字段做表的主键,那么字段值是在服务器端提交后才产生的,客户端提交的时候根本就没有。提交数据成功之后,字段值就需要回传。Delphi在处理这个上面是有问题的,所以才需要手工处理。我选择回传的是一个ClientDataSet,在本地找到对应的记录后更新它。(这只是一个例子,这种情况其实也可以用另外的方法解决,但我思路的前提是尽量不用控件的方法去处理业务逻辑)   这样做的不好之处在于:因为每处理一条数据就要提交一次,会引起网络roundtrip的增加。但如果一次提交多条数据的话,业务层也可以把他们提交给服务器,就是怎么将提交后的数据一次取回呢?

解决方案 »

  1.   

    把服务器的更新带回客户端合并,是用
    v:Variant;
    v:=DataSetProvider.ApplyUpdates(Delta);
    把这个v带回客户端在客户端调用
    ClientDataSet.reconcile(v);
      

  2.   

        在数据库应用的三层结构中,客户端能够取得应用程序服务器的接口方法来获取与更新数据.
    可以尝试在中间层运用OOP设计方法,将数据封装在一些对象中,在客户端获取这些对象的
    接口的引用来实现获取数据及更新数据.
        由于COM+提供了事务处理能力,并且能轻易实现Object Pooling技术,所以可以选择了COM+组件
    形式作为中间层.
      

  3.   

    將delta打包提交﹐在TDataSetProvider的OnBeforeUdpateData事件中自主控制提交過程(提交不成功﹐使用raise建個異常即可﹐這個異常在運行程序時不會顯示﹐但會返回在提交不成功能的日志中)
    如果返回的日志為空(代表全部提交成功)﹐合并日志的過程﹐你就可以自主控制了﹐在調用MergeChangeLog之前你完全可以做許多處理 
    我的網站﹕http://www.nineskysoft.com  里面的內容或許可看看