adoquery1.sql.text:='select * from goods';
adoquery1.open;
adoquery1.first;
for i:=0 to adoquery1.recordcount-1 do begin
    adoquery1.edit;
    adoquery1.fieldbyname('type').value=9;
end;
adoquery1.updatebatch;
就是最后一句执行有错,一部分记录的type变了,但一部分没变,何解?事务到哪去了?
还有,在开发环境下运行,到最后一句时经常会出现一个CPU调试窗口,何解?
如果:
adoquery1.sql.text:='update goods set type=9';
adoquery1.execsql;
会不会也会出现改了一部分,而一部分没改?
我用的interbase数据库,经修复,检查出数据有两点损坏,但直接用SQL操作不会出现以上情况。请知者告知

解决方案 »

  1.   

    adoquery1.sql.text:='select * from goods';
    adoquery1.open;
    adoquery1.first;
    adoquery1.edit;
    for i:=0 to adoquery1.recordcount-1 do 
    begin   
        adoquery1.fieldbyname('type').value=9;
    end;
      

  2.   

    adoquery1.updatebatch;这句话 搂住启用了缓存的模式了吗?
      

  3.   

    正是,adoquery1的locktype属性已设为ltBatchOptimistic.
    cursortype属性已经设为ctStatic.
      

  4.   

    对不起,循环里还有一句
    adoquery1.next;
      

  5.   

    程序这样改:
    adoquery1.sql.text:='select * from goods';
    adoquery1.open;
    adoquery1.first;
    for i:=0 to adoquery1.recordcount-1 do begin
        adoquery1.edit;
        adoquery1.fieldbyname('type').value=9;
        adoquery1.post;
        adoquery1.next
    end;
    //adoquery1.updatebatch;   不知你用没用绶存模式 ?
      

  6.   

    edit放在循环外面。用adoconnection的事务处理。
      

  7.   

    begin
      with adoquery1 do
      begin
        Close;
        Sql.Clear;
        Sql.Add('update...');
      end;
      adoquery1.parameter['type'].value:=9;
      adoQuery1.ExecsSql;
    end;