今天,在一個(gè)asp技術(shù)群里一個(gè)朋友問了這么一個(gè)問題:rs.recordcount為什么返回值總是-1呢?以前在asp編程的過(guò)程中也碰到過(guò)相同的問題,于是就告訴他方法,但是,無(wú)論怎么改總是不可以。最后發(fā)現(xiàn),他連接的是mysql數(shù)據(jù)庫(kù),而我做過(guò)的那些是access數(shù)據(jù)庫(kù)。因此,問題也就出來(lái)了。怎么解決呢?
他的原本語(yǔ)句:rs.open "select A_name from area where A_state='1' order by A_id asc",conn,1,1。然后輸出rs.recordcount的值是-1.怎么改?
1).為了書寫簡(jiǎn)便,我寫成這樣:rs.open sql,conn,3,1.我讓他改成這樣,結(jié)果還是返回-1.納悶,曾經(jīng)在access數(shù)據(jù)庫(kù)編程中,只要改了這個(gè)參數(shù),一切ok.看來(lái),還有問題。難道是數(shù)據(jù)庫(kù)問題?
2).在rs.open sql,conn,1,1之前添加一句:rs.cursorlocation = 3。結(jié)果,還是不可以。
3).改成:rs.cursorlocation = 3 rs.open sql,conn,3,1.ok.成功!
下面解釋一下:rs.open sql,conn,3,1。這句中兩個(gè)參數(shù)分別表示游標(biāo)類型和鎖定類型。什么是游標(biāo)類型?
游標(biāo)類型:
Const adOpenForwardOnly = 0
前向游標(biāo),為缺省游標(biāo),提供最快的運(yùn)行性能。用它打開recordset,從對(duì)至尾順序取得所有結(jié)果。它不支持向后滾動(dòng),只允許在結(jié)果間單向移動(dòng)。
Const adOpenKeyset = 1
靜態(tài)游標(biāo),反映第一次打開游標(biāo)時(shí)表中數(shù)據(jù)的狀態(tài),游標(biāo)無(wú)法查明底層表中的數(shù)據(jù)行是否更新過(guò)、刪除過(guò)或添加了新的數(shù)據(jù)。不過(guò)與只能前移的洲標(biāo)不同,靜態(tài)游標(biāo)可以在結(jié)果間前后滾動(dòng)。
Const adOpenDynamic = 2
鍵盤驅(qū)動(dòng)的游標(biāo),可以查詢表中底層數(shù)據(jù)行的某些變化,但不是全部。它特別是可以準(zhǔn)確反映數(shù)據(jù)是否更新過(guò)。但它不能查明其它用戶是否曾刪除過(guò)數(shù)據(jù)行(刪除掉的數(shù)據(jù)行在recordset中會(huì)留下空洞)。鍵盤驅(qū)動(dòng)的游標(biāo)支持在結(jié)果間前后滾動(dòng)。
Const adOpenStatic = 3
動(dòng)態(tài)游標(biāo),是最豐富的游標(biāo)類型。游標(biāo)打開時(shí)可以查詢其他用戶對(duì)表的任何改動(dòng),而且支持滾動(dòng)。
什么是鎖定類型?
Const adLockReadOnly = 1
缺省的上鎖類型,只讀方式上鎖允許多個(gè)用戶同時(shí)讀取同樣的數(shù)據(jù),但不能改變數(shù)據(jù)。
Const adLockPessimistic = 2
以悲觀上鎖方式打開數(shù)據(jù)對(duì)象。該方式假定在你編輯記錄時(shí)會(huì)有其它用戶訪問數(shù)據(jù)。此時(shí)一旦你開始編輯記錄,其它用戶就不能訪問該數(shù)據(jù)。
Const adLockOptimistic = 3
以樂觀上鎖方式打開數(shù)據(jù)對(duì)象。該方式假定在你編輯記錄時(shí)不會(huì)有其它用戶訪問數(shù)據(jù)。在完成改變之前,其它用戶不能訪問該記錄。
Const adLockBatchOptimistic = 4
執(zhí)行多行批處理更新時(shí)使用這種類型
那么rs.cursorlocation = 3又是什么意思呢?就是代表使用客戶端光標(biāo),也就是rs.CursorLocation = adUseClient。對(duì)應(yīng)的是 rs.CursorLocation = adUseServer 服務(wù)端光標(biāo)。
看看下面更詳細(xì)的解釋:
CursorLocation 屬性
設(shè)置或返回游標(biāo)服務(wù)的位置。
設(shè)置和返回值
設(shè)置或返回可設(shè)置為以下某個(gè)常量的長(zhǎng)整型值。
常量 說(shuō)明
adUseNone 沒有使用游標(biāo)服務(wù)。(該常量已過(guò)時(shí)并且只為了向后兼容才出現(xiàn))。
adUseClient 使用由本地游標(biāo)庫(kù)提供的客戶端游標(biāo)。本地游標(biāo)服務(wù)通常允許使用的許多功能可能是驅(qū)動(dòng)程序提供的游標(biāo)無(wú)法使用的,因此使用該設(shè)置對(duì)于那些將要啟用的功能是有 好處的。AdUseClient 具有向后兼容性,也支持同義的 adUseClientBatch。
adUseServer 默認(rèn)值。使用數(shù)據(jù)提供者的或驅(qū)動(dòng)程序提供的游標(biāo)。這些游標(biāo)有時(shí)非常靈活,對(duì)于其他用戶對(duì)數(shù)據(jù)源所作的更改具有額外的敏感性。但是,Microsoft Client Cursor Provider(如已斷開關(guān)聯(lián)的記錄集)的某些功能無(wú)法由服務(wù)器端游標(biāo)模擬,通過(guò)該設(shè)置將無(wú)法使用這些功能。
說(shuō)明
該屬性允許在可用于提供者的各種游標(biāo)庫(kù)中進(jìn)行選擇。通常,可以選擇使用客戶端游標(biāo)庫(kù)或位于服務(wù)器上的某個(gè)游標(biāo)庫(kù)。
該屬性設(shè)置僅對(duì)屬性已經(jīng)設(shè)置后才建立的連接有影響。更改 CursorLocation 屬性不會(huì)影響現(xiàn)有的連接。
對(duì)于 Connection 或關(guān)閉的 Recordset 該屬性為讀/寫,而對(duì)打開的 Recordset 該屬性為只讀。
由 Execute 方法返回的游標(biāo)繼承該設(shè)置。Recordset 將自動(dòng)從與之關(guān)聯(lián)的連接中繼承該設(shè)置。
遠(yuǎn)程數(shù)據(jù)服務(wù)用法 當(dāng)用于客戶端 (ADOR) Recordset 或 Connection 對(duì)象時(shí),只能將 CursorLocation 屬性設(shè)置為 adUseClient.