下面这段delphi代码为什么不能按照我预期的执行。
我设计的目的就是判断如果query1指向的表中的值在query2指向的表中找不到值,就在q2中插入一条记录。代码变异没错误,但是达不到预期设计的目的。谁能帮帮我啊。
begin
ADOQuery1.First ;
ADOQuery2.First ;
while not ADOQuery1.Eof do
begin
while not ADOQuery2.Eof do
begin
if not ADOQuery1.Locate('num',ADOQuery2.Fields.Fields[0].AsInteger,[loCaseInsensitive]) then
//判断q1字段在q2中能否查询到
begin
ADOQuery2.append;
ADOQuery2.Edit ;
ADOQuery2.FieldByName('num').AsInteger:=ADOQuery1.Fields.Fields[0].AsInteger ;
ADOQuery2.FieldByName('score').AsInteger:=ADOQuery1.Fields.Fields[1].AsInteger ;
ADOQuery2.Post;
end;
ADOQuery2.Next;
end;
ADOQuery1.Next;
end;
end;
答案:我来总结一下楼上二位的话吧:
首先你的代码中有错误,你是说在ADOQuery2中查找数值,但是你的代码中却是:
if not ADOQuery1.Locate('num',ADOQuery2.Fields.Fields[0].AsInteger,[loCaseInsensitive]) then
这是在ADOQuery1中查找数值
其次,你对Locate函数的认识有问题,而且Locate函数会自动从上外下查找RecordSet,所以你不需要遍历ADOQuery2,而是使用ADOQuery2.First。所以代码应该改成:
另外Append与Insert会自动打开当前RecordSet,所以没有必要使用Edit命令.
begin
//遍历ADOQuery1
ADOQuery1.First;
while not ADOQuery1.Eof do
begin
//将ADOQuery2移动到第一条记录使ADOQuery2可以从头查找
ADOQuery2.First;
//判断q1字段在q2中能否查询到
if not ADOQuery2.Locate('num',ADOQuery1.Fields.Fields[0].AsInteger,[loCaseInsensitive]) then
begin
//向ADOQuery2添加一条记录
ADOQuery2.append;
ADOQuery2.FieldByName('num').AsInteger:=ADOQuery1.Fields.Fields[0].AsInteger ;
ADOQuery2.FieldByName('score').AsInteger:=ADOQuery1.Fields.Fields[1].AsInteger ;
ADOQuery2.Post;
end;
end;
ADOQuery1.Next;
end;
其他:你的if上有问题吧!没有达到你判断 判断如果query1指向的表中的值在query2指向的表中找不到值 放的效果 在IF NOT 前,加入: ADOQuery2.FIRST
上一个:适合Delphi 制作大按键的软件皮肤制作工具?
下一个:在delphi中,点一个按钮,就新建一个文本文件,并用现在的时间命名,并把memo的内容写入。