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;