datasnap的TDataSetProvider是强大,对于更新服务器端master表的单表更新等,不用写代码就能搞定,的确迅速,但如果表是联合查询出来的,或者服务器更新一条记录,将导致许多别的逻辑变化时,还是自己写更新语句来的可控。
自己写更新,除了最基本的定义结构定义接口的路子外,仍然可以使用TClientDataSet的Delta来提高生产力。在客户端将Delta作为参数,上传到服务器端,服务器来解析这个Delta,得到客户端的变化后自己做更新。
至于如何解析Delta,参考TDataSetProvider的源码就可得到TUpdateTree.DoUpdates做的事情。
偷懒的方法是服务器端仍然用TDataSetProvider来处理,直接调用TDataSetProvider的ApplyUpdate,然后处理TDataSetProvider的BeforeUpdateRecord事件,在这个事件里面拦截解析后的delta,操作数据库后,Applied设置为true。但这样做,事务的处理给 TDataSetProvider控制了,我觉得不是好的法子。
所以还是老实将上传上来的delta赋值给一个新的clientdataset的Data,然后while循环,模拟TUpdateTree.DoUpdates来自己做好。
没有评论:
发表评论