ADO架構(gòu)圖:
消費者
(Recordset) 提供者 消費者 提供者
keyset Cursor與Dynamic Cursor的執(zhí)行過程:
1、 數(shù)據(jù)庫只把記錄的鍵值放入結(jié)果數(shù)據(jù)集中
2、 ADO Cursor Engine存取客戶需要的記錄
3、 OLE
PRovider再根據(jù)結(jié)果數(shù)據(jù)集中的鍵值字段到數(shù)據(jù)庫中存取相應(yīng)的數(shù)據(jù)
4、 根據(jù)鍵值找到的數(shù)據(jù)再放入結(jié)果數(shù)據(jù)集中
事務(wù)管理功能:
在使用ADO處理多個數(shù)據(jù)表的主從架構(gòu)應(yīng)用程序中,一定要記得激活事務(wù)管理的功能以保護(hù)更新的數(shù)據(jù)。
1、 激活事務(wù)管理功能:
Procedure ADODataSetBeforePost (Dataset: Dataset);
Begin
If (not ADOConnection.InTransaction) then
ADOConnection.BeginTrans;
End;
2、 在數(shù)據(jù)成功更新之后確定事務(wù):
Procedure ADODataSetAfterPost (Dataset: Dataset);
Begin
If (ADOConnection.InTransaction) then
ADOConnection.CommitTrans;
End;
3、 最后,當(dāng)更新數(shù)據(jù)發(fā)生錯誤時取消事務(wù),以便正確釋放系統(tǒng)資源:
Procedure ADODataSetPostError (Dataset: Dataset; E: EdatabaseError; var Action: TDataAction);
Begin
ADOConnection.RollbackTrans;
Action: =daAbort;
End;
RecordSet 的頁面定位功能:例如 學(xué)生表中有1000筆數(shù)據(jù),當(dāng)頁面的大小[PageSize]為10筆數(shù)據(jù)時,那么整個數(shù)據(jù)表就被分割成100個不同的頁面[PageCount]。因此程序員指定的頁面號碼[AbsolutePage]為2,就可以存取到11-20筆的數(shù)據(jù)。
AbsolutePage:改變當(dāng)前Page的位置,設(shè)定這個屬性可以存取特定Page中的數(shù)據(jù)。這是個可擦寫的屬性。
PageCount:數(shù)據(jù)表中所有的記錄數(shù)除以PageSize后得到的頁數(shù)。這是個只讀屬性。
PageSize:指定沒一個數(shù)據(jù)頁中包含的數(shù)據(jù)筆數(shù)。這是個可擦寫的屬性。
RecordSet 的UpdateCriteria動態(tài)屬性:
AdCriteriaKey:只在SQL命令的Where子句中使用鍵值字段值來尋找原來的記錄。
AdCriteriaAllCols: 只在SQL命令的Where子句中使用所有字段值來尋找原來的記錄。
AdCriteriaUpCols: 在SQL命令的Where子句中使用鍵值字段值以及所有被修改字段值來尋找原來的記錄。這是ADO使用的默認(rèn)的設(shè)定。
AdCriteriaTimeStamp: 在SQL命令的Where子句中使用鍵值字段值以及數(shù)據(jù)表中字段類型為TimeStamp的字段來尋找原來的記錄。
何謂客戶端Cursor、服務(wù)器端Cursor?
ADO的CursorLocation分為兩種:一種是客戶端Cursor,另一種是服務(wù)器端Cursor。
那么何謂CursorLocation呢?簡單的說就是當(dāng)客戶端應(yīng)用程序存取了一些數(shù)據(jù)之后,這些數(shù)據(jù)存儲在什么地方?如果這些暫時的數(shù)據(jù)是存儲在客戶端的ADO驅(qū)動程序內(nèi)存中,由客戶端ADO引擎管理,這就稱為客戶端Cursor。相反,如果這些暫時的數(shù)據(jù)是存儲在后端的數(shù)據(jù)庫中,由后端數(shù)據(jù)庫本身管理,就稱為服務(wù)器端Cursor。
結(jié)論:使用Client-Side Cursor,再加上少量多次的存取方式,那么你的應(yīng)用系統(tǒng)會非常有效率。
LockType:對于數(shù)據(jù)存取行為的影響大于對ADO執(zhí)行效率的影響。其主要影響數(shù)據(jù)源服務(wù)器如何鎖定資源,以及鎖定資源的數(shù)量。
ReadOnly:只讀鎖,在使用Locate方法搜尋數(shù)據(jù)時,使用ReadOnly類型的LockType執(zhí)行效率最高。
Optimistic:樂觀鎖
BatchOptimistic:批處理鎖
Pessimistic:悲觀鎖
結(jié)論:在分布式多層應(yīng)用系統(tǒng)或Internet/Intranet以及電子商務(wù)中,不要使用Pessimistic的LockType,因為這不但沒有意義而且會損失執(zhí)行效率。更嚴(yán)重的后果會造成系統(tǒng)死鎖或發(fā)生數(shù)據(jù)不正確的情形。其次是在調(diào)用Locate方法搜尋數(shù)據(jù)時一般采用Client-Side Cursor、CacheSize的大小大約在100-1000之間、LockType采用Optimistic或BatchOptimistic。以達(dá)到最佳效率。
CacheSize:
1、 增加CacheSize可以增加ADO應(yīng)用程序的執(zhí)行效率,因為這可以減少網(wǎng)絡(luò)的RoundTr
ips。
2、 增加CacheSize也增加了啟動數(shù)據(jù)表的時間,但增加ADO應(yīng)用程序的執(zhí)行效率。
3、 當(dāng)CacheSize接近1000時,ADO應(yīng)用程序的執(zhí)行效率在時間/空間比方面似乎是非常好的設(shè)定。
ExecuteOptions:
EoAsyncExecute:以異步的方式來執(zhí)行命令。
EoAsyncFetch:當(dāng)ADO存取了CacheSize指定的數(shù)據(jù)后,再以異步的方式存取其他的數(shù)據(jù)。
EoAsyncFetchNonBlocking:ADO以異步的方式執(zhí)行命令,而且不會阻礙應(yīng)用程序的執(zhí)行。相對效率較高。
EoAsyncNoRecords:執(zhí)行不會回傳結(jié)果數(shù)據(jù)集的
存儲過程或命令。如果被執(zhí)行的存儲過程或命令回傳的任何數(shù)據(jù)都會被丟棄。
結(jié)論:當(dāng)ADO執(zhí)行完Action Query之后,會以事件的方式通知客戶端應(yīng)用程序。
OnFetchProgress:以異步存取數(shù)據(jù)時,會定時觸發(fā)這個事件處理程序。
OnFetchComplete:當(dāng)異步存取的數(shù)據(jù)完全存取完畢后,會觸發(fā)這個事件處理程序。
Prepared和存儲過程:
Prepared屬性值會影響數(shù)據(jù)源在執(zhí)行這些
組件的Action Query時是否先編譯這些SQL命令。如果Prepared屬性值為True時,數(shù)據(jù)源只要編譯一次即可重復(fù)執(zhí)行這個存儲過程。而不需要在沒一次這些組件提出SQL命令時都編譯一次SQL命令為存儲過程,再執(zhí)行。
排序數(shù)據(jù):
ADO數(shù)據(jù)集.SORT:=’字名 排序,字名 排序……’ (排序有 ASC DESC)
ADO處理錯誤ERRORS(稱錯誤集合對象)
……….PostError(..)….
Var
Adoerrors:errors;
Adoerror:error;
Icount:integer;
Begin
Adoerrors:=adoconn.errors;
For icount:=0 to adoerrors.count-1 do
Begin
Adoerror:=adoerrors.item[icount];
Adoerror.number[source.description,helpfile.sqlstate];
End;
End;
…..
try…….except
result:=false;
raise;