procedure TFormMain.FormCreate(Sender: TObject);
begin
  try
    At1.Open;
    At1.Filtered := False;
    At1.Filter := 'State = ''1'' ';
    At1.Filtered := True;
  except
    ShowMessage('连接数据库时发生错误!');
    Application.Terminate;
  end;end;procedure TFormMain.BitBtn1Click(Sender: TObject);
begin
   At1.Edit;
   At1.FieldByName('State').AsString := '5';
   At1.Post;
end;当运行到At1.Post时报错如下:
Project Project1.exe raised exception class EOleException with Message 
'BOF 或 EOF中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。'但是里边确实有记录呀。

解决方案 »

  1.   

    atl 的指针指到了最后一个。
      

  2.   

    如果你用的是delphi 5+ado,赶快升级ado
      

  3.   

    procedure TFormMain.BitBtn1Click(Sender: TObject);
    begin
       if not at1.eof then
       begin
       At1.Edit;
       At1.FieldByName('State').AsString := '5';
       At1.Post;
       end;
    end;没有当前记录的话,你修改的是什么呢?
      

  4.   

    个人认为flyingkiller(大飞虫) 说的比较正确,因为sql server会自动把指针向下移一个,如果是eof(最后一条),会变成空纪录
      

  5.   

    同意以下:
    //////////////////////////////////////////////////////////////////////////
    回复人: netdis(我是一条虫) ( ) 信誉:100  2003-05-06 10:34:00  得分:0 
     
     
      如果你用的是delphi 5+ado,赶快升级ado
      
     
      

  6.   

    to:flyingkiller(大飞虫) 
    试过了,还是不行,记录值没有更改。也就是说“State”还是原来的值。
    to:jenemery(小熊) 
    我用的是Delphi6+MsSql2000
      

  7.   

    与Ado和Delphi补丁没有关系,而且我已经打了Delphi6的第二个补丁。
      

  8.   

    用At1.FieldByName('State').Value := '5';试试看
      

  9.   

    这里的问题是:
    1、当你改变state 值的时候,该变的是内存中缓存的值,由于当前纪录的状态是过滤状态,因此该纪录立刻被过滤了。
    2、要想你的代码能够运行,你应该在获取数据集的时候包含主健。保证在更新时,数据库能够找到要更新的纪录。
      

  10.   

    procedure TFormMain.BitBtn1Click(Sender: TObject);
    begin
       At1.append;
       At1.FieldByName('State').AsString := '5';
       At1.Post;
    end;
      

  11.   

    原因是修改前,游标是指着某一条记录,post时,该记录被过滤了,所以游标指向的行不存在了.
    At1.Filtered := False;
    At1.Edit;
    At1.FieldByName('State').AsString := '5';
    At1.Post;
    At1.First;
    At1.Filtered := True;