请问有没有真正实践过的ADO异步查询同步显示数据状态和进度条的?
此问题分两步分:
1:显示当前查询的字段,比如某一瞬间查到了字段ctds的值 为xx
2:进度条同步显示当前进度
本人拆腾了好久,用ADO异步去做的时候非常出色,可是第二次点的时候就会发生内存泄漏而马上重启电脑
每次开机只能查询一次。
procedure TForm1.ADQFetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
var
str:string;
begin
isEnd:=GetTickCount;
str:='耗时共:'+FloatToStr((isEnd-isStart)/1000)+'秒' ;
{-----List view the datas begin--------}
dbgs.DataSource:=nil;
dbgs.DataSource:=tds;
hsCap.Caption:=str;
sunmRecord.Caption:=IntToStr(MaxSum);
// ShowMessage(str);
end;
procedure TForm1.adFetchProgress(DataSet: TCustomADODataSet; Progress,
MaxProgress: Integer; var EventStatus: TEventStatus);
begin
Gauge1.MaxValue:=MaxSum;
Gauge1.Progress:=Progress;
Application.ProcessMessages;end;查询部分:
procedure TForm1.btnsClick(Sender: TObject);
begin
ad.Connection:=nil;
ad.Connection:=ADC;
with ad do
begin
close;
SQL.Clear;
SQL.Clear;
SQL.add('select * from kq_workrecord');
open;
end;
tds.DataSet:=ad;
end;
--------------------
此问题分两步分:
1:显示当前查询的字段,比如某一瞬间查到了字段ctds的值 为xx
2:进度条同步显示当前进度
本人拆腾了好久,用ADO异步去做的时候非常出色,可是第二次点的时候就会发生内存泄漏而马上重启电脑
每次开机只能查询一次。
procedure TForm1.ADQFetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
var
str:string;
begin
isEnd:=GetTickCount;
str:='耗时共:'+FloatToStr((isEnd-isStart)/1000)+'秒' ;
{-----List view the datas begin--------}
dbgs.DataSource:=nil;
dbgs.DataSource:=tds;
hsCap.Caption:=str;
sunmRecord.Caption:=IntToStr(MaxSum);
// ShowMessage(str);
end;
procedure TForm1.adFetchProgress(DataSet: TCustomADODataSet; Progress,
MaxProgress: Integer; var EventStatus: TEventStatus);
begin
Gauge1.MaxValue:=MaxSum;
Gauge1.Progress:=Progress;
Application.ProcessMessages;end;查询部分:
procedure TForm1.btnsClick(Sender: TObject);
begin
ad.Connection:=nil;
ad.Connection:=ADC;
with ad do
begin
close;
SQL.Clear;
SQL.Clear;
SQL.add('select * from kq_workrecord');
open;
end;
tds.DataSet:=ad;
end;
--------------------
如果说内存泄漏的原因是一次性读取的数据太多了,ADO异步还有意义吗?异步只是给人看的了,如此而已。
30万条,用 select *的话,没试过,不敢想象。。
MaxProgress: Integer; var EventStatus: TEventStatus);
begin
Gauge1.MaxValue:=MaxSum;
Gauge1.Progress:=Progress;
Application.ProcessMessages;//这个地方去掉试试。
Gauge1.Refresh; //加进这句话;在开始查询的时候灰掉界面上的可执行控件。结束查询的时候在恢复一下end;
sql发出去了,在完成之前,数据库引擎是不会返回任何状态的——sql的执行时间,x秒
OnFetchComplete,是不是指返回数据的中间事件?——结果的网络传输时间,y秒如果sql很复杂,x可能很大。则这x秒里,是没有任何反应的
如果结果集很大,则y很大,则中间会有反应。
不过,一般应用很少返回这么大的记录集,尤其是用户等着看的时候,因为用户看几十万条记录是不现实的