1、 基表
2、 靜態
3、 只進
4、 只進/只讀
5、 鍵集驅動
一、基表游標
基表游標是可用的最低級別的游標。 這些游標直接在存儲引擎上工作,是所有支持的游標類型中速度最快的游標。 基表游標可以最低開銷向前或向後滾動,並且可以更新。
您還可以直接在索引上打開游標。 此類游標支持索引,以便對表中的行進行排序、允許查找特定值以及基於索引中的值的范圍對行進行限制。
基表游標具有動態成員身份。 這意味著,在同一個表上打開的兩個游標可以立即看見對數據的插入、刪除和更改(假定它們兩個都在同一事務作用范圍內)。 由於可以更新基表游標,因此客戶端可以使用此類游標來更改基本數據。
基表游標無法表示查詢結果。 查詢結果(例如 SELECT * FROM tablename)無法通過基表游標返回。 而是使用支持的查詢結果游標返回結果。
下面的示例說明如何使用 ADO .Net 獲取基表游標:
//Base Table Cursor下面的示例說明如何使用 ADO .Net 獲取索引游標:
cmd.CommandText = "tablename";二、靜態游標
靜態游標(在以前的 SQL Server Compact 3.5 版本中稱為可滾動查詢游標)可以創建和存儲結果集的完整副本。 當用戶顯式請求檢索的長整型值數據時例外。 只有在需要時才填充此結果集。 這與 SQL Server 不同,後者在創建游標時就會填充結果集。 靜態游標支持向後滾動和向前滾動,但不支持更新。 靜態游標無法看見外部對不敏感的數據所做的更改。 在游標的生存周期內將緩存查詢結果。 盡管靜態游標比只進游標功能更強,但靜態游標速度較慢,並且會使用更多的內存。 建議只有在需要滾動並且鍵集游標不合適時再考慮使用靜態游標。
下面的示例說明如何使用 ADO.Net 獲取靜態游標:
cmd.CommandText = "Select * from tablename";三、只進游標
只進游標是可更新的速度最快的游標,但不支持滾動。 它只支持從游標頭至游標尾順序提取行。 在提取行之前,無法從數據庫中檢索這些行。 從游標提取行時,由當前用戶創建或由其他用戶提交並會影響結果集中的行的所有 INSERT、UPDATE 和 DELETE 語句的效果均可見。 由於游標無法向後滾動,因此在行被提取之後,將無法通過使用游標看見在數據庫中對行所做的更改。
只進游標和只進/只讀游標是基於查詢的速度最快的游標。 它們應當用在優先考慮速度和內存占用量的方案中。
下面的示例說明如何使用 ADO .Net 獲取只進游標:
cmd.CommandText = "Select * from tablename";四、只進/只讀游標
只進/只讀游標(在以前的 SQL Server Compact 3.5 版本中稱為只進游標)是最快的游標,但無法進行更新。
下面的示例說明如何使用 ADO.Net 獲取只進/只讀游標:
cmd.CommandText = "Select * from tablename";注意 不能在只返回只讀列的查詢上創建只讀游標,因為內部的所有 SQL Server Compact 3.5 游標都是可更新的。SQL Server Compact 3.5 無法更新在 SqlCeResultSet 中返回的只讀列。 因此,它將失敗,並返回錯誤“由於不存在可更新列,因此無法生成用於查詢的可更新游標”。
五、鍵集驅動游標
SQL Server Compact 3.5 中的鍵集驅動游標是可以進行更新的可滾動游標。 鍵集驅動游標由一組稱為鍵集的物理標識符來控制。 鍵集基於在打開游標時對 SELECT 語句驗證合格的所有行。 在打開游標時將在臨時表中生成鍵集。 使用鍵集驅動游標,將在執行查詢時確定成員身份。
SQL Server Compact 3.5 中的鍵集驅動游標與 SQL Server 中的鍵集驅動游標有細微的差別。 在 SQL Server 中,鍵集驅動游標使用一組唯一標識符作為鍵集中的鍵。 在 SQL Server Compact 3.5 中,鍵是表示值在表中的邏輯存儲位置的書簽。 它們不是唯一標識符。
盡管對許多更改敏感,但鍵集驅動游標不如其他游標敏感。 例如,盡管在游標內的插入將在結束時可以看見,但無法看見在游標外的插入。 在這種情況下,建議您關閉並重新打開游標,或使用一個只進游標。
由於 SQL Server Compact 3.5 使用書簽來定義鍵集,因此通過使用游標,對鍵集中所包括行的數據值所做的所有更改都是可見的。 對於在游標內所做的更改和在游標外所做的更改,情況都是這樣的。
無論是在游標內還是在游標外,在鍵集游標中所做的任何刪除操作都將導致在試圖提取行時報告該行已被刪除。
下面的示例說明如何使用 ADO .Net 獲取鍵集驅動游標:
cmd.CommandText = "Select * from tablename";使用聯接
如果用來打開鍵集驅動游標的查詢包含聯接的列,則這些列不可更新。 用戶可以向這些列中插入新值,但不支持更新。
如果鍵集被用來填充用戶可更新的控件(如 DataGrid 對象),則用戶可能會試圖更新控件中的值,此時更新將失敗。 如果要開發的應用程序將使用 DataGrid 來顯示聯接的列數據,請確保在 DataGrid 中將聯接的列設置為只讀。