火急救助,三层架构批量保存问题。(50)

  • 主题发起人 主题发起人 zpselect
  • 开始时间 开始时间
Z

zpselect

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器端中的ADOQuery的LockType原先设为ltOptimic(单笔保存模式)时,客户端ClientDataSet.ApplyUpdates(0),可以提交到数据库中,但是这种模式的话有一个很严重的问题,因为总的提交数据方式是先保存明细,再保存主档,那么在保存过程中,如果在保存明细资料时出现了异常情况,那么明细中一些数据保存到数据库了,另外一些数据则没有,另外主档数据也保存不进去,这样的话就导致一种现象:一些明细数据没有主档信息。后来我将服务端的ADOQuery的LockType原先设为ltBatchOptimic模式,但是前台ClientDataSet.ApplyUpdates(0)之后,没有保存到数据库中。 在前台有我有写DM.DB.ApplyServer.BeginTranClientDataSet.ApplyUpdates(0)DM.DB.ApplyServer.CommitsTran请问怎样写才是?
 
你在Client端 調用ApplyServer.BeginTran/ApplyServer.CommitsTran/ApplyServer.RollBack都不是很安全的做法,給你個小的思路,看是否能對你有幫助:1.中間層定一個接口方法,(比如: ApplyServer.ApplyUpdateData(var AData: OleVariant; var AErrMsg: WideString): WordBool;)2.Client端可以利用ClientDataSet的內存表能力建立一個類似以下結構(為了下面描述方便,這裡先命名為cdsCacheTable): TableName //可以是表名,也可以是別名/代碼等(只要能表明PostData字段內容的身分就可以了) KeyFields //如唯一值字段(這個也可以放在服務端統一定義管理) PostData //本次要提交的命令 ExecIndex //執行更新順序序號 CmdKind //執行更新的PPostData內容類型(比如可以是單純的SQL語句,也可以是Delta)3.把你提交要的Client端的ClientDataSet的Delta或者Data或者SQL存入到上面的cdsCacheTable結構中,然後調用上面定義的ApplyServer的方法ApplyUpdateData,把cdsCacheTable的Data作為參數傳入4.在中間層根據傳過來的Data,根據你自己的業務規則統一處理(在這裡可以統一控制事務的開啟/提交/回滾等);另外,有一點不明白的是,為甚麼是明細先提交,主檔後提交?主檔還沒有提交的情況下,如果明細的外鍵是靠主檔的主鍵來關聯,這個時候外鍵值不就可能為空了(當然也許你有另外的處理技巧)?
 
应用层的事务处理支持快驴中间件有,使用比较方便安全其他的三层组件比较麻烦。
 
难道,三层连这个批量保存模式都解决不了,那三层的架构有什么意义!如果直接用ADO+ADOConnection连数据库的话,只要回滚ADOConnection事务,然后将ADO的LockType设为ltBatchOptimic模式,在保存过程中如果发生异常,那么不会保存到后台。可能还没有领悟出三层的精华所在吧。
 
三层连这个批量保存模式都解决不了???是楼主还没有掌握吧, 为什么非得要用ClientDataSet.ApplyUpdates这种最原始的方式呢???难道你不知道datasetProvider也有ApplyUpdates方法吗???clientdataset的delta是干嘛用的呢???给你点思路:在中间层定义一个批量提交的函数,通过datasetProvider提交, 接收客户端传来的Delta.客户端调用中间层定义的这个函数, 传入Delta数组(array of OleVariant),提交多少个表都没问题,就这么简单.
 
请问以上两位,如果 delta 中含有两个以上表的数据,只提交一个表的数据,怎么处理?
 
像主从关系的表,先保存明细,再保存主档,如果明细保存中没有异常,而在保存主档过程中保存失败了,请问怎样处理?
 
Delta分析这中间数据即可实现单表保存
 
分析delta,我只知道 利用合拼 sql 这种方式。 通过datasetProvider提交这种方式保存,delta怎样分析?
 
关注SnakeWu所说的。
 
像主从关系的表,先保存明细,再保存主档,如果明细保存中没有异常,而在保存主档过程中保存失败了,请问怎样处理?=========================对以上问题吐血 ,很简单:BEGIN Transactioninsert into Master SELECT 'PPP','PPP1'insert into Det SELECT 'PPP','PPP1'ROLLBACK TRANSACTION在SQL中看看两个表结果 ,delphi做法是一样的tryTransactioninsert into Master SELECT 'PPP','PPP1'insert into Det SELECT 'PPP','PPP1'commitexcept //只要有一个异常,两个表的记录全部回滚ROLLBACK end
 
这些问题我都已解决,就是要花点功夫。
 
后退
顶部