如果我打开一个CDS,正在修改,但这时有另外的方法把这条记录修改了.我用ApplyUpdate保存数据。cds就保存不了。请问CDS是如何检测到这条记录被另外的途径改过?因为我现在有个难处是我保存时没有用ApplyUpdate,而是在服务端用SQL语句保存的,这样我就没有办法检测到这条记录被另外的途径改过。谢谢大家。

解决方案 »

  1.   

    不是CDS 检测到的,而是服务端告诉它的,然后 CDS 有个 OnReconcileError 事件可以处理冲突。
    还是用 ApplyUpdates 好,不要在客户端直接用 SQL
      

  2.   

    hiflower(花) :但是如果我某一时刻同时有4个cds 做ApplyUpdates 方法时,怎样做事务处理呢?
      

  3.   

    既然用三层,则事务应当在中间层做,所有的业务规则都应当在中间层实现
    否则就用 C/S。同时有 4 个 cds ApplyUpdates 时,中间层是独立进行处理的。
    当中间层发生数据冲突(如被另一个改变),则会提交失败,并通知 cds。
    cds 在 OnReconcileError 中可以适当处理,比如可以强迫提交,也可以获得新的数据,也可以放弃。
     cds 可以这样提交:
     if  cds.ApplyUpdates(0)>0 then
      cds.CancelUpdates;// 当不需要调各冲突时,可以取消所有的修改
      

  4.   

    hiflower(花) :
    高手!!我是这个意思:
    我有4个cds,我也是 这样。
    if  cds1.ApplyUpdates(0)>0 then
      cds1.CancelUpdates;
    if  cds2.ApplyUpdates(0)>0 then
      cds2.CancelUpdates;
    if  cds3.ApplyUpdates(0)>0 then
      cds3.CancelUpdates;
    if  cds4.ApplyUpdates(0)>0 then
      cds4.CancelUpdates;但是在执行时可能cds1,cds2都成功了,但CDS3失败,这时我怎样取消CDS1和CDS2呢?
    并且也不执行CDS4.谢谢你!!
      

  5.   

    Erice(白雪公猪):
    我现在就是回传到服务端进行事务处理。但问题就是我上面提到的我怎样来知道有没有其他的途径已经对我的数据修改过?也就是说我怎样来达到cds 的 OnReconcileError这个功能?
      

  6.   

    这种情况是业务规则放到客户端了,三层是不适用的。如果用三层,则应该把属于同一个业务的各种逻辑封装在一起,客户把这一次的处理集中提交到中间层,由中间层来进行事务处理。解决的办法有多种,要根据你的实际情况来定。
    办法之一是把每个CDS 的 Delta 通过中间层的接口方法传递到中间层,然后中间层把这些 Delta 在事务中提交到数据库服务器。仅供参考^_^
      

  7.   

    hiflower(花) :
    我现在就是传递到中间层处理的,但是就是没有办法做到cds 的 OnReconcileError这个功能,我没有办法知道有没有其他途径改过这些数据。
      

  8.   

    除非你把所有的信息放在同一个 cds 中,才能用 cds.ApplyUpdates 并在 OnReconcileError 中处理冲突
    否则,应当把每个 cds 的 Delta 同时送到中间层去。办法是在中间层添加一个接口方法,把这几个 Delta 传递过去(我没这样做过,可能有更好的办法)