unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    ADODataSet1: TADODataSet;
    ADODataSet1a: TStringField;
    ADODataSet1b: TStringField;
    ADODataSet1c: TStringField;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  i :Integer;
begin
  ADODataSet1.Filtered := false;
 for i := 0 to 100 do
  adodataset1.InsertRecord([IntToStr(i),IntToStr(i),IntToStr(i)]);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  ADODataSet1.Filter := 'a=' +quotedstr('111');
 ADODataSet1.Filtered := True;
  ShowMessage(IntToStr(ADODataSet1.RecordCount));
  //if (not ADODataSet1.Eof) and (not ADODataSet1.Bof) then
    if ADODataSet1.Locate('a','1',[]) then
       ShowMessage(ADODataSet1.fieldbyname('a').AsString);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  ADODataSet1.CreateDataSet;
end;end.以上是一个简单的测试代码1、Button2中过滤后没有记录时,再LOCATE一个存在的记录,就会报BOF或EOF为真的错误2、将button2中的代码改成    ADODataSet1.Filter := 'a=' +quotedstr('1');
    ADODataSet1.Filtered := True;
    if ADODataSet1.Locate('a','0',[]) then
       ShowMessage(ADODataSet1.fieldbyname('a').AsString);会发现show出来的是‘1’。3、将button2中的代码改成  
    ADODataSet1.Filter := 'a=' +quotedstr('0'); //第一条
    ADODataSet1.Filtered := True;    if ADODataSet1.Locate('a','1',[]) then
       ShowMessage(ADODataSet1.fieldbyname('a').AsString);

  ADODataSet1.Filter := 'a=' +quotedstr('100'); 
  ADODataSet1.Filtered := True;
  if ADODataSet1.Locate('a','100',[]) then  //最后一条
       ShowMessage(ADODataSet1.fieldbyname('a').AsString);  会发现什么也不show
具体原因大家可以分析一下,提示一下:注意分析 TCustomADODataSet.LocateRecord 这个函数