SQLServer2000,表主键为自增长,TADOQuery,在事务中,主表提交成功后,子表提交失败,事务回滚后,再次提交,弹出错误对话框"Row cannot be located for updating. Some values may have been changed since it was last read".如何解决。谢谢。

解决方案 »

  1.   

    你回滚后就已经退出事务了,所以要提交必须再次开始一个事务
      if not ADOConnection1.InTransaction then
        ADOConnection1.BeginTrans;
      

  2.   

    还有就是TADOQuery的CursorType改成ctDynamic
      

  3.   

    不行,错误依旧,问题发生在提交语句post.求助
      

  4.   

    表主键不能自动增长,也不能有Default等约束!!!
      

  5.   

    跟自动增长没有关系。主表更新成功后,子表提交失败数据库回滚后,数据库中没有主表记录,但是在dataset中依然存在,再此提交dataset与数据库中数据作比较,发现没有该条记录就报错。csdn、delphi版的高手帮帮忙,这个问题大伙应该都能遇见
      

  6.   

    我以前也遇到过,后来去掉主键的Default属性就行啦。
     还有一次是我用触发器将表的数据改变了,也出现了类似的问题,后来是先关闭数据集再
     重新打开才解决了问题。 将两个表的结构贴出来看看
      

  7.   

    主键default属性是什么。表结构是Master/Detail。均为自增长。先关闭数据集再
     重新打开能解决,但是页面上用户输入了很多信息,刷新后数据全部消失。不是好的解决方法
      

  8.   

    default 属性就是在字段的后面加上"default"关键字
    Example:Sql server 的Scriptcreate table TableName
    (
      Field_1 FieldType primary key default 'XXX',
      Field_2  .......................,
      .
      .
      .
      Field_N
    )
      

  9.   

    事务处理代码如下
    try{
        // 开始事务
          TADOQuery(dsMasterTable.DataSet).Connection.BeginTrans;    // 提交主表
          TADOQuery(dsMasterTable.DataSet).UpdateBatch;    // 给子表MainID字段赋给主表子增长子段的值, 提交明细
          with  TADOQuery(dsDetailTable.DataSet) do
          begin
            First;
            while not eof do
            begin
               Edit;
               FieldByName('MainID').AsInteger :=
                  TADOQuery(dsMasterTable.DataSet).FieldByName('MainID').AsInteger;
               Next;
            end;
            UpdateBatch;
          end;      //提交事务
          TADOQuery(dsMasterTable.DataSet).Connection.CommitTrans;
        except on e: Exception do
          begin
            // 回滚
            TADOQuery(dsMasterTable.DataSet).Connection.RollbackTrans;
          end;
        end;
    谢谢
      

  10.   

    没有用过updateBatch,但是delphi的帮助中说
     To use batch updating, the CursorType property of the dataset component must be either ctKeySet (the default) or ctStatic and the LockType property must be ltBatchOptimistic.还有就是updateBatch是不是虽然放在事务中,但是被调用的话,实际也已经把数据更新到数据库中了?
    你可以在项目中测试以下,就是单步执行,等updatebatch执行完毕后,看数据库中的数据是否已经发生了变化。
      

  11.   

    没有呀,我用服务器带的sql监视器看了,没有呀,在第二次提交时,根本没有向服务器提交sql语句。
      

  12.   

    第一次事务开始,服务器端收到了:+SQL:BatchStarting set implicit_transactions on  21:41:45.887
    第二次事务开始,服务器没有收到这个的语句呀,为什么呀?
      

  13.   

    我发现这样一个问题:
    1、第一次提交主表成功后,提供明细失败,抛出异常。
    2、第二次再提供主表,如果主表更改动,发现的是UPDATE语句;如果没有主表没有改动,第二次主表没有发出任何语句。从表也存在同样问题。
      

  14.   

    服务器是回滚了,只是adoquery的状态没有回滚,第二次提交时,就认为adoquery没有改变,就不再向服务器发sql语句了现在的解决方案:
    1、先做删除操作,然后再插入一次呀。而且是自己写sql就可以了
      

  15.   

    UpdateBatch会判断adoquery的状态(是更新、插入、还是不变),如果没有变化,就不生成sql语句,不发给服务器。