用的AdoDataSet
procedure TForm1.Button1Click(Sender: TObject);
begin
  with AdoDataSet1 do begin
    if Active=True then Active:=False; // 以后会在这里出错
    CommandText:='select * from table where 条件';
    Open;
  end;
end;
先声明一下,select 语句里面没问题。
where 条件是根据窗体上几个Edit里的内容动态生成,(不会有错)
第一次执行,如果有符合条件的记录时,上面执行正常.
第二次:如果故意将一些条件组合设得超出范围,此时将查询不到记录.
第三次:执行时会在 if Active=True then Active:=False; 一行上出错:大概是 不能在已关闭的DataSet上执行此操作.('Cannot perform this operation on a closed dataset')。这一行又不能去掉,不然dataset打开的时候,又不能对commandtext赋值。
据我推测,在第二次执行后,虽然没有记录,但dataset是Close的,但Active=True。
以为是ADO的BUG,换了ado2.6,2.7还是同样问题!用adoquery也是一样!

解决方案 »

  1.   

    还有在执行第二次后,dataset里虽然没有记录,但检查recordcount=1 !
    isEmpty也返回False !
      

  2.   

    ADODATASET1。CLOSE BEFORE ACTIVE SET TO FALSE
      

  3.   

    with AdoDataSet1 do begin
        Active:=False; // 以后会在这里出错
        CommandText:='select * from table where 条件';
        active:=true;
      end;
      

  4.   

    楼上说的应该会产生同样的问题检查查找后返回的记录是否为空。这个错误可能是borland支持ado的一个bug
      

  5.   

    试试AdoDataSet1.Close
    先关了再Open嘛。
      

  6.   

    你是不是用的delphi5啊,要打d5的ADO补丁的,
    是D5的补丁不是系统ADO升级
      

  7.   

    我在Delphi6下试过了
    没有问题。
    :)
      

  8.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin  
      with AdoDataSet1 do begin
        close;
        CommandText:='select * from table where 条件';
        //if Active=True then Active:=False;  以后会在这里出错 或者
        if Active=false then Active:=true;  
        Open;
      end;
    end;
      

  9.   

    ADODataSet1.Colse;
    ADODataSet1.Commandtext:='';
    ADODataSet1.CommandText:='select * from table where 条件';
    ADODataSet1.Open;
      

  10.   

    这好像是Delphi5中Ado的bug,如果使用delphi5,则需要update2