1.基本条件
因为数据量比较大,所以每次获取数据的时候都是分段取回的。
分段取回的处理是在服务器端执行SQL并取得一个ClientDataSet结果集,然后将结果集传回客户端并合并到客户端的ClientDataSet中。客户端的ClientDataSet是完全离线的,不跟服务器上的DataSetProvider发生任何联系。2.处理要求
在本地ClientDataSet进行数据增删改,然后进行提交。
现在我的做法是每处理一条数据,就向服务器提交一次。提交的处理完全是自己写代码完成,不通过控件提供的方法。提交的内容就是ClientDataSet的Delta。
服务器接受到Delta之后,会根据Delta的更新标记(Insert、modify)做一些字段处理,然后用事务提交数据库(通过SQL语句实现),成功后将更新的数据集(用ClientDataset存储)返回客户端,客户端再将最新的数据更新到本地ClientDataSet中。
举一个简单的例子吧,譬如用自增字段做表的主键,那么字段值是在服务器端提交后才产生的,客户端提交的时候根本就没有。提交数据成功之后,字段值就需要回传。Delphi在处理这个上面是有问题的,所以才需要手工处理。我选择回传的是一个ClientDataSet,在本地找到对应的记录后更新它。(这只是一个例子,这种情况其实也可以用另外的方法解决,但我思路的前提是尽量不用控件的方法去处理业务逻辑) 这样做的不好之处在于:因为每处理一条数据就要提交一次,会引起网络roundtrip的增加。但如果一次提交多条数据的话,业务层也可以把他们提交给服务器,就是怎么将提交后的数据一次取回呢?
因为数据量比较大,所以每次获取数据的时候都是分段取回的。
分段取回的处理是在服务器端执行SQL并取得一个ClientDataSet结果集,然后将结果集传回客户端并合并到客户端的ClientDataSet中。客户端的ClientDataSet是完全离线的,不跟服务器上的DataSetProvider发生任何联系。2.处理要求
在本地ClientDataSet进行数据增删改,然后进行提交。
现在我的做法是每处理一条数据,就向服务器提交一次。提交的处理完全是自己写代码完成,不通过控件提供的方法。提交的内容就是ClientDataSet的Delta。
服务器接受到Delta之后,会根据Delta的更新标记(Insert、modify)做一些字段处理,然后用事务提交数据库(通过SQL语句实现),成功后将更新的数据集(用ClientDataset存储)返回客户端,客户端再将最新的数据更新到本地ClientDataSet中。
举一个简单的例子吧,譬如用自增字段做表的主键,那么字段值是在服务器端提交后才产生的,客户端提交的时候根本就没有。提交数据成功之后,字段值就需要回传。Delphi在处理这个上面是有问题的,所以才需要手工处理。我选择回传的是一个ClientDataSet,在本地找到对应的记录后更新它。(这只是一个例子,这种情况其实也可以用另外的方法解决,但我思路的前提是尽量不用控件的方法去处理业务逻辑) 这样做的不好之处在于:因为每处理一条数据就要提交一次,会引起网络roundtrip的增加。但如果一次提交多条数据的话,业务层也可以把他们提交给服务器,就是怎么将提交后的数据一次取回呢?
v:Variant;
v:=DataSetProvider.ApplyUpdates(Delta);
把这个v带回客户端在客户端调用
ClientDataSet.reconcile(v);
可以尝试在中间层运用OOP设计方法,将数据封装在一些对象中,在客户端获取这些对象的
接口的引用来实现获取数据及更新数据.
由于COM+提供了事务处理能力,并且能轻易实现Object Pooling技术,所以可以选择了COM+组件
形式作为中间层.
如果返回的日志為空(代表全部提交成功)﹐合并日志的過程﹐你就可以自主控制了﹐在調用MergeChangeLog之前你完全可以做許多處理
我的網站﹕http://www.nineskysoft.com 里面的內容或許可看看