ADOQuery1,ADOQuery2的一个问题,困惑我好长时间了(100分)

  • 主题发起人 主题发起人 yzlufei
  • 开始时间 开始时间
Y

yzlufei

Unregistered / Unconfirmed
GUEST, unregistred user!
ADOQuery1,ADOQuery2
连的是同一个adoconnection
先用ADOQuery1 select一些数据,然后针对这些数据用ADOQuery2
sq:='update ..... where ..........';
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Text := Sq;
adoquery2.ExecSQL;
ADOQuery1.refresh;
ADOQuery1.next;//循环

当时的dbgrid显示是数据的要更新的字段是更新了。

但是关闭程序以后再打开,发现更新的数据有问题,原来ADOQuery1 select出的的数据,相邻的2条数据,更新过的字段的内容竟然是一样的--和2个相邻中的第一个一样(应该不同的)。why。
 
ADOQuery1.refresh;//去掉这句。
 
ADOQuery1.refresh;//去掉这句。

why?
我去掉的话,dbgrid就不显示更新过的内容,客户看不出了啊。
 
你这是循环里面的,在循环外再更新。
循环时,要加 while not Eof 或者 用 For 循环。
先看一下是不是这里的问题。
 
试验过了和ADOQuery1.refresh;无关。去除后仍然不行啊。
 
第二个可能 :
sq:='update ..... where ..........';
这可以更新所有数据满足条件的记录,还要:
ADOQuery1.refresh;
ADOQuery1.next;//循环
 
我检查了一下。发现是这么一个情况。
比如adoquery1挑出来的是序号
1,5,8,11
我用query2对满足序号是1,5,8,11对数据更新后,发现2,6,9,12同时也更新了,是怎么回事情呢?而且2更新成1的内容。6更新成5的内容,....当然序号没有变。
 
你的where 写错了吧
 
sq:='update ..... where ..........';
这可以更新所有数据满足条件的记录,为什么还要:
ADOQuery1.refresh;
ADOQuery1.next;//循环
可能是这里的问题。
把这两句都注释掉,试一下。好好检查一下代码,很可能是个低级错误。
 
楼主,最好设置断点,调试一下程序吧。看哪里进行第二次更新了。
 
楼主,最好设置断点,调试一下程序吧。看哪里进行第二次更新了。
好的。
 
下断点测试没有任何问题,update 语句正确,也没有多余的update语句。
 
sq:='update ..... where ..........';
这可以更新所有数据满足条件的记录,为什么还要:
ADOQuery1.refresh;
ADOQuery1.next;//循环
--------------------------------------------------------------------
sq:='update ..... where ..........';
这个应该更新1条数据,因为where后面的满足的条件的数据是唯一的。
ADOQuery1.next;的原因是我要读符合条件adoquery1的每条数据的序号信息啊。才能在adoquery2中where xh=adoquery1.filedbyname('××').value;

我的意思是query1筛选出一部分数据。
再用query2对此数据逐条更新。但是不可能一次完成,不然我就写成一条语句了。
 
where是不可能写错的。因为我要更新的数据确实更新了,只是他的下一条也被多更新了。
 
跟踪代码
 
跟踪代码

-----------

跟踪过了,没有问题啊。调试也没有发现问题。有没有人象我这么用过。
query1筛选,query2再对筛选的数据逐条更新。
 
var
l:integer;
for l:=1 to adoquery1.recordcount do
begin
sq:='update ..... where ..........';
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Text := Sq;
adoquery2.ExecSQL;
ADOQuery1.next;//循环
i:=i+1;
end;
这样就可以了。
 
我怀疑再用query2之前,query1是否应该锁定。否则query2一更新数据,理论上query1筛选出的数据也要变的。
 
用法肯定没问题!可以这样做。你把所有的代码都贴出来
 
while qry1.RecordCount <> 0 do
begin
sq:='update ..... where ..........';
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Text := Sq;
adoquery2.ExecSQL;
Qry1.ReQuery; //更新之后从新查询,过滤更新后的数据,总是更新第一条。
end;
试试这样。
这是个笨方法,效率很低。
 
后退
顶部