3天學(xué)好ADO之第二天
發(fā)表時(shí)間:2023-08-13 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]今天說(shuō)一下Recordset 對(duì)象的屬性1、CursorType 屬性AdOpenForwardOnly: 僅向前游標(biāo),默認(rèn)值。除了只能在記錄中向前滾動(dòng)外,與靜態(tài)游標(biāo)相同。當(dāng)只需要在記錄集中單向移動(dòng)...
今天說(shuō)一下Recordset 對(duì)象的屬性
1、CursorType 屬性
AdOpenForwardOnly: 僅向前游標(biāo),默認(rèn)值。除了只能在記錄中向前滾動(dòng)外,與靜態(tài)游標(biāo)相同。當(dāng)只需要在記錄集中單向移動(dòng)時(shí),使用它可提高性能。(顧名思義,這種游標(biāo)只能向前移動(dòng)。然而,由于這種游標(biāo)功能有限,將它用于系統(tǒng)資源時(shí)是非常有效的。)
AdOpenKeyset: 鍵集游標(biāo)。盡管從您的記錄集不能訪問(wèn)其他用戶刪除的記錄,但除無(wú)法查看其他用戶添加的記錄外,鍵集游標(biāo)與動(dòng)態(tài)游標(biāo)相似。仍然可以看見(jiàn)其他用戶更改的數(shù)據(jù)。(KeySet游標(biāo)允許你看見(jiàn)自它創(chuàng)建起其他用戶所做的修改,然而你卻不能看到其他用戶增加或刪除的記錄。)
AdOpenDynamic :動(dòng)態(tài)游標(biāo)。可以看見(jiàn)其他用戶所作的添加、更改和刪除。允許在記錄集中進(jìn)行所有類型的移動(dòng),但不包括提供者不支持的書簽操作。(此類型的游標(biāo)功能強(qiáng)大同時(shí)也是耗費(fèi)系統(tǒng)資源最多的游標(biāo)。Dynamic游標(biāo)可以看到他們保存記錄集合的所有變化。使用Dynamic游標(biāo)的用戶可以看到其他用戶所做的編輯、增加、刪除。如果數(shù)據(jù)提供者允許這種類型的游標(biāo),那么它是通過(guò)每隔一段時(shí)間從數(shù)據(jù)源重取數(shù)據(jù)來(lái)支持這種可視性的。毫無(wú)疑問(wèn)這會(huì)需要很多的資源。 )
AdOpenStatic:靜態(tài)游標(biāo)。可以用來(lái)查找數(shù)據(jù)或生成報(bào)告的記錄集合的靜態(tài)副本。另外,對(duì)其他用戶所作的添加、更改或刪除不可見(jiàn)。(Static類游標(biāo)只是數(shù)據(jù)的一幅快照。這就是說(shuō),它無(wú)法看到自它創(chuàng)建以后其他用戶對(duì)RecordSet所做的修改。采用這類游標(biāo)你可以向前和向后航行。由于其功能簡(jiǎn)單,資源的需求比Dynamic要小! )
需要注意的是:一旦打開(kāi)RecordSet,你就無(wú)法改變CursorType屬性。但是,如果你首先關(guān)閉RecordSet,改變CursorType屬性,然后重新打開(kāi)RecordSet,那么你仍可以有效地改變游標(biāo)的類型!
2、LockType 屬性
在任何同時(shí)可被多用戶修改的數(shù)據(jù)庫(kù)應(yīng)用程序中,你必須處理可能發(fā)生的多個(gè)用戶同時(shí)對(duì)同一條記錄進(jìn)行操作時(shí)的情況。當(dāng)這種情況出現(xiàn)時(shí),數(shù)據(jù)的完整性就會(huì)受到威脅,這是因?yàn)橐粋(gè)用戶可能會(huì)在不自覺(jué)地在保存自己所做的修改時(shí)覆蓋他人的修改。到時(shí)候你會(huì)覺(jué)得自己好象是沒(méi)有做事。為了處理這種情況。ADO允許你在對(duì)RecordSet對(duì)象進(jìn)行更新時(shí)決定并發(fā)事件控制的類型,當(dāng)一個(gè)用戶編輯時(shí),如何由他對(duì)記錄進(jìn)行鎖定。這就是由LockType屬性所決定的。這個(gè)屬性有四個(gè)值:
adLockReadonly:默認(rèn)值,只讀。無(wú)法更改數(shù)據(jù)。(這是RecodSet的默認(rèn)值,如果你把鎖定的方式設(shè)為該值,那么你將不能更新 Recordset。)
adLockPessimistic:保守式記錄鎖定(逐條)。提供者執(zhí)行必要的操作確保成功編輯記錄,通常采用編輯時(shí)立即鎖定數(shù)據(jù)源的記錄的方式。(如果設(shè)置為此類鎖定,記錄被鎖定,且只有在編輯開(kāi)始到將記錄更新的提交給數(shù)據(jù)提供者這段時(shí)間內(nèi)進(jìn)行編輯的用戶才可以訪問(wèn)! )
adLockOptimistic:開(kāi)放式記錄鎖定(逐條)。提供者使用開(kāi)放式鎖定,只在調(diào)用 Update 方法時(shí)鎖定記錄。(只有在將數(shù)據(jù)提交給數(shù)據(jù)提供者的那一瞬間才把記錄鎖定。)
adlockBatchOptimistic:開(kāi)放式批更新。用于與立即更新模式相反的批更新模式。(設(shè)定為這種類型的鎖定制式將被稱為批量更新模式的RecordSet。 可以加快更新RecordSet修改數(shù)據(jù)的速度,但因?yàn)橥瑫r(shí)更新多個(gè)記錄,它也會(huì)惡化與并發(fā)訪問(wèn)相關(guān)的問(wèn)題! )
3、AbsolutePage 屬性
AbsolutePage屬性設(shè)定當(dāng)前記錄的位置是位于哪一頁(yè)的頁(yè)數(shù)編號(hào);使用PageSize屬性將Recordset對(duì)象分割為邏輯上的頁(yè)數(shù),每一頁(yè)的記錄數(shù)為PageSize(除了最后一頁(yè)可能會(huì)有少于PageSize的記錄數(shù))。這里必須注意并不是所有的數(shù)據(jù)提供者都支持此項(xiàng)屬性,因此使用時(shí)要小心。
與AbsolutePosition屬性相同,AbsolutePage屬性是以1為起始的,若當(dāng)前記錄為Recordset的第一行記錄,AbsolutePage為1。可以設(shè)定AbsolutePage屬性砸貧揭桓鮒付ㄒ車牡諞恍屑鍬嘉恢謾?
4、AbsolutePosition屬性
若您需要確定目前指標(biāo)在RecordSet中的位置,您可以用AbsolutePosition屬性。
AbsolutePosition屬性的數(shù)值為目前指標(biāo)相對(duì)於第一筆的位置,由1算起,即第一筆的AbsolutePosition為1。
注意,在存取RecordSet時(shí),無(wú)法保證RecordSet每次都以同樣的順序出現(xiàn)。
若要啟用AbsolutePosition,必須先設(shè)定為使用用戶端cursor(指針):rs.CursorLocation=3
5、PageCount屬性
使用PageCount屬性,決定Recordset對(duì)象包括多少“頁(yè)”的數(shù)據(jù)。這里的“頁(yè)”是數(shù)據(jù)記錄的集合,大小等于PageSize屬性的設(shè)定,即使最后一頁(yè)的記錄數(shù)比PageSize的值少,最后一頁(yè)也算是PageCount的一頁(yè)。必須注意也并不是所有的數(shù)據(jù)提供者都支持此項(xiàng)屬性。
6、PageSize屬性
PageSize屬性是決定ADO存取數(shù)據(jù)庫(kù)時(shí)如何分頁(yè)顯示的關(guān)鍵,使用它就可以決定多少記錄組成一個(gè)邏輯上的“一頁(yè)”。設(shè)定并建立一個(gè)頁(yè)的大小,從而允許使用AbsolutePage屬性移到其它邏輯頁(yè)的第一條記錄。PageSize屬性能隨時(shí)被設(shè)定。
7、RecordCount屬性
這也是一個(gè)非常常用和重要的屬性,我們常用RecordCount屬性來(lái)找出一個(gè)Recordset對(duì)象包括多少條記錄。使用 RecordCount 屬性可確定Recordset 對(duì)象中記錄的數(shù)目。ADO 無(wú)法確定記錄數(shù)時(shí),或者如果提供者或游標(biāo)類型不支持 RecordCount,則該屬性返回 –1。讀已關(guān)閉的 Recordset 上的 RecordCount 屬性將產(chǎn)生錯(cuò)誤。Recordset 對(duì)象的游標(biāo)類型會(huì)影響是否能夠確定記錄的數(shù)目。對(duì)僅向前游標(biāo),RecordCount 屬性將返回 -1,對(duì)靜態(tài)或鍵集游標(biāo)返回實(shí)際計(jì)數(shù),對(duì)動(dòng)態(tài)游標(biāo)取決于數(shù)據(jù)源返回 -1 或?qū)嶋H計(jì)數(shù)。
8、BOF與EOF屬性
通常我們?cè)贏SP程序中編寫代碼來(lái)檢驗(yàn)BOF與EOF屬性,從而得知目前指標(biāo)所指向的RecordSet的位置,使用BOF與EOF屬性,可以得知一個(gè)Recordset對(duì)象是否包含有記錄或者得知移動(dòng)記錄行是否已經(jīng)超出該Recordset對(duì)象的范圍。
若當(dāng)前記錄的位置是在一個(gè)Recordset對(duì)象第一行記錄之前時(shí),BOF屬性返回true,反之則返回false。
若當(dāng)前記錄的位置是在一個(gè)Recordset對(duì)象最后一行記錄之后時(shí),EOF屬性返回true,反之則返回false。
(BOF與EOF都為True表示在RecordSet里沒(méi)有任何記錄。)
9、Filter 屬性
為 Recordset 中的數(shù)據(jù)指定篩選條件,使用 Filter 屬性可選擇性地屏蔽 Recordset 對(duì)象中的記錄,已篩選的 Recordset 將成為當(dāng)前游標(biāo)。
這將影響基于當(dāng)前游標(biāo)返回值的其他屬性,如 AbsolutePosition、AbsolutePage、RecordCount 和 PageCount,因?yàn)閷?Filter 屬性設(shè)置為特
定值可將當(dāng)前記錄移動(dòng)到滿足新值的第一個(gè)記錄。
這屬性我認(rèn)為相當(dāng)有用處,有的時(shí)候我們打開(kāi)了Recordset進(jìn)行了某些判斷以后我們還想過(guò)濾記錄也就是重新調(diào)整 sql 語(yǔ)句,難道我們關(guān)閉Recordset再用新的SQL語(yǔ)句打開(kāi)?不是,我們用Filter屬性進(jìn)行過(guò)濾,比如說(shuō)
rs.open exec,conn,1,1
if .... then rs.filter="name='xxx'"
而不是
rs.open exec,conn,1,1
if ... then
rs.close
exec=exec&" where name='xxx'"
rs.open exec,conn,1,1
end if
實(shí)際上再很多地方不得不用到Filter,在以后的ASP技巧中會(huì)說(shuō)到,大家也可以想一下。
明天繼續(xù)說(shuō)Recordset對(duì)象的方法。