procedure TForm1.Button1Click(Sender: TObject);
var  str_temp: string;
begin
    ADODataSet2.Close;
    ADODataSet2.CommandText := 'select * from vegetable';
    { 内容如下:
veid    mid     goodsname          spec                       unitname
------- ------- ------------------ -------------------------- ----------
1       1024    辣椒                 大                          kg
2       2014    猪肉                 瘦                          kg
4       2015    羊肉                 山羊                        kg
5       6897    芹菜                 鲜                          kg(所影响的行数为 4 行)
    }
    ADODataSet2.Open;
    ShowMessage(IntToStr(ADODataSet2.RecordCount));
    if ADODataSet2.RecordCount > 0 then
    begin
      ADODataSet2.Recordset.MoveFirst;
      while not ADODataSet2.Eof do
      begin
        if ADODataSet2.Eof   then
          ShowMessage('靠,怎么到最后了。');
        if ADODataSet2.Bof then
          ShowMessage('靠,怎么到最前端了。');
        //str_temp := ADODataSet2.Fields[1].AsString;
        str_temp := ADODataSet2.Recordset.Fields['mid'].Value;
        ShowMessage(str_temp);
        ADODataSet2.Recordset.MoveNext;
      end;
    end;
    ADODataSet2.Close;
end;    {
    如果是使用 str_temp := ADODataSet2.Recordset.Fields['mid'].Value;
    则提示分别为 “4”、“靠,怎么到最前端了。”、“1024”、
    “靠,怎么到最前端了。”、“2014”、“靠,怎么到最前端了。”、
    “2015”、“靠,怎么到最前端了。”、“6897”、“靠,怎么到最前端了。”、
     然后出现错误
     “BOF或EOF中有一个是真,或者当前的纪录已被删除、所需的操作要求一个当前的纪录。”     如果使用  str_temp := ADODataSet2.Fields[1].AsString;
     则提示分别为“4”、“靠,怎么到最前端了。”、“1024”、
     “靠,怎么到最前端了。”、“1024”、“靠,怎么到最前端了。”、“1024”、
     “靠,怎么到最前端了。”、“1024”、“靠,怎么到最前端了。”、“1024”、
     然后出现错误
     “BOF或EOF中有一个是真,或者当前的纪录已被删除、所需的操作要求一个当前的纪录。”
    }
注:我使用的是Delphi 6,已经装过2个补丁,实在不知道为什么会出现这样的结果,请帮忙,谢谢.

解决方案 »

  1.   

    没怎么试,不过你循环的时候是拿ADODataSet2.Eof 做判断条件,然后又用ADODataSet2.Recordset.MoveNext;我想是不是这有点问题啊。
      

  2.   

    Recordset属性提供对ADO recordset object的直接操作(帮助).
    我不知用这个属性的好处,但我的建议是如果用,就全用,如ADODataSet2.Eof改为ADODataSet2.Recordset.Eof.否则就别用Recordset了.Using recordset is not recommended unless you are familiar with recordset object
                       ^^^
     operations.
      

  3.   

    ShowMessage('靠,怎么到最前端了。');你厉害,老板看了么
      

  4.   

    靠,头都看大了不过总算看懂,语句是没什么毛病str_temp := ADODataSet2.Fields[1].AsString;
    这句应该为 str_temp := ADODataSet2.Fields.Fields[1].AsString;
    算了,还是等后面的高手们解释一下吧
      

  5.   

    提示信息还可以这样写,牛!
    pf pf
      

  6.   

    var  str_temp: string;
    begin
        ADODataSet2.Close;
        ADODataSet2.CommandText := 'select * from gz_AssetCard';    ADODataSet2.Open;
        ShowMessage(IntToStr(ADODataSet2.RecordCount));
        if ADODataSet2.RecordCount > 0 then
        begin
          ADODataSet2.Recordset.MoveFirst;
          while not  ADODataSet2.Recordset.EOF do
          begin
            if ADODataSet2.Recordset.EOF   then
              ShowMessage('靠,怎么到最后了。');
            if ADODataSet2.Recordset.BOF then
              ShowMessage('靠,怎么到最前端了。');
            //str_temp := ADODataSet2.Fields[1].AsString;
            str_temp := ADODataSet2.Recordset.Fields['Card_No'].value;
            ShowMessage(str_temp);
            ADODataSet2.Recordset.MoveNext;
          end;
        end;
        ADODataSet2.Close;
    end;
      

  7.   

    frist bs 楼主,四条裤衩的人还那么差的程序写出来
    Second 别用DATASET吧,用QUERY吧,你用        ADODataSet2.Recordset.MoveNext;
    和while not ADODataSet2.Eof do来判断循环 ,从错误消息可以看出,ADODATASET。BOF始终为TRUE, 你用ADODATASET2。RECORDSET。MOVENEXT,移动了四个指针后,就移向空了
      

  8.   

    靠﹗真強﹗打上ADO補丁﹐MDAC更新掉
    (不過好像我更新到2.7就出現這種情況﹐后來將其中兩個Dll文件覆蓋掉了就沒事﹐這兩個文件好像是低版本的﹐具體原因到現在我也不得而知﹐只要稱動記錄就會出現說Eof或Bof為真的錯誤信息。我的是D5+SQL 7.0)
      

  9.   

    升级ADO吧1!!
    ShowMessage('靠,怎么到最后了。');
           ================
    强!!!
      

  10.   

    rockswj(石头,继续学习) 
    huayuxing(huayuxing)应该是对的。
      

  11.   

    不用看,打补丁
    ——delphi真他妈的垃圾,程序员的时间老是被补丁和bug无谓的浪费掉