数据库有表A(A1--主键,A2) B(B1--主键,B2)
我用adoquery来连接:
adoquery.active:=false;
adoquery.sql.clear;
adoquery.sql.add('select m.A2,n.B2 from A m join B n on m.A1=n.B1 group by m.A2,n.B2');
adoquery.active:=true;
得到数据用 DBGrid 显示,但是 Refresh 时,报错 '缺少更新或刷新的键列信息'。我的问题是:
难道就只能用 adoquery.active:=false再:=true的方式刷新?另一个问题:(在刷新操作不报错的情况下,如 只select 表A)
在得到记录比较多时,在修改了记录后--->再刷新,用Refresh是不是比adoquery.active:=false--->true的方式快?还是一样?

解决方案 »

  1.   

    refresh是用客戶端的数据和服務器端的数据比較,改不同的再show出來,比較費時。
    好的是active=false再active=true。或者close再open也是不錯的方法
      

  2.   

    adoquery.close
    adoquery.sql.clear; 
    adoquery.sql.add('select m.A2,n.B2 from A m join B n on m.A1=n.B1 group by m.A2,n.B2'); 
    adoquery.open
      

  3.   

    就是数据比较多时 如上万条 是用 关-->再开 的方式 比 Refresh 的方式快?
      

  4.   


    requery就是调用 close--->open 吧?
      

  5.   

    数据刷新最好
    先Close;
    再Open;
    ReFresh;有可能并没有更新
      

  6.   

    出现这句错误提示的原因是,你查询的结果没有包括主键字段,导致无法定位。
    用Close再Open好了。
      

  7.   


    这个原因我知道的,只是感觉要写2行,用refresh只要写1行。我在网上也看到 close--->open 比 refresh 速度快(在记录较多时有明显感觉),我就用 close-->open 了。
      

  8.   

    一般这种情况用close---open的好。。
      

  9.   

    想要速度再快点,可以在open前,DBGrid.DisableControls,Open后再EnableControls
    应该有这两个方法吧,我没用过这个DBGrid,不知道。
      

  10.   

    with  adoquery do 
      begin
        if active:=false then
          Active := false  
        sql.clear; 
        sql.add('select m.A2,n.B2 from A m join B n on m.A1=n.B1 group by m.A2,n.B2'); 
        Open;
      end;