我做的是网络程序
当对同一条记录被别的机器修改后,
再在我机器中进行UPDATEBATCH时出现了
<无法为更新行集定位,一些值可能已在最后读取后更改>
这种应该怎样处理
大家帮一下忙
急,急!

解决方案 »

  1.   

    用事务吧...
      AdoConnection.begintrans;
    try
    AdoQuery1.sql.clear
    AdoQuery1.sql.add('insert into...');
    AdoQuery1.ExecSQL;
    AdoConnection.committrans;
    except
    AdoConnection.rollbacktrans;
    end;
        
      

  2.   

    转载delphibbs
    '无法为更新行集定位一些值可能已在最后读取后改变'
    这个问题应该是被讨论很多次了,其实它不关构件事,不关数据库的事,只是你的程序有
    问题而已,不管是BDE还是ADO,在数据更新时,它都会转换成SQL语句与后台的数据库打
    交道,例如一个更新操作,当你在客户端修改了一些数据,而后Post的时候,BDE或者ADO
    这些数据引擎会生成类似的语句:'Update tablename set field1=*** where ....',问题
    的关键在于where子句,在BDE中是根据ttable的Updatemode属性控制怎样生成where子句的
    而在Ado中是利用TField的ProvideFlag属性来控制,如果你的客户端程序没有注意到这些
    问题的话,就很可能导致上面的错误。例如你在数据库定义时设置了字段A的默认值,而你
    在客户端新增一条纪录时没有对字段A赋值,这样你在客户端缓冲中的数据就与数据库中的
    不同了,当你下次再对该条纪录更新时,问题就来了,where子句中A的值就会根据客户端
    赋为空,这样就会导致根据where子句定位不到数据库中的纪录,而Delphi就会认为这可能
    是由于你在从数据库取下数据到你发出Post命令之间可能有另外的人更改了该条纪录