请看源码:
with adoquery do begin
 sql.clear;
 sql.add('select * from table');
 open;//1
end;
with adoquery2 do begin
 sql.clear;
 sql.add('insert into table (name)values(''dd'')');
 execsql;//2
end;
with adoquery do begin
 sql.clear;
 sql.add('select * from table');
 open;//3
end;{
按说经过‘2’以后‘3’应该比‘1’多出一条记录。但是在‘3’的open并没有得到
更新!其结果与‘1’是一样的。经试验知道如果在‘2’后加一个延时后,在‘3’才可以得到insert后的数据。请问这是为什么(其实update、delete等操作都存在这个问题)有什么办法可以让SQL操作能实时进行?另请大家注意的是:本例的SQL查询是一个简例,在原例中运用到了多表连接,故请大家不要考虑用DBGrid等控件来解决问题。

解决方案 »

  1.   

    with adoquery do begin
     sql.clear;
     sql.add('select * from table');
     close;//---------------------------------->先关掉,否则open没用的 
     open;//3
    end;
      

  2.   

    with adoquery do begin
      close;///这一句加了没有?
     sql.clear;
     sql.add('select * from table');
     open;//3
    end;为什么一定要在ADOQuery2中执行该操作?
    是否可以在adoquery中先关闭,然后插入,然后open?是否可以采用adoquery.Append?
      

  3.   

    with adoquery do begin
     sql.clear;
     sql.add('select * from table');
     open;//1
     close;
    end;
    with adoquery2 do begin
     sql.clear;
     sql.add('insert into table (name)values(''dd'')');
     execsql;//2
     close;
    end;
    with adoquery do begin
     sql.clear;
     close;
     sql.add('select * from table');
     open;//3
    end;{
    如此改了以后还是不行,我觉得似乎是‘2’没有立即执行!
    之所以用ADOQUERY2是因为EXECSQL与OPEN分别用两个ADOQUERY来做更方便一些,当然也不是必然。但即使只用一个ADOQUERY还是会碰到同一样的问题。我曾试过在‘3’前再用ADOQUERY2再执行一个‘select * from table'还是没有解决问题。
    }
      

  4.   

    应该先close再open。
    如果不行就用EXECSQL试试,不要用open
      

  5.   

    这问题是比较怪,开始一看我也像楼上那样以为你不没有加 Close ,理论上你加了 Close 以后应该不会再出现这样的情况。还有一种方法值得一试,就是最后一次取数据时用另一个 Query 来查试试看怎么样?
      

  6.   

    1、select 是不能用execsql的,只能用open;
    2、如果在‘2’之后,‘3’之前加一句‘showmessage('插入成功');'那么在程序运行中会出现两种情况:1、showmessage弹出的窗口用回车键迅速关闭,则‘3’的数据不会更新;2、如果你让showmessage弹出的窗口稍作停留再关闭,则‘3’的数据可以更新!由此我认为可能不 是脏读,而是adoquery 的execsql似乎是一个独立的线程,就算你close它,select也不见得一定在execsql动作完成后再执行。所以当你用一个showmessage等待一下就可以得到更新后的数据,实际上我也是这么做的,不过这样做实在是太有点… 所以在论坛上想麻烦大家的是:有没有办法让‘3’的select 确定能放在‘2’的execsql执行完成后再执行?
      

  7.   

    1. Select 时可以用ExecSQL,也可以用Open,但是Insert是只能用ExecSQL.
    2. 在Open之前运行 if ADOQuery.Active then ADOQuery.Close;
      

  8.   

    我用execsql select为什么会出错??是不是因为有dbgrid和adoquery相连?在Open之前运行 if ADOQuery.Active then ADOQuery.Close;//此句没有任何效果,
    请大家一定要好好想一下这个问题,因为我已经被困惑了半年了!!我用的是access数据库
      

  9.   

    是否已经将 “异步执行” 属性打开了???
    execsql select为什么会出错??
    ——————select的要用Open;
      

  10.   

    我用的adoquery都是使用它的默认设置应该不会有错吧?
    “异步执行”的英文是什么?
    “1. Select 时可以用ExecSQL,也可以用Open,但是Insert是只能用ExecSQL.”是错的,不能运行,select 只能用open;难到大家都没用过ADO吗?如果不是,那么这个问题你们是怎么解决的?
      

  11.   

    在对数据库进行增删修改后,最好用ADOQUERY.REQUERY,重新手动刷新一下数据。
      

  12.   

    with adoquery do begin 
     close ;
     sql.clear;
     sql.add('select * from table');
     open;//1
    end;
    with adoquery2 do begin
     close ;
     sql.clear;
     sql.add('insert into table (name)values(''dd'')');
     try
       execsql;//2
     finally
     end ;
    end;
    with adoquery do begin
     close ;
     sql.clear;
     sql.add('select * from table');
     open;//3
    end;
    全部拷贝过去替换你的代码,然后重新全部编译。
      

  13.   

    to jinhaiwu(海魂) :
    方案无效,
    请注意这一话:
    ===========
    2、如果在‘2’之后,‘3’之前加一句‘showmessage('插入成功');'那么在程序运行中会出现两种情况:1、showmessage弹出的窗口用回车键迅速关闭,则‘3’的数据不会更新;2、如果你让showmessage弹出的窗口稍作停留再关闭,则‘3’的数据可以更新!由此我认为可能不 是脏读,而是adoquery 的execsql似乎是一个独立的线程,就算你close它,select也不见得一定在execsql动作完成后再执行。所以当你用一个showmessage等待一下就可以得到更新后的数据,实际上我也是这么做的,不过这样做实在是太有点… 
    ============
    另外我用的是
    ACCESS数据库
      

  14.   

    其实并不是没有close的原因
    ==========================
    各位朋友指出的方法都一一试过了,然而还没发现真正的解决方法
      

  15.   

    用事务,我想,adoquery它还没有提交到数据库
      

  16.   

    BDE方式比较简单,有wiz编写一对多,在此基础上,如何编写ADO一对多关系,
      

  17.   

    我个人认为在执行updata,inset,delte这些命令时建议用adocommand组件!不容易出现问题!
      

  18.   

    to drunkboy(醉犯) 
    adocommand怎么用呀?我不太知道,请源码指教,行吗?
      

  19.   

    windindance(风舞轻扬) 的方法是绝对可行的,我以前就是这样实现的。
      

  20.   

    最后一次取数据时用另一个 Query 
    ---------------
    我也遇到过,请高手多次测试之后的标准回答。
      

  21.   

    我把你写的试用了一下立刻就执行了啊
    不过我把你2中的ADOQuery2写成ADOQuery1
      

  22.   

    我不知道,你用的是什么数据库,我知道在oracle这种数据库中,每次执行一次对表的insert,delete,update操作,都要commit一次,这些修改的数据才能在库中查到。adoquery中有没有一个用于设置自动commit的时间属性,你查一查。我以前没有注意到这种情况,没有注意。现在手头没有delphi,不能查了。查完了,告诉我。
      

  23.   

    ADO中没有COMMIT
    问题已经解决了!!
    其实是我太小心谨慎,怕DATA CONTROLS控件运行出错,于是把OPEN 和 EXECSQL 分别用两个ADOQUERY 来执行,于是数据不能同步。其实只用一个ADOQUERY来执行就行了
    谢谢大家的指教!!