ADOQuery1.Close;
ADOQuery1.SQL.Text := 'select username,announceid from bbs1 where isre=0';
ADOQuery1.Open ;
IF Not(ADOQuery1.Eof) Then
   Begin
     While not ADOQuery1.Eof Do
       Begin
         ADOQuery2.Close;
         ADOQuery2.SQL.Text := 'select userid from [user] where username='''+ADOQuery1.Fieldbyname('username').Value+'''';
         ADOQuery2.Open ;
         IF Not(ADOQuery2.Eof) and Not(ADOQuery2.Bof) Then
            userid := ADOQuery2.Fieldbyname('userid').Value
         Else
            userid := 0;
         ADOQuery2.Close;
         ADOQuery2.SQL.Text := 'update bbs1 set postuserid='+IntToStr(userid)+',isre=1 where announceid='+IntToStr(ADOQuery1.Fieldbyname('announceid').Value)+'';
         ADOQuery2.ExecSQL ;
         ADOQuery1.Next;
       End;
   End;

解决方案 »

  1.   

    IF Not(ADOQuery1.Eof) Then
     While not ADOQuery1.Eof Do???????
      

  2.   

    同意 thisisxutao(Probational 1.0)
      

  3.   

    While not ADOQuery1.Eof Do 有什么用阿?
      

  4.   

    因为处理的ACCESS数据库,写不了存储过程。While not ADOQuery1.Eof Do是当ADOQuery1不为空的话,则执行循环体内的语句
      

  5.   

      While not ADOQuery1.Eof Do  
      

  6.   

    to thisisxutao(Probational 1.0) 我刚刚把IF语句去掉了测试,发现还是死循环。能在帮我看看循环体内有什么错误吗?
      

  7.   

    ADOQuery1.Close;
    ADOQuery1.SQL.Text := 'select username,announceid from bbs1 where isre=0';
    ADOQuery1.Open ;
    While not ADOQuery1.Eof Do
    Begin
      ADOQuery2.Close;
      ADOQuery2.SQL.Text := 'select userid from [user] where username='''+ADOQuery1.Fieldbyname('username').Value+'''';
      ADOQuery2.Open ;
      if not (ADOQuery2.IsEmpty) Then
        userid := ADOQuery2.Fieldbyname('userid').Value
      Else
        userid := 0;
      ADOQuery2.Close;
      ADOQuery2.SQL.Text := 'update bbs1 set postuserid='+IntToStr(userid)+',isre=1 where announceid='+IntToStr(ADOQuery1.Fieldbyname('announceid').Value)+'';
      ADOQuery2.ExecSQL ;
      ADOQuery1.Next;
    End;
      

  8.   

    试试下面的
    ADOQuery1.Close;
    ADOQuery1.SQL.Text := 'select username,announceid from bbs1 where isre=0';
    ADOQuery1.Open ;
    ADOQuery1.first;// 增加这一句
    //IF Not(ADOQuery1.Eof) Then 这个判断不要
    While not ADOQuery1.Eof Do
    Begin
      ADOQuery2.Close;
      ADOQuery2.SQL.Text := 'select userid from [user] where username='''+ADOQuery1.Fieldbyname('username').Value+'''';
      ADOQuery2.Open ;
      IF Not(ADOQuery2.Eof) and Not(ADOQuery2.Bof) Then
        userid := ADOQuery2.Fieldbyname('userid').Value
      Else
        userid := 0;
        ADOQuery2.Close;
        ADOQuery2.SQL.Text := 'update bbs1 set postuserid='+IntToStr(userid)+',isre=1 where announceid='+IntToStr(ADOQuery1.Fieldbyname('announceid').Value)+'';
        ADOQuery2.ExecSQL ;
      ADOQuery1.Next;
    End;
      

  9.   

    While not ADOQuery1.Eof Do
    这句没有用啊?
      

  10.   

    记录总共有3000多条程序改成了这样:ADOQuery1.Close;
    ADOQuery1.SQL.Text := 'select username,announceid from bbs1 where isre=0';
    ADOQuery1.Open ;
    ADOQuery1.First ;
    While not ADOQuery1.Eof Do
        Begin
    ADOQuery1.Next;
        End;正常。加上:ADOQuery2.Close;
    ADOQuery2.SQL.Text := 'select userid from [user] where username='''+ADOQuery1.Fieldbyname('username').Value+'''';
    ADOQuery2.Open ;
      IF Not(ADOQuery2.IsEmpty) Then
         userid := ADOQuery2.Fieldbyname('userid').Value
      Else
         userid := 0;死循环出现。这里面有错误吗?
      

  11.   

    你的意思是要更新BBS1的postuserid,请看看我的修改。ADOQuery1.Close;
    ADOQuery1.SQL.Text := 'select username,announceid from bbs1 where   
                           isre=0';
    ADOQuery1.Open ;
    ADOQuery1.First;
    While not ADOQuery1.Eof Do
      Begin
        ADOQuery2.Close;
        ADOQuery2.SQL.Text := 'select userid from [user] where     username='''+ADOQuery1.Fieldbyname('username').Value+'''';
        ADOQuery2.Open ;
        IF Not(ADOQuery2.Eof) and Not(ADOQuery2.Bof) Then
          userid := ADOQuery2.Fieldbyname('userid').Value
        Else
          userid := 0;
        //ADOQuery2.Close;
        //ADOQuery2.SQL.Text := 'update bbs1 set postuserid='+IntToStr(userid)+',isre=1 where             
    //              announceid='+IntToStr(ADOQuery1.Fieldbyname('announceid').Value)+'';
        //ADOQuery2.ExecSQL ;//new 
        ADOQuery1.edit;
        ADOQuery1.fieldbyname('postuserid').asinteger:=userid;
        ADOQuery1.fieldbyname('isre').asinteger:=1;
    //new     ADOQuery1.Next;
      End;
    ADOQuery1.post;
      

  12.   

    谢谢ezlz(猫嘴里的猪) ,但是错误并不发生在update语句,在它上面的Select语句已经出现了死循环。
      

  13.   

    ADOQuery2.Close;
    ADOQuery2.SQL.Text := 'select userid from [user] where username='''+ADOQuery1.Fieldbyname('username').Value+'''';
    ADOQuery2.Open ;
      IF Not(ADOQuery2.IsEmpty) Then
         userid := ADOQuery2.Fieldbyname('userid').Value
      Else
         userid := 0;知道程序停在哪一行吗?
      

  14.   

    //第一部份
    sqlstr:='select userid from user where username="' + ADOQuery1.Fieldbyname('username').AsString +'"';
    with ADOQuery2 do
        begin
          close;
          sql.clear;
          sql.add(sqlstr);
          open;
        end;
    //第二部份
      IF Not(ADOQuery2.IsEmpty) Then
         userid := ADOQuery2.Fieldbyname('userid').Value
      Else
         userid := 0;修改一下,第一部份有改变,第二部份未动。你先跟踪一下吧。要搞清楚程序在哪一行出错。
      

  15.   

    还有,要先定义一下:var   sqlstr:String;
      

  16.   

    ADOQuery1.Close;
    ADOQuery1.SQL.Text := 'select username,announceid from bbs1 where isre=0';
    ADOQuery1.Open ;
    ADOQuery1.first;// 增加这一句
    //IF Not(ADOQuery1.Eof) Then 这个判断不要
    While not ADOQuery1.Eof Do
    Begin
      ADOQuery2.Close;
      ADOQuery2.SQL.Text := 'select userid from [user] where username='''+ADOQuery1.Fieldbyname('username').Value+'''';
      ADOQuery2.Open ;
      //IF Not(ADOQuery2.Eof) and Not(ADOQuery2.Bof) Then
      IF ADOQuery2.Fields[0].isNull Then
        userid := ADOQuery2.Fieldbyname('userid').Value
      Else
        userid := 0;
        ADOQuery2.Close;
        ADOQuery2.SQL.Text := 'update bbs1 set postuserid='+IntToStr(userid)+',isre=1 where announceid='+IntToStr(ADOQuery1.Fieldbyname('announceid').Value)+'';
        ADOQuery2.ExecSQL ;
      ADOQuery1.Next;
    End;
    应该不会有死循环
      

  17.   

    Update以后重新定位而不是AdoQuery1.Next;
      

  18.   

    怎么会有两个while not AdoQuery1.Next;
    就算有两个,你也少了一个,第一个的循环没有next,当然是死循环了!
      

  19.   

    谢谢大家的帮助,根据大家的方法查看了一下,语句是没有错。但是效率极低,难道在DELPHI中嵌套查询效率真的这么低吗?3000多行要执行20、30分钟??我的天啊...
      

  20.   

    你试试我的方法,
    不用
    ADOQuery2.Close;
        ADOQuery2.SQL.Text := 'update bbs1 set postuserid='+IntToStr(userid)+',isre=1 where             
                  announceid='+IntToStr(ADOQuery1.Fieldbyname('announceid').Value)+'';
        ADOQuery2.ExecSQL ;
    而用
        ADOQuery1.edit;
        ADOQuery1.fieldbyname('postuserid').asinteger:=userid;
        ADOQuery1.fieldbyname('isre').asinteger:=1;
    最后要加个
        ADOQuery1.post;会好些的。
      

  21.   

    你试试我的方法,不用    ADOQuery2.Close;
        ADOQuery2.SQL.Text := 'update bbs1 set postuserid='+IntToStr(userid)+',isre=1 where             
                  announceid='+IntToStr(ADOQuery1.Fieldbyname('announceid').Value)+'';
        ADOQuery2.ExecSQL ;
    而用
    //new 
        ADOQuery1.edit;
        ADOQuery1.fieldbyname('postuserid').asinteger:=userid;
        ADOQuery1.fieldbyname('isre').asinteger:=1;
    //new 
    最后加个post.会好些的。
      

  22.   

    ezlz(猫嘴里的猪) 问题是我第一个select的时候就出了问题,open以后就慢得要死。我的天啊..
      

  23.   

    你能改数据结构吗?
    如果用关键字查找会好些,或者在bbs1中加一冗余字段存放userid,和user表
    建立多对一关联。试试吧,要去吃午饭了,午安!