我的系统中利用ADO连接SQL SERVER数据库,如果一个用户在编辑一个表中的一条的记录的时候,另外一个用户却删除了该条记录,那么当前一个用户在保存修改记录的时候,会提示出现错误:“无法为更新行集定位:一些值可能已在最后读取后改变”。我是利用 ADOQUERY的DELETE和POST进行删除和更新的,看过SQL SERVER的帮助,我知道这好像是一种“脏读”,不过我不知道怎么才能避免这种情况,能否在第一个用户进行修改以前开启一个事务,如果出错了就回滚事务,否则执行事务。然后第二个用户准备删除这个数据的时候要判断是否有别人在修改这个记录,如果有的话则不能删除,否则进行删除。各位大侠,不知道这种问题该怎么解决,我刚刚进行DELPHI编程,对这种问题简直就是束手无策。

解决方案 »

  1.   

    出现这种情的时候,需要将记录集dataset刷新,另外可以在程序中捕获这种错误。
      

  2.   

    “无法为更新行集定位:一些值可能已在最后读取后改变”
    出现这种情况是因为,Ado的DataSet控件会将一部分纪录取到内存中缓存起来,
    如果表中的数据是通过这个空间更新的,就不会提示该信息(因为,DataSet控件
    更新表后会同事更新本地缓存。)
    如果同事有其他控件更新了该表,那么这个Dataset控件会发现表中有些内容与自己缓存的内容不一致,这就要先刷新,使两者一至,再更新。
    可以先Close,再Open,再执行操作,或者如 SeanXiong(小熊) 所说,可以在程序中捕获这种错误。
      

  3.   

    主要原因是当前数据集中拥有的数据和库中的数据已经不匹配了,所以数据集更新失败,就回有这样的错误。
    可以不用 Delete 和 Post,自己用 SQL 语句来完成。
      

  4.   

    我的建议是不要用数据感知控件,直接用ADOQuery,执行Delete,insert,update等
    SQL语句,执行完后立即Close
    比如
         with ADOQuery do
          begin           if Active then
                   Close;
               SQL.Clear;
               SQL.Add('Insert into table1 values('11','22');
               ExecSQL;
               Close;      end;
      

  5.   

    :( ,大家的看法和我的判断一致,我想也只能够利用SQL语句了。难道没有别的办法吗?to  dyf2001() ,查询数据时怎么锁定?我试过在查询分析器中使用过以下语句begin tran
       delete from tab,然后打开另外一个查询分析器,重新建立一个连接,在那里执行select * from tab然后这句话就一直执行下去不能结束,只有在第一个查询分析器中执行了rollback tran或者commit tran以后,第二个才能返回结果。
    我想这就是被锁定了,但是在DELPHI程序中怎么才能实现这个那,而且如果那个事务一直不能结束,那么别人对这个表的访问都不能进行,这好像也不是办法啊。痛苦........
      

  6.   

    我有点记不清楚了,具体你看一下,
    第一,你的表一定要有主键
    第二,TAdoquery的MarshalOption选moMarshalModifiedOnly
      

  7.   

    这个问题我也常见到,只有一个用户使用时,同样会出现;我问过很多高手,没招;后来我升级了一下Mdac到2.7有所改善,不过偶而也会出现,哪怕只有一个用户使用,且仅操作一个表;
      

  8.   

    to newyj(吴刚vs西西弗) 和yyb2000(三流编程机器) 我的表是有主键的啊,不过是identity字段,是聚集索引。
      

  9.   

    我遇到过这样的情况,说来可能你不信,重做系统废掉SQL SERVER 2000后改用7居然好了
      

  10.   

    to  coolicelee(寒冰) 啊.......
    不会吧,工程太浩大了吧,老板会砍我的。
      

  11.   

    李维的DelPhi多层里有解决这个问题,好像是BeginStr~~,我记不住了
      

  12.   

    My_first(海浪) ,具体怎么做?我已经建过聚集索引了,还是不行。
      

  13.   

    后台用默认值!!
    你保存之后,ADO默认没有把默认值更新回来!
      

  14.   

    表一定要有主键,
    你如果用d5,打一下,d5的ado升级包
      

  15.   

    先打D5的ADO包
    在SQL中写存储过程,用事务!
      

  16.   

    同意songdan2002(宋)
    再加事务处理
      

  17.   

    同意THXK ...
    同樣出現過這類問題