我們已經了解了如何使用幾個數據訪問組件來連接Access數據庫並檢索數據。有一項可以肯定:ADOExpress組件非常適用於基於ADO數據訪問和元數據對象映射。
ADO的核心是記錄集對象(Recordset)。 Recordset對象(又稱為DataSet數據集)是查詢命令執行後的結果(例如,TADOQuery組件的SELECT語句)。當一個基於ADO的應用程序從數據庫中檢索行,ADO Recordset對象將該數據的數據內容和可進行的操作進行了封裝。 ADO使用游標來保持一個記錄集行中所包含的邏輯,同時也提供該記錄集中的當前位置。在開發中,我們使用游標來創建一個記錄集的滾動式浏覽(向前或向後),或者使該記錄集獲取其他用戶所進行的更改。
游標(Cursor)?!
最簡單的定義應該是:一個啟用了浏覽功能並且已知當前行位置的查詢結果集。
在ADO中,游標具有三大功能。首先,游標類型(cursor type)確定游標的運動方式,以及記錄集是否反映出用戶進行的更改;其次,游標位置確定游標打開時存儲記錄集的位置;最後,游標的鎖定類型(locking type)指定如何鎖定ADO數據存儲的行——當你想進行更改時。
對游標的了解是極為重要的。例如,為了得到記錄集做想做的事,我們需要使用某些特定類型的游標來打開ADO記錄集。例如,RecordCount屬性不支持只進游標。
在ADOExpress集中,TCustomADODataSet封裝了一組屬性、事件及方法,用於通過ADO數據存儲進行數據訪問。所有的TCustomADODataSet派生類(TADOTable、TADODataSet、TADOQuery和TADOStoredProc)具有一些共同的屬性。使用CursorType、CursorLocation和LockType屬性,創建最有效的記錄集。
游標類型(CursorType)
游標類型的選擇,直接影響你的應用程序是否成功。 ADO提供了四個游標選項:動態(dynamic)、鍵集(keyset)、只向前(forward-only)和靜態(static)。由於它們不同的行為表現,對每一種游標類型功能的了解將會使你極大受益。
CursorType屬性指定如何遍歷記錄集以及檢索記錄集後對數據庫所做的更改是否可見。Delphi用TCursorType對ADO游標類型進行了封裝。
ctDynamic
允許你查看其他用戶對該數據集進行的添加、刪除和更改;允許所有不依賴於書簽的遍歷方式;允許書簽——如果數據庫提供商支持。ADODataset的Supports方法可以驗證一個記錄集是否支持某些特定的操作。例如檢查是否支持書簽:
[delphi]
if ADOTable1.Supports(coBookmark) then ...
if ADOTable1.Supports(coBookmark) then ...
如果多個用戶可能同時對數據庫中的行進行插入、更新和刪除操作,那麼選擇動態游標。
ctKeyset
類似動態游標,區別在於它會阻止你浏覽其他用戶新增的記錄;並阻止你訪問其他用戶已刪除的記錄。而由其他用戶進行的數據更改仍是可見的。始終支持書簽,因此允許所有類型的遍歷方式。
ctStatic
提供一組用於查找數據或生成報表的記錄集靜態拷貝(副本);始終支持書簽,因此允許所有類型的遍歷方式;其他用戶進行的添加、更改或刪除將無法看到。其類似於從一個BDE查詢組件(RequestLive屬設置為False)得到的結果集。
ctForward-only
除了只能向前滾動浏覽來遍歷記錄集,其他特性與動態游標完全相同。在只需遍歷一次數據集的情況下,能大幅提高性能。
注:當ADO數據集組件的CursorLocation屬性設為clUseClient時,只支持ctStatic模式。
注:如果請求的游標類型供應商不支持,將會返回另一種。也就是說,在CursorLocation置為clUseServer時若將CursorType置為ctDynamic,在Access數據庫中,Delphi會將CursorType置為 ctKeyset。
CursorLocation
CursorLocation屬性定義記錄集被打開時的創建位置 —— 客戶端或服務器。
一個客戶端游標中的數據與數據庫是“先天斷開”的。 ADO檢索選擇性查詢語句的返回結果(所有行)時,在你開始使用它之前已經將數據復制到客戶端(ADO游標中)。在你對記錄進行更改後,ADO會將這些更改轉換為查詢指令並通過OLE DB供應商將其提交到你的數據庫中。客戶端游標的行為方式類似於本地緩存。
在多數情況下首選客戶端游標,因為其滾動和更新速度更快並且更有效,雖然向客戶端返回數據會增加網絡負載。
使用服務器端游標意味著只獲取需要的相應記錄;用戶浏覽數據時將會對服務器進行更多的請求;在插入、更新或刪除記錄時更為高效;某些情況下比客戶端游標提供更好的性能——尤其是在網絡通信量過大是個問題的情況下。
選擇游標類型時需要考慮的因素:你是否正在做更多的數據更新,還是僅僅檢索數據;使用ADO的應用程序是基於本地還是互聯網;結果集的大小;數據存儲以及環境等等因素。其他因素也可能會限制你,例如,MS Access不支持動態游標而使用鍵集;一些數據提供商自動匹配CursorType和CursorLocation的屬性;以及其他錯誤,當你使用不受支持的CursorType或CursorLocation類型。
LockType
LockType屬性告訴供應商在記錄處於編輯狀態時應當放何種類型的鎖。鎖,可以防止用戶讀取正在被其他用戶修改的數據,並且防止用戶修改其他用戶正在修改的數據。
在Access數據庫中修改記錄時,相鄰記錄也將被鎖定——因為Access使用的是頁面鎖定策略。這意味著,如果用戶編輯記錄時,其他一些用戶將不會被允許修改該記錄,甚至不能修改其之前或之後的一些記錄。
Delphi中,TADOLockType指定可以使用的鎖的類型。你可以通過設置相應的光標鎖定選項控制行和頁鎖定。要使用特定的鎖定方案,提供商和數據庫類型必須支持該鎖定方案。
ltOptimistic
Optimistic鎖,只在記錄有物理更新時進行鎖定。該類型的鎖定常用於以下情況:在游標被打開並最終執行某行更新的這段間隔時間中,有很小的幾率,第二個用戶也對該行進行了更新操作。當前行中的值將會與最後獲取該行時檢索到的值進行比較。
ltPessimistic
Pessimistic鎖,記錄處於編輯狀態時將被鎖定。該選項告訴ADO得到記錄行的獨占鎖,當用戶對該記錄中的任何列進行任何變動時。ADOExpress組件不直接支持Pessimistic記錄鎖,因為ADO本身不具備任何方式來鎖定給定的記錄,同時仍然支持導航到其他記錄。
ltReadOnly
只讀鎖,不允許數據編輯。常用於以下情況:應用程序必須暫時防止數據被更改,但讀取不受限制。只讀鎖定並將CursorType設置為ctForwardOnly,是制作報表的理想選擇。
ltBatchOptimistic
BatchOptimistic鎖,用於斷開連接的記錄集。記錄集先在本地進行更新,而後將所有的修改在一個批處理中發送回數據庫。