odac 主细结构中,为什么不能同时在一个事务中删除主细表中的数据? 
代码如下:主了表控件为ODAC的TSmartQuery ,实表中只能删除主表数据,而子表实表中数据还在。删除和保存事件如下:
procedure actDeleteExecute(Sender;Tobject)
begin//删除子表数据DetailQuery.Disablecontrols;
try
 if not (DetailQuery.eof) then
   begin
     DetailQuery.First;
      while not DetailQuery.eof do
       DetailQuery.delete;
   end;
finally
DetailQuery.Enablecontrols;
end;//删除主表数据MasterQuery.delete;
 
end;
procedure actSaveExecute(Sender;Tobject)
begin
 orsn.StartTransaction; try
   DetailQuery.ApplyUpdates;
   MasterQuery.ApplyUpdates;
  orsn.Commit;
 except
  orsn.Rollbach;
 end;
end;

解决方案 »

  1.   


    procedure actSaveExecute(Sender;Tobject) 
    begin 
    orsn.StartTransaction; try
      orsn.begintrans;
      DetailQuery.ApplyUpdates; 
      MasterQuery.ApplyUpdates; 
      orsn.Commit; 
    except 
      orsn.Rollbach; 
    end; 
    end; 
      

  2.   

    貌似你的ROLLBACK写错?procedure actSaveExecute(Sender;Tobject) 
    begin 
    orsn.StartTransaction; try
      orsn.begintrans;
      DetailQuery.ApplyUpdates; 
      MasterQuery.ApplyUpdates; 
      orsn.Commit; 
    except 
      orsn.Rollback; 
    end; 
    end; 
      

  3.   


    "orsn.begintrans;" ODAC 的 TOraSession 无此过程吧,我刚试过。忘记说的是TSmartQuery 用的是 CachedUpdate, 在这种方式中,我想是否会是缓存中当主表记录删除,子表会
    因为失去与主表的关联而记录变为空,所以在ApplyUpdates时主表成功而子表无数据提交 。
      

  4.   

    在上面代码中,是先删除从表数据再删除主表, 不知道用ODAC的同志们是否遇到这样的问题!
      

  5.   


    procedure actSaveExecute(Sender;Tobject) 
    begin 
    orsn.StartTransaction; try
      orsn.begintrans;
      DetailQuery.ApplyUpdates;
      orsn.Commit; 
      MasterQuery.ApplyUpdates; 
      orsn.Commit; 
    except 
      orsn.Rollback; 
    end; 
    end;
    试验一下
      

  6.   


    结果还是一样的,我想问题不在Commit,而是在ApplyUpdates前的缓存,在删除事件中,
    我//MasterQuery.delete;  就可以删除从表实表中的记录,我想是在DetailQuery.ApplyUpdates中提交删除
    SQL时因为MasterQuery中的记录删除而从表无记录可删,所以我在试想,如果缓存在从表删除操作后不做刷新
    动作,也许可能可以,但目前没有找到删除后不做刷新的方法。
      

  7.   

    解决了
    只要在从表删除后DetailQuery.ApplyUpdates就可以了,这样缓存中就不会没有从表数据了