什么是資料庫游標

2021-04-12 15:17:23 字數 2705 閱讀 6544

1. 什么是游標?

游標,也有人稱為游標。概括的講,它是基於記錄的。

過去,關係型資料庫沒有象現在這樣被廣泛的應用。那時候,人們大多使用 dbase 這樣的小型資料庫軟體。這類資料庫確切的說應為資料檔案管理軟體。他們是面向記錄的。

不過,這種方式也許更符合人們的習慣。比如,我們在**本中查詢號碼,在學生檔案中查詢檔案,最終都要歸結於其中的乙個號碼,乙個檔案,那就是一條記錄。現實生活中,我們在一張**中尋找某一項時,可能會用手一條一條逐行的掃過,以幫助我們找到所需的那條記錄。對應於資料庫來說,這就是游標的模型。所以,你可以這樣想象:**是資料庫中的表,而我們的手好比是游標。

所以,當你使用類似 .movenext,.movelast 這樣的語句時,覺得再自然不過了。

現在,你明白什么是游標了吧。游標就是資料的 ' 定位系統 ' 。

這個 ' 定位系統 ' 粗分有兩種:伺服器游標和客戶游標。對應於 ado 中的 cursorlocation 。舉例來說:

set rs = server.createobject("adodb.recordset")

rs.cursorlocation = aduseserver      '預設,使用伺服器游標

.....

rs.cursorlocation = aduseclient      '使用客戶游標

2. 什么是伺服器游標?

或者稱為 api 伺服器游標。

假設你要查詢有關程式語言的書,寫成 sql 語句就是:select book_id,book_title from books where book_catalog = '程式設計' order by book_title,同時你指定使用伺服器游標。

這條語句傳送到伺服器,伺服器對資料進行檢索,將符合查詢條件的記錄集合放入臨時表(對某些游標型別是這樣)中。每當你進行 .movenext 操作,伺服器就會傳送一條記錄到客戶端的緩衝區,然後你才可以使用它。

3. 什么是 cachesize ?

繼續上面的例子,假設符合查詢條件的記錄有100個,也就是說,用 .movenext 這種方法遍歷該結果集需要同伺服器互動100次。我們可以通過設定 cachesize 使客戶與伺服器的通訊變少。上面的例子其實就是 cachesize=1 的情況,這是預設值。

假設 cachesize=4,當 recordset 物件開啟時,伺服器傳送4條記錄到客戶端。前4次的 .movenext 操作實際上是在客戶緩衝區中得到資料,當第5次 .movenext 時,伺服器才傳送下乙個4條記錄。由此,減少了客戶與伺服器間的網路通訊。

那么是不是說 cachesize 越大越好呢?千萬不要想當然。萬事都有兩面性,cachesize 也一樣。客戶端請求資料,伺服器傳送資料,這個過程有點象交通管理。cachesize 過高,會阻塞交通,甚至引起資料丟失(比如當 cachesize 大於客戶端緩衝區時)。對於不同的應用,所取的值也不同。

另外要指出的是,使用任何形式的游標都不是最有效的訪問資料的方法,cachesize 有的時候並不是瓶頸,盡量將使用游標的程式轉換為面向結果集的程式,效能會提高很多。

3. 什么是客戶游標?

既然游標是資料的 ' 定位系統 ',那么在客戶端也可以完成。

客戶游標的產生由來已久,當初是為了彌補伺服器的不足(有些資料庫引擎就不支援游標)。隨著伺服器游標的出現,客戶游標似乎已經過時了,不過還是那句話:萬事都有兩面性,在 internet 上,與資料庫的連線並不是永久的,使用客戶游標能使我們獲得同使用伺服器游標一樣的功能。

當 cursorloction 屬性設成 aduseclient 時,微軟的游標服務( cursor service )建立 recordset 物件,用前向 / 唯讀的游標方式從伺服器將所有查詢結果檢索出來,並且儲存在客戶緩衝區中。當應用程式通過 ado 請求資料時,游標服務就從客戶緩衝區中檢取資料。這種方式在連線遠端伺服器時非常有用,它會提高應用程式的效能。如果你訪問的資料庫是 jet 資料庫( access ),而且在本地,那麼用客戶游標非但不提高效能,還會使效能下降。這時候,資料將被快取兩次,資料庫一次,游標服務一次。

如果考慮應用的功能,客戶游標功能是很完善的,它能支援某些資料庫不能完成的操作( 視資料庫的情況而定 )。

4. 什么是 disconnected recordset ?

我們使用了客戶游標,就可以斷開與資料庫的連線,釋放 connection 物件。這樣的結果集就是 disconnected recordset。舉例說明:

dim c as new adodb.connection

dim r as new adodb.recordset

on error goto handler

c.connectionstring = connectstr

c.cursorlocation = aduseclient

c.open

set r.activeconnection = c

r.open sqltext, , adopenkeyset, adlockbatchoptimistic, -1

set r.activeconnection = nothing   ' this disconnects the recordset.

c.close

set c = nothing

......

......  

' recordset is now in disconnected state; do something with it.

r.close

set r = nothing

......

什么是資料庫游標

1.什么是游標?游標,也有人稱為游標。概括的講,它是基於記錄的。過去,關係型資料庫沒有象現在這樣被廣泛的應用。那時候,人們大多使用 dbase 這樣的小型資料庫軟體。這類資料庫確切的說應為資料檔案管理軟體。他們是面向記錄的。不過,這種方式也許更符合人們的習慣。比如,我們在 本中查詢號碼,在學生檔案中...

什麼是資料庫游標?

在資料庫中,游標是乙個十分重要的概念。游標提供了一種對從表中檢索出的資料進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條資料記錄的結果集中每次提取一條記錄的機制。游標總是與一條t sql 選擇語句相關聯因為游標由結果集 可以是零條 一條或由相關的選擇語句檢索出的多條記錄 和結果集中指向特...

什麼是資料庫游標?

在資料庫中,游標是乙個十分重要的概念。游標提供了一種對從表中檢索出的資料進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條資料記錄的結果集中每次提取一條記錄的機制。游標總是與一條t sql 選擇語句相關聯因為游標由結果集 可以是零條 一條或由相關的選擇語句檢索出的多條記錄 和結果集中指向特...