在數據庫開發過程當中,當你檢索的數據只是一條記錄時,你所編寫的事務語句代碼每每使用SELECT INSERT 語句。可是咱們經常會遇到這樣狀況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?遊標爲咱們提供了一種極爲優秀的解決方案。
1.遊標和遊標的優勢
在數據庫中,遊標是一個十分重要的概念。遊標提供了一種對從表中檢索出的數據進行操做的靈活手段,就本質而言,遊標其實是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。遊標老是與一條SQL 選擇語句相關聯由於遊標由結果集(能夠是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的遊標位置組成。當決定對結果集進行處理時,必須聲明一個指向該結果集的遊標。若是曾經用 C 語言寫過對文件進行處理的程序,那麼遊標就像您打開文件所獲得的文件句柄同樣,只要文件打開成功,該文件句柄就可表明該文件。對於遊標而言,其道理是相同的。可見遊標可以實現按與傳統程序讀取平面文件相似的方式處理來自基礎表的結果集,從而把表中數據以平面文件的形式呈現給程序。
咱們知道關係數據庫管理系統實質是面向集合的,在MS SQL SERVER 中並無一種描述表中單一記錄的表達形式,除非使用where 子句來限制只有一條記錄被選中。所以咱們必須藉助於遊標來進行面向單條記錄的數據處理。因而可知,遊標容許應用程序對查詢語句select 返回的行結果集中每一行進行相同或不一樣的操做,而不是一次對整個結果集進行同一種操做;它還提供對基於遊標位置而對錶中數據進行刪除或更新的能力;並且,正是遊標把做爲面向集合的數據庫管理系統和麪向行的程序設計二者聯繫起來,使兩個數據處理方式可以進行溝通。
2. 遊標種類
MS SQL SERVER 支持三種類型的遊標:Transact_SQL 遊標,API 服務器遊標和客戶遊標。
(1) Transact_SQL 遊標
Transact_SQL 遊標是由DECLARE CURSOR 語法定義、主要用在Transact_SQL 腳本、存儲過程和觸發器中。Transact_SQL 遊標主要用在服務器上,由從客戶端發送給服務器的Transact_SQL 語句或是批處理、存儲過程、觸發器中的Transact_SQL 進行管理。 Transact_SQL 遊標不支持提取數據塊或多行數據。
(2) API 遊標
API 遊標支持在OLE DB, ODBC 以及DB_library 中使用遊標函數,主要用在服務器上。每一次客戶端應用程序調用API 遊標函數,MS SQL SEVER 的OLE DB 提供者、ODBC驅動器或DB_library 的動態連接庫(DLL) 都會將這些客戶請求傳送給服務器以對API遊標進行處理。
(3) 客戶遊標
客戶遊標主要是當在客戶機上緩存結果集時才使用。在客戶遊標中,有一個缺省的結果集被用來在客戶機上緩存整個結果集。客戶遊標僅支持靜態遊標而非動態遊標。因爲服務器遊標並不支持全部的Transact-SQL 語句或批處理,因此客戶遊標經常僅被用做服務器遊標的輔助。由於在通常狀況下,服務器遊標能支持絕大多數的遊標操做。因爲API 遊標和Transact-SQL 遊標使用在服務器端,因此被稱爲服務器遊標,也被稱爲後臺遊標,而客戶端遊標被稱爲前臺遊標。在本章中咱們主要講述服務器(後臺)遊標。
3. adUseClient和adUseServer區別
CursorLocation=adUseClient爲打開的遊標類型爲本地類型
CursorLocation=adUseServer爲打開的遊標類型爲服務器類型
有些時候當你發生一些莫名奇妙的錯的時候,你就應該永adUseClient
如你Select * from 表(表裏確定有記錄),發現RecordCount仍是爲-1,時,那就應將CursorLocation設爲adUseClient。
adUseClient 使用由本地遊標庫提供的客戶端遊標。本地遊標引擎一般容許使用的許多功能多是驅動程序提供的遊標沒法使用的,所以使用該設置對於那些將要啓用的功能是有好處的。adUseClientBatch 與 adUseClient 同義,也支持向後兼容性。
adUseServer 默認值。使用數據提供者或驅動程序提供的遊標。這些遊標有時很是靈活,對於其餘用戶對數據源所做的更改具備額外的敏感性。可是,Microsoft Client Cursor Provider(如已斷開關聯的記錄集)的某些功能沒法由服務器端遊標模擬,經過該設置將沒法使用這些功能。