我在局域网上放了一个acces的数据文件,用adotable直接连接它,两个程序控制它,一个读,一个写入,读的程序是循环读入的,程序如下:
      Repeat
         Adotest.Open;
         Adotest.Locate('testindex',testindex,[loCaseInsensitive]);
         End1Flag:=AdoAte.FieldValues['END1'];
         End2Flag:=AdoAte.FieldValues['END2'];
         sleep(100);
         AdoAte.Close;
      until ( End1Flag=true) and (End2Flag=true);
其中testindex是变量,'testindex'是非主键的字段名称,现在发生的问题是经常会出现“Row   cannot   be   located   for   updating.   Some   values   may   have   been   changed   since   it   was   last   read ”请问是怎么回事,用adoquery能解决这个问题吗??

解决方案 »

  1.   

    没看出来你的locate的意图
    为什么要locate来更新,直接update语句写啊
      

  2.   

    这种情况建议你改用网络数据库,比如sql server
      

  3.   

    如果你在另一个数据集修改了数据,那么在访问时,需要重新open这个数据集,否则就会抱着个错误
      

  4.   

    多谢大家的回复,LOACATE是为了定位到那一行的,现在的情况就是,我有两个程序,分别在局域网的两台机工作,其中一台A机执行完程序后发送一个bool字节到数据库的testindex的那一行,另一台B机不停检测数据库的那个字节是否为真,如果为真就跳出循环。现在的问题是如果在A机刚好更新完数据,而B机刚好执行到定向的那一句的时候,就出现“Row cannot be located for updating. Some values may have been changed since it was last read “,因为B机不停循环,会经常发生这种情况,这个我搞了几天了,还没有搞好,我也试过用一个txt文件,其中用到了TSTRINGLIST,当loadfromfile(pathoffile)和savetofile(pathoffile)同时发生时也是出错,大家有什么好办法吗??
      

  5.   

    直接sql吧,别filter了,filter功能有限
      

  6.   

    你查下帮助啊,呵呵
    with ADOTable1 do
      Locate('Company;Contact;Phone', VarArrayOf(['Sight Diver', 'P', '408-431-1000']), [loPartialKey]);那你的语句是不是应该这样呢?
    Adotest.Locate('testindex',VarArrayOf([testindex]),[loCaseInsensitive]);
      

  7.   

    我回答错了,acces数据库确实同时能多个用户读,但要是有多个用户写就会发生你这样的错误,只能有一个用户做写操作。