请问有没有真正实践过的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.   

    补充说明一下:测试环境:SQL2000server,测试数据条数:30万条数据,一次性读取。
    如果说内存泄漏的原因是一次性读取的数据太多了,ADO异步还有意义吗?异步只是给人看的了,如此而已。
      

  2.   

    Lz所说的进度条,应该是统计数据总条数吧?如果是这样,sql语句建议用 count
    30万条,用 select *的话,没试过,不敢想象。。
      

  3.   

    procedure TForm1.adFetchProgress(DataSet: TCustomADODataSet; Progress,
      MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
      Gauge1.MaxValue:=MaxSum;
      Gauge1.Progress:=Progress;
      Application.ProcessMessages;//这个地方去掉试试。
      Gauge1.Refresh;             //加进这句话;在开始查询的时候灰掉界面上的可执行控件。结束查询的时候在恢复一下
    end;
      

  4.   

    ADO异步查询?
    sql发出去了,在完成之前,数据库引擎是不会返回任何状态的——sql的执行时间,x秒
    OnFetchComplete,是不是指返回数据的中间事件?——结果的网络传输时间,y秒如果sql很复杂,x可能很大。则这x秒里,是没有任何反应的
    如果结果集很大,则y很大,则中间会有反应。
    不过,一般应用很少返回这么大的记录集,尤其是用户等着看的时候,因为用户看几十万条记录是不现实的