三层结构下数据更新的回传问题

cobi 2007-11-14 02:37:14
1.基本条件
因为数据量比较大,所以每次获取数据的时候都是分段取回的。
分段取回的处理是在服务器端执行SQL并取得一个ClientDataSet结果集,然后将结果集传回客户端并合并到客户端的ClientDataSet中。客户端的ClientDataSet是完全离线的,不跟服务器上的DataSetProvider发生任何联系。

2.处理要求
在本地ClientDataSet进行数据增删改,然后进行提交。
现在我的做法是每处理一条数据,就向服务器提交一次。提交的处理完全是自己写代码完成,不通过控件提供的方法。提交的内容就是ClientDataSet的Delta。
服务器接受到Delta之后,会根据Delta的更新标记(Insert、modify)做一些字段处理,然后用事务提交数据库(通过SQL语句实现),成功后将更新的数据集(用ClientDataset存储)返回客户端,客户端再将最新的数据更新到本地ClientDataSet中。
举一个简单的例子吧,譬如用自增字段做表的主键,那么字段值是在服务器端提交后才产生的,客户端提交的时候根本就没有。提交数据成功之后,字段值就需要回传。Delphi在处理这个上面是有问题的,所以才需要手工处理。我选择回传的是一个ClientDataSet,在本地找到对应的记录后更新它。(这只是一个例子,这种情况其实也可以用另外的方法解决,但我思路的前提是尽量不用控件的方法去处理业务逻辑)

这样做的不好之处在于:因为每处理一条数据就要提交一次,会引起网络roundtrip的增加。但如果一次提交多条数据的话,业务层也可以把他们提交给服务器,就是怎么将提交后的数据一次取回呢?
...全文
235 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cobi 2007-11-26
  • 打赏
  • 举报
回复
先提前一下
BES 2007-11-15
  • 打赏
  • 举报
回复
將delta打包提交﹐在TDataSetProvider的OnBeforeUdpateData事件中自主控制提交過程(提交不成功﹐使用raise建個異常即可﹐這個異常在運行程序時不會顯示﹐但會返回在提交不成功能的日志中)
如果返回的日志為空(代表全部提交成功)﹐合并日志的過程﹐你就可以自主控制了﹐在調用MergeChangeLog之前你完全可以做許多處理
我的網站﹕http://www.nineskysoft.com 里面的內容或許可看看
78hgdong 2007-11-14
  • 打赏
  • 举报
回复
在数据库应用的三层结构中,客户端能够取得应用程序服务器的接口方法来获取与更新数据.
可以尝试在中间层运用OOP设计方法,将数据封装在一些对象中,在客户端获取这些对象的
接口的引用来实现获取数据及更新数据.
由于COM+提供了事务处理能力,并且能轻易实现Object Pooling技术,所以可以选择了COM+组件
形式作为中间层.
火星牛 2007-11-14
  • 打赏
  • 举报
回复
把服务器的更新带回客户端合并,是用
v:Variant;
v:=DataSetProvider.ApplyUpdates(Delta);
把这个v带回客户端

在客户端调用
ClientDataSet.reconcile(v);
budded 2007-11-14
  • 打赏
  • 举报
回复
没有用过ClientDataSet,我只会最简单的Tcp自己封装数据,呵呵,帮顶

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧