按李维的书所做的,一个COM+数据模块,提供一个更新方法updatedatas,该方法用DataSetProvider的Applyupdates来实现。再建一个更新对象,也提供一个更新方法updatedatas,它是直接调用COM+数据模块的updatedatas来实现。最后在客户端创建这个更新对象,并调用其方法时,得了个“根事务要提交,但事务终止了操作”的错误,在COM+数据模块的updatedatas中捉到了上面的异常,不知是什么原因?多谢了。附:更新对象是通过一个数据模块用dcomconnection来连接COM+数据模块的,其方法updatedatas也主要是 dm.dcom.AppServer.updatedatas(vdatas,imaxerror,ierrorcount);

解决方案 »

  1.   

    每次更新完毕后调用SetComplete提交事务或者SetAbort回滚事务
      

  2.   

    我也遇到, 不是苹果说的那种情况, 看这下面代码 Connection.AppServer.UpdateDatas(cds.Delta, ...); // 正确奇怪的事在下面
    var
      Delta :OleVariant;
    ...
    Delta := cds.Delta;
    Connection.AppServer.UpdateDatas(cds.Delta, ...); // 就是你的错跟踪时会发现, Delta 本应是 array of byte 成了 array of variant, 内容都一样...的确是一件怪事晕啊晕啊了我半天后我想到了在服务器这边定义 Delta 类型为 VARIANT 和 VARIANT * 是一回事,定义成了 VARIANT * 后,那个错误就不会发生了
      

  3.   

    太可怕说得对,只要把Delta类型Variant改成Variant*,就可以了,这可能是的delphi7的一个bug
      

  4.   

    唉,要真是Delphi的Bug,那我们这些在Delphi上开发的程序又如何稳定的了:(
      

  5.   

    Delta := cds.Delta;
    Connection.AppServer.UpdateDatas(cds.Delta, ...); // 就是你的错这样不行吧,cds.Delta不是只读的吗?
    现在我把COM+数据模块的更新COM+对象的updateDatas中的Delta都改成了
    Variant*,结果却在更新对象的UpdateDatas方法中捉到了个"Variant does not 
    reference an automation object"的异常,这是怎么回事?
      

  6.   

    云破天开了!那个Error,是由于我在更新对象中没有把Dcomconnection
    设为true的。是应该在事务数据模块中把Variant改为Variant*。多谢
    那么多位。