请看源码:
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等控件来解决问题。
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等控件来解决问题。
解决方案 »
- 怎么发布delphi软件,让其能脱离环境运行!
- 请教。关于嵌套嵌套循环的问题
- 如何在delphi7.0中使用以前的控件?
- 如何获得局域网内某一台机器的网卡地址?注意:不是程序运行所在机器。比如,客户机获得服务器的网卡地址。
- 在websnap技术中,delphi也有一个自带的,可以从网页上提取数据的例子,我看不明白,请高手帮忙解答。
- 请问什么控件可以选文件的路径(像安装程序时选目录一样)
- 一个表中要建立40多个字段,没有建过,不知道,效果怎么样? 给点建议
- 求助:我的记录替换问题dbf
- 关于Tstatusbar的问题,高手帮助我,分数不够我再加
- 初学者的简单送分题!!
- 这样的功能你是怎样实现的?
- 急!如何用程序实现网站的用户登录(PHP文件)
sql.clear;
sql.add('select * from table');
close;//---------------------------------->先关掉,否则open没用的
open;//3
end;
close;///这一句加了没有?
sql.clear;
sql.add('select * from table');
open;//3
end;为什么一定要在ADOQuery2中执行该操作?
是否可以在adoquery中先关闭,然后插入,然后open?是否可以采用adoquery.Append?
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'还是没有解决问题。
}
如果不行就用EXECSQL试试,不要用open
2、如果在‘2’之后,‘3’之前加一句‘showmessage('插入成功');'那么在程序运行中会出现两种情况:1、showmessage弹出的窗口用回车键迅速关闭,则‘3’的数据不会更新;2、如果你让showmessage弹出的窗口稍作停留再关闭,则‘3’的数据可以更新!由此我认为可能不 是脏读,而是adoquery 的execsql似乎是一个独立的线程,就算你close它,select也不见得一定在execsql动作完成后再执行。所以当你用一个showmessage等待一下就可以得到更新后的数据,实际上我也是这么做的,不过这样做实在是太有点… 所以在论坛上想麻烦大家的是:有没有办法让‘3’的select 确定能放在‘2’的execsql执行完成后再执行?
2. 在Open之前运行 if ADOQuery.Active then ADOQuery.Close;
请大家一定要好好想一下这个问题,因为我已经被困惑了半年了!!我用的是access数据库
execsql select为什么会出错??
——————select的要用Open;
“异步执行”的英文是什么?
“1. Select 时可以用ExecSQL,也可以用Open,但是Insert是只能用ExecSQL.”是错的,不能运行,select 只能用open;难到大家都没用过ADO吗?如果不是,那么这个问题你们是怎么解决的?
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;
全部拷贝过去替换你的代码,然后重新全部编译。
方案无效,
请注意这一话:
===========
2、如果在‘2’之后,‘3’之前加一句‘showmessage('插入成功');'那么在程序运行中会出现两种情况:1、showmessage弹出的窗口用回车键迅速关闭,则‘3’的数据不会更新;2、如果你让showmessage弹出的窗口稍作停留再关闭,则‘3’的数据可以更新!由此我认为可能不 是脏读,而是adoquery 的execsql似乎是一个独立的线程,就算你close它,select也不见得一定在execsql动作完成后再执行。所以当你用一个showmessage等待一下就可以得到更新后的数据,实际上我也是这么做的,不过这样做实在是太有点…
============
另外我用的是
ACCESS数据库
==========================
各位朋友指出的方法都一一试过了,然而还没发现真正的解决方法
adocommand怎么用呀?我不太知道,请源码指教,行吗?
---------------
我也遇到过,请高手多次测试之后的标准回答。
不过我把你2中的ADOQuery2写成ADOQuery1
问题已经解决了!!
其实是我太小心谨慎,怕DATA CONTROLS控件运行出错,于是把OPEN 和 EXECSQL 分别用两个ADOQUERY 来执行,于是数据不能同步。其实只用一个ADOQUERY来执行就行了
谢谢大家的指教!!