1. 什幺是游標(biāo)?
游標(biāo),也有人稱為光標(biāo)。概括的講,它是基于記錄的。
過(guò)去,關(guān)系型數(shù)據(jù)庫(kù)沒(méi)有象現(xiàn)在這樣被廣泛的應(yīng)用。那時(shí)候,人們大多使用 dBase 這樣的小型數(shù)據(jù)庫(kù)軟件。這類數(shù)據(jù)庫(kù)確切的說(shuō)應(yīng)為數(shù)據(jù)文件管理軟件。他們是面向記錄的。
不過(guò),這種方式也許更符合人們的習(xí)慣。比如,我們?cè)陔娫挶局胁檎姨?hào)碼,在學(xué)生檔案中查找檔案,最終都要?dú)w結(jié)于其中的一個(gè)號(hào)碼,一個(gè)檔案,那就是一條記錄。現(xiàn)實(shí)生活中,我們?cè)谝粡埍砀裰袑ふ夷骋豁?xiàng)時(shí),可能會(huì)用手一條一條逐行的掃過(guò),以幫助我們找到所需的那條記錄。對(duì)應(yīng)于數(shù)據(jù)庫(kù)來(lái)說(shuō),這就是游標(biāo)的模型。所以,你可以這樣想象:表格是數(shù)據(jù)庫(kù)中的表,而我們的手好比是游標(biāo)。
所以,當(dāng)你使用類似 .MoveNext,.MoveLast 這樣的語(yǔ)句時(shí),覺(jué)得再自然不過(guò)了。
現(xiàn)在,你明白什幺是游標(biāo)了吧。游標(biāo)就是數(shù)據(jù)的 ' 定位系統(tǒng) ' 。
這個(gè) ' 定位系統(tǒng) ' 粗分有兩種:服務(wù)器游標(biāo)和客戶游標(biāo)。對(duì)應(yīng)于 ADO 中的 CursorLocation 。舉例來(lái)說(shuō):
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.CursorLocation = adUseServer????? '缺省,使用服務(wù)器游標(biāo)
.....
rs.CursorLocation = adUseClient????? '使用客戶游標(biāo)
2. 什幺是服務(wù)器游標(biāo)?
或者稱為 API 服務(wù)器游標(biāo)。
假設(shè)你要查詢有關(guān)編程語(yǔ)言的書,寫成 SQL 語(yǔ)句就是:SELECT book_id,book_title FROM books WHERE book_catalog = '編程' ORDER BY book_title,同時(shí)你指定使用服務(wù)器游標(biāo)。
這條語(yǔ)句發(fā)送到服務(wù)器,服務(wù)器對(duì)數(shù)據(jù)進(jìn)行檢索,將符合查詢條件的記錄集合放入臨時(shí)表(對(duì)某些游標(biāo)類型是這樣)中。每當(dāng)你進(jìn)行 .MoveNext 操作,服務(wù)器就會(huì)發(fā)送一條記錄到客戶端的緩沖區(qū),然后你才可以使用它。
3. 什幺是 CacheSize ?
繼續(xù)上面的例子,假設(shè)符合查詢條件的記錄有100個(gè),也就是說(shuō),用 .MoveNext 這種方法遍歷該結(jié)果集需要同服務(wù)器交互100次。我們可以通過(guò)設(shè)置 CacheSize 使客戶與服務(wù)器的通信變少。上面的例子其實(shí)就是 CacheSize=1 的情況,這是缺省值。
假設(shè) CacheSize=4,當(dāng) RecordSet 對(duì)象打開(kāi)時(shí),服務(wù)器發(fā)送4條記錄到客戶端。前4次的 .MoveNext 操作實(shí)際上是在客戶緩沖區(qū)中得到數(shù)據(jù),當(dāng)?shù)?次 .Movenext 時(shí),服務(wù)器才發(fā)送下一個(gè)4條記錄。由此,減少了客戶與服務(wù)器間的網(wǎng)絡(luò)通信。
那幺是不是說(shuō) CacheSize 越大越好呢?千萬(wàn)不要想當(dāng)然。萬(wàn)事都有兩面性,CacheSize 也一樣。客戶端請(qǐng)求數(shù)據(jù),服務(wù)器發(fā)送數(shù)據(jù),這個(gè)過(guò)程有點(diǎn)象交通管理。CacheSize 過(guò)高,會(huì)阻塞交通,甚至引起數(shù)據(jù)丟失(比如當(dāng) Cachesize 大于客戶端緩沖區(qū)時(shí))。對(duì)于不同的應(yīng)用,所取的值也不同。
另外要指出的是,使用任何形式的游標(biāo)都不是最有效的訪問(wèn)數(shù)據(jù)的方法,Cachesize 有的時(shí)候并不是瓶頸,盡量將使用游標(biāo)的程序轉(zhuǎn)換為面向結(jié)果集的程序,性能會(huì)提高很多。
3. 什幺是客戶游標(biāo)?
既然游標(biāo)是數(shù)據(jù)的 ' 定位系統(tǒng) ',那幺在客戶端也可以完成。
客戶游標(biāo)的產(chǎn)生由來(lái)已久,當(dāng)初是為了彌補(bǔ)服務(wù)器的不足(有些數(shù)據(jù)庫(kù)引擎就不支持游標(biāo))。隨著服務(wù)器游標(biāo)的出現(xiàn),客戶游標(biāo)似乎已經(jīng)過(guò)時(shí)了,不過(guò)還是那句話:萬(wàn)事都有兩面性,在 internet 上,與數(shù)據(jù)庫(kù)的連接并不是永久的,使用客戶游標(biāo)能使我們獲得同使用服務(wù)器游標(biāo)一樣的功能。
當(dāng) CursorLoction 屬性設(shè)成 adUseClient 時(shí),微軟的游標(biāo)服務(wù)( Cursor Service )創(chuàng)建 RecordSet 對(duì)象,用前向 / 只讀的游標(biāo)方式從服務(wù)器將所有查詢結(jié)果檢索出來(lái),并且存儲(chǔ)在客戶緩沖區(qū)中。當(dāng)應(yīng)用程序通過(guò) ADO 請(qǐng)求數(shù)據(jù)時(shí),游標(biāo)服務(wù)就從客戶緩沖區(qū)中檢取數(shù)據(jù)。這種方式在連接遠(yuǎn)程服務(wù)器時(shí)非常有用,它會(huì)提高應(yīng)用程序的性能。如果你訪問(wèn)的數(shù)據(jù)庫(kù)是 Jet 數(shù)據(jù)庫(kù)( Access ),而且在本地,那么用客戶游標(biāo)非但不提高性能,還會(huì)使性能下降。這時(shí)候,數(shù)據(jù)將被緩存兩次,數(shù)據(jù)庫(kù)一次,游標(biāo)服務(wù)一次。
如果考慮應(yīng)用的功能,客戶游標(biāo)功能是很完善的,它能支持某些數(shù)據(jù)庫(kù)不能完成的操作( 視數(shù)據(jù)庫(kù)的情況而定 )。
4. 什幺是 DisConnected RecordSet ?
我們使用了客戶游標(biāo),就可以斷開(kāi)與數(shù)據(jù)庫(kù)的連接,釋放 Connection 對(duì)象。這樣的結(jié)果集就是 DisConnected RecordSet。舉例說(shuō)明:
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
......
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:
http://blog.csdn.net/Athoncj/archive/2006/12/25/1459816.aspx
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
