adoquery1中sql语句是一个select语句,在程序中经常要判断这个select出来
数据集是否为空?
我经常用
if adoquery1.recordcount<>0 then 
//非空
else
//空
但是这个语句的缺点是万一select出来的集合很多
那recordcount很费时间
一般采用什么方法可以保证时间最快?

解决方案 »

  1.   

    if adoquery1.fieldvalues['xx']=Null then
    begin
      ...
    end;
      

  2.   

    试试: miaomiaowq(猫的老师-老虎的克星:武松) ( ) 的方法
      

  3.   

    IsEmpty方法if adoquery1.IsEmpty then 
    //非空
    else
    //空
      

  4.   

    反了if adoquery1.IsEmpty then 
    //空
    else
    //非空
      

  5.   

    begin
      adoquery1.first;
      if adoquery1.Bof and adoquery1.eof then 
        为空
      else 非空;
    end;
      

  6.   

    这个问题我认为还是用adoquery1.recordcount好一些,本来recordcount就是为了判断记录用的。至于记录条数太多的问题这可以通过SELECT的条件限制,在判断记录的时候用一个选择条件限制记录集的大小就可以了。在实际的操作的时候再选择一遍记录就可以了。
      

  7.   

    adoquery1.recordcount每次都要把数据取到客户端计算个数,数据多时特别慢用以下方法是最安全,速度最快,最好的
      
      adoquery1.close;
      adoquery1.sql.text := 'select Count(*) as MyCount from table1';
      adoquery1.Open;
      showmessage(adoquery1.fieldbyname('mycount').asstring);
      

  8.   

    我习惯于用,zhboy(孔方兄)的方法
      

  9.   

    如果只是为了判断,表格空与否,huojiehai(海天子)的方法确实较快
      

  10.   

    看了一下VCL代码,ISEMPTY好像也是判断recordcount
    function TDataSet.IsEmpty: Boolean;
    begin
      Result := FActiveRecord >= FRecordCount;
    end;
      

  11.   

    个人认为 IsEmpty 比较快。
    IsEmpty 的实现只是对 TDataSet 的两个数据成员的比较而已
    RecordCount 则有一个计算过程如果用 Select Count(*) ,则还要从服务器上去取,因为你的数据先前以经取回来了,这里又多了一次访问服务器。
      

  12.   


    if adoquery1.IsEmpty then 
    //非空
    else
    //空
      

  13.   

    var
      IsEmpty: Boolean; //判断状态
    在 AdoQuery 的 BeforeOpen 事件中加入语句, 使状态为空:procedure TForm1.ADOQuery1BeforeOpen(DataSet: TDataSet);
    begin
      IsEmpty := True;
    end;在到 AfterScroll 事件中加入语句使其为非空procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
    begin
      IsEmpty := False;
    end;因为: 当数据集返回的数据为空(没有记录)时不会产生 AfterScroll 事件.
    而 BeforeOpen 事件是只要 ADOQuery 一调用 Open 过程就会产生的事件.
      

  14.   

    select count(*) cou from table;
    if query1.fieldbyname(cou).asinteger>0 then 
    else
      

  15.   

    习惯PrgmLover(爱国者) ( )的方法
      

  16.   

    判断一个记录集是否为空,不在乎用BOF、EOF或RECORDCOUNT<>0或是用IsEmpty, 及用什么事件去做代码,关键是在于OPEN的时间开销。因此,对于较大的记录集而言,操作时尽量减少记录数是主要的。若是不能确定记录的个数时,可以采用二次取数的方法,先求其记录数,然后再根据需要取记录集。求记录数时,也不能用 SELECT * FROM T1 WHERE 条件 的方式,而是一样要减少记录个数,用 SELECT TOP 1 * FROM T1 WHERE 条件 的方法,只要有1个记录就非空。
      

  17.   

    同意 vchoushen6(vc火神6号) 的用法,本人常用此法判断记录是否为空...
    也是我所知道的最快的方法...
    但缺点是不知道总数,如果要操作结果集,则需要在查询一次(在有结果集的情况下
    多了前一次查询,不过 "select top 1 * from ... where ..."的代价实在太小,无论表中有
    多少记录,考虑到数据库效率方面,只有在没有一条符合条件的记录情况下与"select count(*) from ..."等效,其它情况均有较高效率)
      

  18.   

    我认为我上面两位的方法比较好,判断还是用adoquery.eof比较好一点吧
      

  19.   

    总体方法总结如下:
    1.recordcount
    2,isempty
    3,first;if eof then
    4,select Count(*) as MyCount from table
    5,利用adoquery1的 BeforeOpen ,afterscroll事件
    6,SELECT TOP 1 * FROM T1 where ...
      

  20.   

    好像还有一种大家没有用过
    if query1.bof<>query1.eof then这样绝对可以判断任何一种情况下的非空!
    recordcount判断很慢,而且在oracle和sybase中可能会有些问题必须移动游标才能判断,而且还会出现-1的情况,isempty没有用过,估计很好用,first if eof这样多一次移动游标操作
      

  21.   

    没看见,好像前面有一位提出了这个方法,个人认为这个方法很快而且绝对准确。首先bof,eof都是这个query的属性,只是做一个判断就可以了,而且主要是准确性,recordcount的准确性是最值得怀疑的,尤其在bde+oracle的时候很难判断table.recordcount,query.recordcount,而且几乎是这种大的数据库都不能很好的支持这个recordcount的使用,所以感觉bof,eof好想比较好用
      

  22.   

    楼主,不好意思,这几天比较忙,来迟了。如下:
    if ADOQuery1.IsEmpty then
    begin
      ShowMessage('没有任何数据'
    end
    else begin
      ShowMessage('至少有一条数据');
    end;
      

  23.   

    每次都是用:
    if adoquery.recordcount<1 then ShowMessage('没有任何数据');
      

  24.   

    有另外一个朋友的看法:
    判断一个记录集是否为空,不在乎用BOF、EOF或RECORDCOUNT<>0或是用IsEmpty, 及用什么事件去做代码,关键是在于OPEN的时间开销。因此,对于较大的记录集而言,操作时尽量减少记录数是主要的。若是不能确定记录的个数时,可以采用二次取数的方法,先求其记录数,然后再根据需要取记录集。求记录数时,也不能用 SELECT * FROM T1 WHERE 条件 的方式,而是一样要减少记录个数,用 SELECT TOP 1 * FROM T1 WHERE 条件 的方法,只要有1个记录就非空。ds1.CommandText:='select top 1 * from t1';
    ds1.Open;
    if not ds1.isEmpty then begin
       ds1.Close;
       ds1.CommandText:='select * from t1';
       ds1.Open;
      end
     else begin
      //空时的处理代码
    end;
      

  25.   

    ds1.open;
    if not ds1.fields[0].isnull then ...