提示错误either bof or eof is true;但记录集肯定有记录,代码如下,帮看一下。  Cmb_DeptRedeploy.Clear;
  With DataModule1 do
  begin
    Rs1.Recordset.Close;
    Rs1.Active:=False;
    Rs1.SQL.Clear;
    Rs1.SQL.Add('Select Dept From Dept Where Factory=''' + Cmb_FactoryRedeploy.Text + ''' order by Dept');
    Rs1.Prepared:=true;
    Rs1.Active:=True;
    caption:=inttostr(Rs1.recordcount);
    //Rs1.Recordset.MoveFirst;//假如把这行代码加上就不会出错,
    while not Rs1.Recordset.EOF do
    begin
      Cmb_DeptRedeploy.Items.Add(Rs1.Recordset.Fields['Dept'].Value);//这一句出错打开记录集的时候,指针应该在第一条记录,怎么回出错
      Rs1.Recordset.MoveNext;
    end;
    if Cmb_DeptRedeploy.Items.Count>0 then
    begin
      Cmb_DeptRedeploy.ItemIndex:=0;
    end
    else
      Cmb_DeptRedeploy.Text:='';
  end;

解决方案 »

  1.   

    用OPEN试一下:
    Cmb_DeptRedeploy.Clear;
      With DataModule1 do
      begin
        Rs1.Recordset.Close;
        Rs1.Active:=False;
        Rs1.SQL.Clear;
        Rs1.SQL.Add('Select Dept From Dept Where Factory=''' + Cmb_FactoryRedeploy.Text + ''' order by Dept');
        Rs1.open;
        caption:=inttostr(Rs1.recordcount);
        //Rs1.Recordset.MoveFirst;//假如把这行代码加上就不会出错,
        while not Rs1.Recordset.EOF do
        begin
          Cmb_DeptRedeploy.Items.Add(Rs1.Recordset.Fields['Dept'].Value);//这一句出错打开记录集的时候,指针应该在第一条记录,怎么回出错
          Rs1.Recordset.MoveNext;
        end;
        if Cmb_DeptRedeploy.Items.Count>0 then
        begin
          Cmb_DeptRedeploy.ItemIndex:=0;
        end
        else
          Cmb_DeptRedeploy.Text:='';
      end;
      

  2.   

    To  wdsimon(老王) ( ) :试了,效果还是一样,不行
      

  3.   

    刚刚试了一下发现是MOVENEXT的问题,用NEXT就不会了:
    Cmb_DeptRedeploy.Clear;
      With DataModule1 do
      begin
        Rs1.Recordset.Close;
        Rs1.Active:=False;
        Rs1.SQL.Clear;
        Rs1.SQL.Add('Select Dept From Dept Where Factory=''' + Cmb_FactoryRedeploy.Text + ''' order by Dept');
        Rs1.open;
        caption:=inttostr(Rs1.recordcount);
        //Rs1.Recordset.MoveFirst;//假如把这行代码加上就不会出错,
        while not Rs1.Recordset.EOF do
        begin
          Cmb_DeptRedeploy.Items.Add(Rs1.Recordset.Fields['Dept'].Value);//这一句出错打开记录集的时候,指针应该在第一条记录,怎么回出错
          Rs1.next;
        end;
        if Cmb_DeptRedeploy.Items.Count>0 then
        begin
          Cmb_DeptRedeploy.ItemIndex:=0;
        end
        else
          Cmb_DeptRedeploy.Text:='';
      end;
      

  4.   

    To  wdsimon(老王) ( ) :试了,效果还是一样,不行,说明一下,我用的是Delphi7,会不会是没有打补丁,delphi7有补丁吗?在那里下载,修复什么功能?
      

  5.   

    呵呵,我用delphi6,我是初学DELPHI(一个多月了),不知道哪里有下
      

  6.   

    是ADO的问题去,下载一个补丁,
    ftp://ftpc.borland.com/pub/bcppbuilder/devsupport/patches/bcpp5/
      

  7.   

    Cmb_DeptRedeploy.Items.Add(Rs1.Recordset.Fields['Dept'].Value);//这一句出错打开记录集的时候,指针应该在第一条记录,怎么回出错
    试试这样:
    Cmb_DeptRedeploy.Items.Add(Rs1.Recordset.Fields['Dept'].AsString);
      

  8.   

    To lw549(★回帖,接分,学习★) :
    提示asstring没有定义
      

  9.   

    Cmb_DeptRedeploy.Items.Add(Rs1.Recordset.FieldByName('Dept').AsString);
      

  10.   

    也许这些对大家分析有帮助,上面的代码写在Cmb_FactoryRedeployChange事件里,我在Formcreate事件里有一行代码
    FactoryRedeployChange
    但没有出错,觉得很奇怪
      

  11.   

    to  lw549(★回帖,接分,学习★) :FieldByName没有定义,我想问一下,Delphi7是否需要打补丁,修复那些功能
      

  12.   

    Cmb_DeptRedeploy.Items.Add(Rs1.Recordset.FieldByName('Dept').AsString);
    我一直用Recordset->ADOQuery,没有出现过上面的情况。
      

  13.   

    下面这个来自DB.pas,FieldByName的详细说明
    function TDataSet.FieldByName(const FieldName: string): TField;
    begin
      Result := FindField(FieldName);
      if Result = nil then DatabaseErrorFmt(SFieldNotFound, [FieldName], Self);
    end;
      

  14.   

    如果没有打补丁,打四个补丁
    1、到delphi找到dephi的补丁
    2、到delphi找到关于ado的补丁
    3、到微软网站找最新的mdac版本
    4、到微软网站找到最新的service pack4管同下,不信解决不了
      

  15.   

    delphi 存在这样的问题
      

  16.   

    说明一下,打开数据库时默认返回所有数据,delphi 编历到未了
      

  17.   

    我越到过这个问题:
    Rs1.Active:=True;
    caption:=inttostr(Rs1.recordcount);
    这句以后,你的程序触发了一个事件,而这个事件中尼做了不该做的事情。
    所以出错。
    而你加了,movefirst就不错了。显而易见。好好看看。不谢。
      

  18.   

    to  ebensy(郝雷) :
    应该不是这个原因,因为是出错了,我才加caption:=inttostr(Rs1.recordcount);看看是否有记录
      

  19.   

    to ltmb118() :
    数据库有主键,有影响吗?
      

  20.   

    哈哈,我也磁到过,不过没解决,补丁也下了,没用。
    好象ADO就是还有问题,不知道怎么回事。
      

  21.   

    跟补丁有什么关系。你要做的是不是---从表dept中获得工厂=‘某个工厂’,加入到combobox控件中去,方便用户选择---是吗?//这样做:1.数据模块DataModule1中加入adoconnection,设置连接字符串。
    2.Form中放入adoquery,什么都不用设置。
    3.在form1的onshow事件中写代码,加入数据到combobox:代码如下:
      //清空combobox控件 
     Cmb_DeptRedeploy.Clear;
     
     //adoquery1连接到adoconnection1 
     adoquery1.connection:=DataModule1.adoconnection1;
     
     //清空sql string
     adoquery1.sql.clear; 
     
     //sql string
     adoquery1.sql.add('Select Dept From Dept Where Factory=''' +  Cmb_FactoryRedeploy.Text + ''' order by Dept');  //先关闭 
     adoquery1.close;  //再打开
     adoquery1.open;  //如果有数据,加载到Cmb_DeptRedeploy.没有就不管了,因为前面已经清空了。
     if adoquery1.eof=false then
     begin
         //第一个纪录,也可以不要此句
         adoquery1.first;
     
         while not adoquery1.eof do
         begin
              //加入
              Cmb_DeptRedeploy.Items.Add(adoquery1.fieldbyname('Dept').asstring);
              //下一个
              adoquery1.next; 
         end;        
         
         //combobox第一行
         Cmb_DeptRedeploy.itemindex:=0;
     end; ...
      

  22.   

    问题没有得到解决,先结贴,不想拖太长时间,有答案的朋友可以Email给我:[email protected]