當ADO開始處理數據后,應用程序必須等到ADO處理完畢之后才可以繼續執行。但是除了同步執行方式之外,ADO也提供了異步執行的方式,允許當ADO處理時,應用程序仍然能夠先繼續執行。而當ADO處理數據完畢之后,ADO會以事件的方式通知應用程序,此時應用程序可以再根據ADO執行的結果來采取相應的動作。使用異步執行方式有許多用途,例如,如果應用程序需要處理花費大量時間的動作,那么ADO可以選擇以異步執行方式讓ADO在后台執行,而讓應用程序繼續處理圖形用戶接口或用戶輸入的數據。
在ADO中使用異步執行方式非常簡單,只需要對ADO數據集的ExecuteOptions屬性值進行適當的設定即可。現在就讓我們以一實際的范例應用程序來說明如何讓ADO以異步的方式來處理數據。
下載
1)在Delphi集成開發環境中關閉所有的項目。
2)建立一個新的應用程序項目,在主窗體中放入TADOConnection對象連接到
數據庫。
3)在主窗體中放入TADODataSet組件。設定它的Connection屬性值為步驟2)的
TADOConnection,並且在它的CommandText屬性值中使用Select*fromADOTestDatas
以取得所有的數據。再設定它的Active屬性值為True以打開范例數據表。
4)放入TDataSource組件,設定它的DataSet屬性值為步驟3)加入的TADODataSet
組件。
5)放入TDBNavigator和TDBGrid組件,設定它們的DataSource組件為步驟4加
入的TDataSource組件。
6)在主窗體中放入兩個TButton組件以及一個TProgressBar組件,並且設定它
的相關屬性值。此時主窗體如圖3-12所示。
圖3-12范例應用程序的主窗體
7)最后在主窗體中放入一個TADOCommand組件。設定它的Connection屬性
值為步驟2)的TADOConnection,並且在它的CommandText屬性值中使用Select
count(*)fromADOTestDatas以便從ADOTestDatas數據表中取得所有數據的筆數。
8)在主窗體的OnActivate事件處理程序中撰寫如下的程序代碼:
第3章撰寫使用ADO技術的應用系統(二)111
下載
procedureTForm1.FormActivate(Sender:TObject);
var
sRecNo:String;
begin
ProgressBar1.Max:=ADOCommand1.Execute.Fields.Item[0].Value;
sRecNo:=IntToStr(ProgressBar1.Max);
Self.Caption:='共有'+sRecNo+'筆數據';
end;
OnActivate事件處理程序首先執行TADOCmmand的SQL命令,並且從它回傳
的暫時Recordset對象中取出ADOTestDatas數據表中所有數據的筆數,然后再指定
給TProgressBar的Max值,最后指定給窗體的Caption屬性值。
9)雙擊窗體中的eoAsyncFetchNonBlocking按鈕,並且在它的OnClick事件處
理程序中撰寫如下的程序代碼:
procedureTForm1.Button2Click(Sender:TObject);
begin
try
ADODataSet1.Active:=False;
ADODataSet1.ExecuteOptions:=[eoAsyncFetchNonBlocking];
finally
lStart:=GetTickCount;
ADODataSet1.Active:=True;
end;
end;
在上面的程序代碼中先關閉步驟3)的TADODataSet,再設定它的ExecuteOptions
屬性值為使用異步方式來存取數據。最后再打開步驟3)的TADODataSet組件,從
ADOTestDatas數據表中取得數據。
10)雙擊窗體中的eoAsyncFetch按鈕,並且在它的OnClick事件處理程序中撰
寫如下的程序代碼:
procedureTForm1.Button1Click(Sender:TObject);
begin
try
ADODataSet1.Active:=False;
ADODataSet1.ExecuteOptions:=[eoAsyncFetch];
finally
lStart:=GetTickCount;
112Delphi5.xADO/MTS/COM+高級程序設計篇
下載
ADODataSet1.Active:=True;
end;
end;
在上面的程序代碼中先關閉步驟3)的TADODataSet,再設定它的ExecuteOptions
屬性值為使用同步方式來存取數據,再打開步驟3)的TADODataSet組件,從
ADOTestDatas數據表中取得數據。
在異步方式中,ADO會以OnFetchProgress事件來通知應用程序ADO還在處理
數據之中,並且以OnFetchComplete事件來通知應用程序ADO已經處理數據完畢了。
程序員可以在這兩個事件處理程序中撰寫程序代碼來處理這兩種情形。下面是范
例應用程序在這兩個事件處理程序中實現的程序代碼。
11)在步驟3)的TADODataSet組件的OnFetchProgress事件處理程序中撰寫如下
的程序代碼:
procedureTForm1.ADODataSet1FetchProgress(DataSet:TCustomADODataSet;
Progress,MaxProgress:Integer;varEventStatus:TEventStatus);
begin
ProgressBar1.Position:=Progress;
end;
上面的程序代碼只是在ADO持續處理數據時不斷更新主窗體中TProgressBase
的顯示狀態。
12)在步驟3)的TADODataSet組件的OnFetchComplete事件處理程序中撰寫如
下的程序代碼:
procedureTForm1.ADODataSet1FetchComplete(DataSet:TCustomADODataSet;
constError:Error;varEventStatus:TEventStatus);
begin
lEnd:=GetTickCount;
ShowMessage('總共花了'+FloatToStr((lEnd-lStart)/1000.0)+'秒');
end;
上面的程序代碼是當ADO處理完數據之后便顯示一個對話框,顯示ADO處理
數據所花費的時間。
現在請編譯並且執行這個范例應用程序。圖3-13是以異步的方式來存取
ADOTestDatas這個范例數據表中數據的畫面。從圖中可以看到,當ADO存取數據
第3章撰寫使用ADO技術的應用系統(二)113
下載
時應用程序仍然可以不斷地更新主窗體中的TprogressBar。如果使用同步的方式執
行,TProgressBar便無法這樣更新狀態。此時我們也可以移動主窗體的位置等,可
見應用程序不會因為ADO在存取大量的數據而造成應用程序無法繼續工作。
圖3-13范例應用程序以異步方式執行的畫面
圖3-14是當ADO處理數據完畢並且觸發OnFetchComplete事件處理程序時顯示的
畫面。從這兩個畫面中我們可以看到,當ADO以異步的方式執行時,OnFetchProgress
和OnFetchComplete事件可以幫助程序員取得非常有用的狀態信息。
圖3-14范例應用程序以異步方式執行的畫面
如果你也執行這個范例應用程序,那么可以比較一下當ADO在同步執行模式
和異步執行模式中處理數據時哪一種模式比較有效率。可能你會驚訝地發現異步
異步執行能力
ExecuteOptions
eoAsyncExecute異步執行
eoAsyncFetch異步提取
eoAsyncFetchNonBlocking無阻塞方式異步提取
eoExecuteNoRecords無返回記錄執行
onFetchProgressADO執行過程中會調用此事件,直到結束為止,可用於進度條顯示
onFetchCompleteADO執行完成后會調用此事件
參考:http://www.cnblogs.com/key-ok/p/3533426.html