在ADOQuery1AfterPost事件里能否得到ADOQuery1更新前和更新后的值(目前更新项目都是数字),或者有什么其他的办法,因为我的程序在ADOQuery1.post后还要执行sql语句,如果后面的语句执行失败,就把ADOQuery1更新前的值再更新回去!!

解决方案 »

  1.   

    记得SQL语句也用Begin...end嵌套
      

  2.   

    最好考虑在字段的Onsetext事件中处理吧
    procedure(Sender: TField; const Text: string);Text是正在编辑的值,原值就直接FieldByName
      

  3.   

    try
      ADOQuery.Connection.BeginTrans;
      ADOQuery.Post;
      ADOQuery.Connection.CommitTrans ;
    except
      ADOQuery.Connection.RollbackTrans;
    end;
      

  4.   

    把你执行sql语句的过程也放到BeginTrans和CommitTrans中间如果有异常,系统自己会回滚此次事务相关操作
      

  5.   

    使用事务,确保你的Query和后面要执行语句的Query或Table使用同一个Connection对象。
    ADOQuery.Connection.BeginTrans;
    try  
      ADOQuery.Post;
      其它的数据操作;
      ADOQuery.Connection.CommitTrans ;
    except
      ADOQuery.Connection.RollbackTrans;
    end;如果这个不是你想要的,那么在Query(QA)进行Post前。你要使用SQL语句在另一个Query(QB)中取得与你的QA相同的数据。
    如果失败,那么根据QB中的数据重新写入QA。
      

  6.   

    我的ADOQuery1是绑定到DBGridEh的,因为触发post事件是在行移动时产生的,是自动post的,下面这段代码不行吧!!ADOQuery.Connection.BeginTrans; 
    try  
      ADOQuery.Post; 
      其它的数据操作; 
      ADOQuery.Connection.CommitTrans ; 
    except 
      ADOQuery.Connection.RollbackTrans; 
    end; 
      

  7.   

    你的是用DBGridEh在表格上来进行数据的修改吧,可以在最后post一次,用事务进行控制,不用每一行post一次吧
      

  8.   

    与你显示的控件没有关系,只要用户修改过数据在移动数据集指针时BeforePost和AfterPost就必然产生。只是看你如何处理。
      

  9.   

    怎么就没有人理解呢,数据是自动post的,事务写不起来的(只能后边的sql语句放到一个事务里),就是有没有变通的办法得到修改前的数据值,这样后边的sql语句如果失败,我就将post的值重新做update为修改前的值
      

  10.   

    不理解的人是你,你在BeforePost中写个
    raise Exception.create('看你能不能保存');
    试试。
    变通的方式就是在BeforePost中根据主键先从数据库取得这条记录的值暂时保存在客户端。或是直接使用变量保存。然后在AfterPost后做你的检查。如果失败,那么提示用户,根据主键定位这条错误的记录把你在BeforePost中保存的数据重新写回去,然后要求用户重新编辑。不过我现在有另一个感觉,就是你的数据库设计有问题,你并没有使用键的约束来处理表之间的关系。
      

  11.   

    如果BeforePost中无法进行上面的操作。也可以考虑BeforeEdit。变通一点不要认定一个方向不变。
      

  12.   

    给你一个连接,自己看吧.
    http://book.csdn.net/bookfiles/155/1001556632.shtml