ado异步查询



var Done:Boolean=False;

//通过异步可以来监视数据集的存取情况

//引用一个计时器,以解决"Canvas does not allow drawing"错误提示

procedure TForm1.Timer1Timer(Sender: TObject);

begin

if Done then

   begin

     //DataSource:数据源;DataSet:数据集;数据源中的数据来源于数据集

     DataSource1.DataSet:=ADOQuery1;

     DBGridEh1.DataSource:=DataSource1;

     Timer1.Enabled:=False; //计时关闭

     Done:=False;

   end;

end;

 

procedure TForm1.ADOQuery1FetchComplete(DataSet: TCustomADODataSet;

  const Error: Error; var EventStatus: TEventStatus);

begin

//OnFetchComplete:当异步存取的数据完全存取完毕后,会触发这个事件处理程序

//TEventStatus = (esOK, esErrorsOccured, esCantDeny, esCancel, esUnwantedEvent);

if EventStatus<>esOk then

   ShowmessageFmt('%d:%s',[Error.Number,Error.Description])

else

   Done:=True;

end;

 

procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,

  MaxProgress: Integer; var EventStatus: TEventStatus);

begin

//OnFetchProgress:以异步存取数据时,会定时触发这个事件处理程序

//Progress实际提取的记录数

//MaxProgress=Progress+背景提取大小

//进度条的初始值=MaxProgress+Progress;以后进度条的值=进度条以前的值+背景提取大小

Gauge1.Progress:=Progress;

ListBox1.Items.Add(Format('%d - %d',[Progress,MaxProgress]));

Edit1.Text:=Format('Fetch %d Records.',[Progress]);

SysUtils.Sleep(1); //为了看到效果,稍微停顿一下

end;

 

procedure TForm1.ADOQuery1RecordsetCreate(DataSet: TCustomADODataSet;

  const Recordset: _Recordset);

begin

//adUseServer =2; 默认值;使用数据提供者或驱动程序提供的游标

//adUseClient =3; 使用客户端游标

Recordset.CursorLocation:=3;

Recordset.Properties['Initial Fetch Size'].Value:=0; //在创建异步线程之前,一开始提取的记录数(即提取的初始大小)

Recordset.Properties['Background Fetch Size'].Value:=5; //在创建异步线程之后,每次提取的记录数(即背景提取大小)

//"Background Fetch Size"数据的大小,直接会影响存取速度 

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

ADOQuery1.Connection:=ADOConnection1;

ADOQuery1.Active:=False;

ADOQuery1.SQL.Text:='Select * from zyfp';

//  TExecuteOption = (eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking,

//    eoExecuteNoRecords);

//EoAsyncExecute:以异步的方式来执行命令

//EoAsyncFetch:ADO存取了CacheSize指定的数据后,再以异步的方式存取其他的数据

//EoAsyncFetchNonBlocking:ADO以异步的方式执行命令,而且不会阻碍应用程序的执行;相对效率较高

//EoAsyncNoRecords:以异步方式不传回数据集

ADOQuery1.ExecuteOptions:=[EoAsyncFetchNonBlocking]; //打开之前;设置异步方式

ADOQuery1.CursorLocation:=clUseClient;

ADOQuery1.Active:=True;

Timer1.Enabled:=True; //计时开启

end;

 

procedure TForm1.FormActivate(Sender: TObject);

begin

//先获取记录总数

Gauge1.MaxValue:=ADOCommand1.Execute.Fields[0].Value;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

ADOConnection1.LoginPrompt:=False;

ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;'+

                                 'Data Source=e:\mcmygs.mdb;'+

                                 'Persist Security Info=False;'+

                                 'Jet OLEDB:Database Password=';

ADOCommand1.Connection:=ADOConnection1;

ADOCommand1.CommandText:='Select count(*) from zyfp';

Timer1.Interval:=200; //时间间隔

end;

ADOQuery-OnFetchProgress、OnFetchComplete、OnRecordsetCreate - 朝三暮四 - 朝三暮四的博客

 

ADOQuery-OnFetchProgress、OnFetchComplete、OnRecordsetCreate - 朝三暮四 - 朝三暮四的博客

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值