Delphi 循环 ,急!谢谢! 5
我的代码如下:当运行到adoquery1.Next时会报:adoquery1cannotperformthisoperationonacloseddataset的错误,为...
我的代码如下:当运行到adoquery1.Next时会报:adoquery1 cannot perform this operation on a closed dataset的错误,为什么?
adoquery1.First;
while not adoquery1.Eof do
begin
tsh:=adoquery1.fieldbyname('TSH').AsFloat;
hj:=(tsh*195+kch*195*0.75+qjz*195)*0.16;
sqlstr:=format('update t_glgzdru1 set JE=%6g',[hj]);
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(sqlstr);
adoquery1.ExecSQL;
adoquery1.Next;
end;
谢谢你,懒虫007!可是我加了一个数据集adoquery2后,满足条件的JE这个字段的所有记录都为一个数据,比方说50,就是说在hj:=(tsh*195+kch*195*0.75+qjz*195)*0.16中tsh,kch,qjz没起到作用,为何? 展开
adoquery1.First;
while not adoquery1.Eof do
begin
tsh:=adoquery1.fieldbyname('TSH').AsFloat;
hj:=(tsh*195+kch*195*0.75+qjz*195)*0.16;
sqlstr:=format('update t_glgzdru1 set JE=%6g',[hj]);
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(sqlstr);
adoquery1.ExecSQL;
adoquery1.Next;
end;
谢谢你,懒虫007!可是我加了一个数据集adoquery2后,满足条件的JE这个字段的所有记录都为一个数据,比方说50,就是说在hj:=(tsh*195+kch*195*0.75+qjz*195)*0.16中tsh,kch,qjz没起到作用,为何? 展开
2个回答
展开全部
问题在于你在循环内部改变了adoquery1的状态,
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(sqlstr);
adoquery1.ExecSQL;
这部分语句实际上会造成Adoquery1里面没有任何记录,处于关闭状态,当然也就无法使用记录集操作adoquery1.Next了,解决的办法是在窗体上再添加一个adoquery2然后
adoquery1.First;
while not adoquery1.Eof do
begin
tsh:=adoquery1.fieldbyname('TSH').AsFloat;
hj:=(tsh*195+kch*195*0.75+qjz*195)*0.16;
sqlstr:=format('update t_glgzdru1 set JE=%6g',[hj]);
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add(sqlstr);
adoquery2.ExecSQL;
adoquery1.Next;
end;
另外你的update语句也有问题,没有限制条件,所有会造成所有记录都变成一样的值了。
对于这样的情况应该有办法来解决:
1、使用记录方法:
while not adoquery1.eof do
begin
adoquery1.edit;
adoquery1.fieldbyname('JE').value :=(adoquery1.fieldbyname('TSH').AsFloat*195+adoquery1.fieldbyname('TSH').AsFloat*195*0.75+qjz*195)*0.16;
adoquery1.post;
adoquery1.next;
end;
这种情况是在字段JE与TSH在一个记录集的情况,如果不在一个记录集,可以再添加一个adoquery来实现操作。
2、使用SQL语句来操作:
update t_glgzdru1 set JE= TSH*195+TSH*195*0.75+qjz(这里替换成字段名)*0.16
直接执行这样的一条语句就可以完成整个表格的更新,所以从效率的角度来看,还是直接用SQL比较好。
3、在你的SQL语句里面添加where条件,继续用循环来完成。
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(sqlstr);
adoquery1.ExecSQL;
这部分语句实际上会造成Adoquery1里面没有任何记录,处于关闭状态,当然也就无法使用记录集操作adoquery1.Next了,解决的办法是在窗体上再添加一个adoquery2然后
adoquery1.First;
while not adoquery1.Eof do
begin
tsh:=adoquery1.fieldbyname('TSH').AsFloat;
hj:=(tsh*195+kch*195*0.75+qjz*195)*0.16;
sqlstr:=format('update t_glgzdru1 set JE=%6g',[hj]);
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add(sqlstr);
adoquery2.ExecSQL;
adoquery1.Next;
end;
另外你的update语句也有问题,没有限制条件,所有会造成所有记录都变成一样的值了。
对于这样的情况应该有办法来解决:
1、使用记录方法:
while not adoquery1.eof do
begin
adoquery1.edit;
adoquery1.fieldbyname('JE').value :=(adoquery1.fieldbyname('TSH').AsFloat*195+adoquery1.fieldbyname('TSH').AsFloat*195*0.75+qjz*195)*0.16;
adoquery1.post;
adoquery1.next;
end;
这种情况是在字段JE与TSH在一个记录集的情况,如果不在一个记录集,可以再添加一个adoquery来实现操作。
2、使用SQL语句来操作:
update t_glgzdru1 set JE= TSH*195+TSH*195*0.75+qjz(这里替换成字段名)*0.16
直接执行这样的一条语句就可以完成整个表格的更新,所以从效率的角度来看,还是直接用SQL比较好。
3、在你的SQL语句里面添加where条件,继续用循环来完成。
展开全部
adoquery1.First;
while not adoquery1.Eof do
begin
tsh:=adoquery1.fieldbyname('TSH').AsFloat;
hj:=(tsh*195+kch*195*0.75+qjz*195)*0.16;
sqlstr:=format('update t_glgzdru1 set JE=%6g',[hj]);
....
在 adoquery1.first 后添加:
tsh:=adoquery1.fieldbyname('TSH').AsFloat;
hj:=(tsh*195+kch*195*0.75+qjz*195)*0.16;
在找到第一笔记录的时候就给tsh,hj赋值.
试试吧.
while not adoquery1.Eof do
begin
tsh:=adoquery1.fieldbyname('TSH').AsFloat;
hj:=(tsh*195+kch*195*0.75+qjz*195)*0.16;
sqlstr:=format('update t_glgzdru1 set JE=%6g',[hj]);
....
在 adoquery1.first 后添加:
tsh:=adoquery1.fieldbyname('TSH').AsFloat;
hj:=(tsh*195+kch*195*0.75+qjz*195)*0.16;
在找到第一笔记录的时候就给tsh,hj赋值.
试试吧.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询