Delphi數據庫編程新手指南(10)

ADO遊標(ADO Cursors)

  我們已經瞭解瞭如何使用幾個數據訪問組件來連接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方法可以驗證一個記錄集是否支持某些特定的操作。例如檢查是否支持書籤:

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鎖,用於斷開連接的記錄集。記錄集先在本地進行更新,而後將所有的修改在一個批處理中發送回數據庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章