adoquery1中sql语句是一个select语句,在程序中经常要判断这个select出来
数据集是否为空?
我经常用
if adoquery1.recordcount<>0 then
//非空
else
//空
但是这个语句的缺点是万一select出来的集合很多
那recordcount很费时间
一般采用什么方法可以保证时间最快?
数据集是否为空?
我经常用
if adoquery1.recordcount<>0 then
//非空
else
//空
但是这个语句的缺点是万一select出来的集合很多
那recordcount很费时间
一般采用什么方法可以保证时间最快?
begin
...
end;
//非空
else
//空
//空
else
//非空
adoquery1.first;
if adoquery1.Bof and adoquery1.eof then
为空
else 非空;
end;
adoquery1.close;
adoquery1.sql.text := 'select Count(*) as MyCount from table1';
adoquery1.Open;
showmessage(adoquery1.fieldbyname('mycount').asstring);
function TDataSet.IsEmpty: Boolean;
begin
Result := FActiveRecord >= FRecordCount;
end;
IsEmpty 的实现只是对 TDataSet 的两个数据成员的比较而已
RecordCount 则有一个计算过程如果用 Select Count(*) ,则还要从服务器上去取,因为你的数据先前以经取回来了,这里又多了一次访问服务器。
if adoquery1.IsEmpty then
//非空
else
//空
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 过程就会产生的事件.
if query1.fieldbyname(cou).asinteger>0 then
else
也是我所知道的最快的方法...
但缺点是不知道总数,如果要操作结果集,则需要在查询一次(在有结果集的情况下
多了前一次查询,不过 "select top 1 * from ... where ..."的代价实在太小,无论表中有
多少记录,考虑到数据库效率方面,只有在没有一条符合条件的记录情况下与"select count(*) from ..."等效,其它情况均有较高效率)
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 ...
if query1.bof<>query1.eof then这样绝对可以判断任何一种情况下的非空!
recordcount判断很慢,而且在oracle和sybase中可能会有些问题必须移动游标才能判断,而且还会出现-1的情况,isempty没有用过,估计很好用,first if eof这样多一次移动游标操作
if ADOQuery1.IsEmpty then
begin
ShowMessage('没有任何数据'
end
else begin
ShowMessage('至少有一条数据');
end;
if adoquery.recordcount<1 then ShowMessage('没有任何数据');
判断一个记录集是否为空,不在乎用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;
if not ds1.fields[0].isnull then ...