明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線(xiàn)學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

3天學(xué)好ADO

[摘要]第一天在《十天學(xué)會(huì)ASP》教程中,我粗粗介紹了一下ADO,實(shí)際上可以說(shuō)是點(diǎn)到為止。只說(shuō)了Connection對(duì)象中的Open方法建立到數(shù)據(jù)源的物理連接,使用 Close 方法將其斷開(kāi);Recordset 對(duì)象中的使用 AddNew、Update 和 Delete 方法所做的更改,在最后分頁(yè)中提到了...

第一天在《十天學(xué)會(huì)ASP》教程中,我粗粗介紹了一下ADO,實(shí)際上可以說(shuō)是點(diǎn)到為止。只說(shuō)了Connection對(duì)象中的Open方法建立到數(shù)據(jù)源的物理連接,使用 Close 方法將其斷開(kāi);Recordset 對(duì)象中的使用 AddNew、Update 和 Delete 方法所做的更改,在最后分頁(yè)中提到了Recordset 對(duì)象中AbsolutePage和RecordCount屬性。在這里我想有必要再較系統(tǒng)說(shuō)一下ADO的各種對(duì)象的方法、屬性。畢竟ADO不僅應(yīng)用在ASP中,VB,VC都可以用到。在這十天中我想主要提到的對(duì)象是:
Connection對(duì)象(代表打開(kāi)的、與數(shù)據(jù)源的連接。)
RecordSet對(duì)象(代表來(lái)自基本表或命令執(zhí)行結(jié)果的記錄的全集。)
至于和存儲(chǔ)過(guò)程密切相關(guān)的Parameter對(duì)象和Command對(duì)象會(huì)在以后的教程中詳細(xì)說(shuō)。
先來(lái)說(shuō)一下Connection對(duì)象的方法:
1、Open方法
connection.Open ConnectionString, UserID, Password, OptionsConnectionString   可選,字符串,包含連接信息。
UserID   可選,字符串,包含建立連接時(shí)所使用用戶(hù)名。
Password   可選,字符串,包含建立連接時(shí)所使用密碼。
Options   可選,ConnectOptionEnum 值。決定該方法是在連接建立之后(異步)還是連接建立之前(同步)返回。可以是如下某個(gè)常量:
adConnectUnspecified (默認(rèn))同步打開(kāi)連接。
adAsyncConnect 異步打開(kāi)連接。
2、Execute方法
connection.Execute CommandText, RecordsAffectedCommandText    字符串,包含要執(zhí)行的 SQL 語(yǔ)句、表名、存儲(chǔ)過(guò)程或特定提供者的文本。RecordsAffected    可選,長(zhǎng)整型變量,提供者向其返回操作所影響的記錄數(shù)目。
3、Close方法
connection.Close
使用 Close 方法可關(guān)閉 Connection 對(duì)象以便釋放所有關(guān)聯(lián)的系統(tǒng)資源。
需要注意的是:
(1)關(guān)閉對(duì)象并非將它從內(nèi)存中刪除,可以更改它的屬性設(shè)置并且在此后再次打開(kāi)。
(2)要將對(duì)象從內(nèi)存中完全刪除,可將對(duì)象變量設(shè)置為 Nothing。
(3)使用 Close 方法關(guān)閉 Connection 對(duì)象的同時(shí),也將關(guān)閉與連接相關(guān)聯(lián)的任何活動(dòng) Recordset 對(duì)象。
(4)關(guān)閉 Connection 對(duì)象后,調(diào)用任何需要打開(kāi)與對(duì)數(shù)據(jù)源連接的方法都將產(chǎn)生錯(cuò)誤。以上三種方法,大家都應(yīng)該是熟知的。
下面說(shuō)一下Connection對(duì)象的屬性,簡(jiǎn)單提一下。
1、Provider屬性
使用 Provider 屬性指定 OLE DB 提供者。
需要注意的是:調(diào)用 Open 方法時(shí)在多處指定提供者可能會(huì)產(chǎn)生無(wú)法預(yù)料的后果。
2、ConnectionString 屬性
包含用于建立連接數(shù)據(jù)源的信息。
3、ConnectionTimeout 屬性
指示在終止嘗試和產(chǎn)生錯(cuò)誤前建立連接期間所等待的時(shí)間,等待連接打開(kāi)的時(shí)間的長(zhǎng)整型值(單位為秒)。默認(rèn)值為 15。
4、Mode 屬性
指示在 Connection 中修改數(shù)據(jù)的可用權(quán)限。
常量 說(shuō)明
AdModeUnknown 默認(rèn)值。表明權(quán)限尚未設(shè)置或無(wú)法確定。
AdModeRead 表明權(quán)限為只讀。
AdModeWrite 表明權(quán)限為只寫(xiě)。
AdModeReadWrite 表明權(quán)限為讀/寫(xiě)。
AdModeShareDenyRead 防止其他用戶(hù)使用讀權(quán)限打開(kāi)連接。
AdModeShareDenyWrite 防止其他用戶(hù)使用寫(xiě)權(quán)限打開(kāi)連接。
AdModeShareExclusive 防止其他用戶(hù)打開(kāi)連接。
AdModeShareDenyNone 防止其他用戶(hù)使用任何權(quán)限打開(kāi)連接。
需要注意的是:
使用 Mode 屬性可設(shè)置或返回當(dāng)前連接上提供者正在使用的訪(fǎng)問(wèn)權(quán)限。Mode 屬性只能在關(guān)閉 Connection 對(duì)象時(shí)才能夠設(shè)置。今天說(shuō)到這里,明天說(shuō)一下RecordSet對(duì)象的屬性。2.今天說(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)。盡管從您的記錄集不能訪(fǎng)問(wèn)其他用戶(hù)刪除的記錄,但除無(wú)法查看其他用戶(hù)添加的記錄外,鍵集游標(biāo)與動(dòng)態(tài)游標(biāo)相似。仍然可以看見(jiàn)其他用戶(hù)更改的數(shù)據(jù)。(KeySet游標(biāo)允許你看見(jiàn)自它創(chuàng)建起其他用戶(hù)所做的修改,然而你卻不能看到其他用戶(hù)增加或刪除的記錄。)
AdOpenDynamic :動(dòng)態(tài)游標(biāo)?梢钥匆(jiàn)其他用戶(hù)所作的添加、更改和刪除。允許在記錄集中進(jìn)行所有類(lèi)型的移動(dòng),但不包括提供者不支持的書(shū)簽操作。(此類(lèi)型的游標(biāo)功能強(qiáng)大同時(shí)也是耗費(fèi)系統(tǒng)資源最多的游標(biāo)。Dynamic游標(biāo)可以看到他們保存記錄集合的所有變化。使用Dynamic游標(biāo)的用戶(hù)可以看到其他用戶(hù)所做的編輯、增加、刪除。如果數(shù)據(jù)提供者允許這種類(lèi)型的游標(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ì)其他用戶(hù)所作的添加、更改或刪除不可見(jiàn)。(Static類(lèi)游標(biāo)只是數(shù)據(jù)的一幅快照。這就是說(shuō),它無(wú)法看到自它創(chuàng)建以后其他用戶(hù)對(duì)RecordSet所做的修改。采用這類(lèi)游標(biāo)你可以向前和向后航行。由于其功能簡(jiǎn)單,資源的需求比Dynamic要。 )
需要注意的是:一旦打開(kāi)RecordSet,你就無(wú)法改變CursorType屬性。但是,如果你首先關(guān)閉RecordSet,改變CursorType屬性,然后重新打開(kāi)RecordSet,那么你仍可以有效地改變游標(biāo)的類(lèi)型!

2、LockType 屬性
在任何同時(shí)可被多用戶(hù)修改的數(shù)據(jù)庫(kù)應(yīng)用程序中,你必須處理可能發(fā)生的多個(gè)用戶(hù)同時(shí)對(duì)同一條記錄進(jìn)行操作時(shí)的情況。當(dāng)這種情況出現(xiàn)時(shí),數(shù)據(jù)的完整性就會(huì)受到威脅,這是因?yàn)橐粋(gè)用戶(hù)可能會(huì)在不自覺(jué)地在保存自己所做的修改時(shí)覆蓋他人的修改。到時(shí)候你會(huì)覺(jué)得自己好象是沒(méi)有做事。為了處理這種情況。ADO允許你在對(duì)RecordSet對(duì)象進(jìn)行更新時(shí)決定并發(fā)事件控制的類(lèi)型,當(dāng)一個(gè)用戶(hù)編輯時(shí),如何由他對(duì)記錄進(jìn)行鎖定。這就是由LockType屬性所決定的。這個(gè)屬性有四個(gè)值:
adLockReadonly:默認(rèn)值,只讀。無(wú)法更改數(shù)據(jù)。(這是RecodSet的默認(rèn)值,如果你把鎖定的方式設(shè)為該值,那么你將不能更新 Recordset。)
adLockPessimistic:保守式記錄鎖定(逐條)。提供者執(zhí)行必要的操作確保成功編輯記錄,通常采用編輯時(shí)立即鎖定數(shù)據(jù)源的記錄的方式。(如果設(shè)置為此類(lèi)鎖定,記錄被鎖定,且只有在編輯開(kāi)始到將記錄更新的提交給數(shù)據(jù)提供者這段時(shí)間內(nèi)進(jìn)行編輯的用戶(hù)才可以訪(fǎng)問(wèn)! )
adLockOptimistic:開(kāi)放式記錄鎖定(逐條)。提供者使用開(kāi)放式鎖定,只在調(diào)用 Update 方法時(shí)鎖定記錄。(只有在將數(shù)據(jù)提交給數(shù)據(jù)提供者的那一瞬間才把記錄鎖定。)
adlockBatchOptimistic:開(kāi)放式批更新。用于與立即更新模式相反的批更新模式。(設(shè)定為這種類(lèi)型的鎖定制式將被稱(chēng)為批量更新模式的RecordSet。 可以加快更新RecordSet修改數(shù)據(jù)的速度,但因?yàn)橥瑫r(shí)更新多個(gè)記錄,它也會(huì)惡化與并發(fā)訪(fǎng)問(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?梢栽O(shè)定AbsolutePage屬性,以移動(dòng)到一個(gè)指定頁(yè)的第一行記錄位置。
4、AbsolutePosition屬性
若您需要確定目前指標(biāo)在RecordSet中的位置,您可以用AbsolutePosition屬性。
AbsolutePosition屬性的數(shù)值為目前指標(biāo)相對(duì)於第一筆的位置,由1算起,即第一筆的AbsolutePosition為1。
注意,在存取RecordSet時(shí),無(wú)法保證RecordSet每次都以同樣的順序出現(xiàn)。
若要啟用AbsolutePosition,必須先設(shè)定為使用用戶(hù)端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)類(lèi)型不支持 RecordCount,則該屬性返回 –1。讀已關(guān)閉的 Recordset 上的 RecordCount 屬性將產(chǎn)生錯(cuò)誤。Recordset 對(duì)象的游標(biāo)類(lèi)型會(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程序中編寫(xiě)代碼來(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都為T(mén)rue表示在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)到滿(mǎn)足新值的第一個(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ì)象的方法。3.今天來(lái)說(shuō)一下Recordset對(duì)象的一些方法。
1、AddNew 方法
創(chuàng)建可更新 Recordset 對(duì)象的新記錄。
recordset.AddNew FieldList, Values
FieldList   可選。新記錄中字段的單個(gè)名稱(chēng)、一組名稱(chēng)或序號(hào)位置。
Values   可選。新記錄中字段的單個(gè)或一組值。如果 Fields 是數(shù)組,那么 Values 也必須是有相同成員數(shù)的數(shù)組,否則將發(fā)生錯(cuò)誤。字段名稱(chēng)的次序必須與每個(gè)數(shù)組中的字段值的次序相匹配。我們一般是
rs.addnew
rs("xx")=xx
rs("xx")=xx
rs.update
需要注意的是在立即更新模式(調(diào)用 Update 方法時(shí)提供者會(huì)立即將更改寫(xiě)入基本數(shù)據(jù)源)下,調(diào)用不帶參數(shù)的 AddNew 方法可將 EditMode 屬性設(shè)置為 adEditAdd。提供者將任何字段值的更改緩存在本地。調(diào)用 Update 方法可將新記錄傳遞到數(shù)據(jù)庫(kù)并將 EditMode 屬性重置為 adEditNone。如果傳送了 Fields 和 Values 參數(shù),ADO 則立即將新記錄傳遞到數(shù)據(jù)庫(kù)(無(wú)須調(diào)用 Update),且 EditMode 屬性值沒(méi)有改變 (adEditNone)。
可能大家會(huì)問(wèn)在ASP中使用ADO的AddNew方法和直接使用“Insert into...”語(yǔ)句有和不同?那種方式更好?答:ADO的AddNew方法只是將“Insert into ”語(yǔ)句封裝了起來(lái),所以,當(dāng)對(duì)大量數(shù)據(jù)進(jìn)行操作的時(shí)候,直接使用SQL語(yǔ)句將會(huì)大大加快存取數(shù)據(jù)的速度,因?yàn)樗麥p少了ADO的“翻譯”時(shí)間。2、Delete 方法
刪除當(dāng)前記錄或記錄組。
recordset.Delete AffectRecordsAffectRecords   AffectEnum 值,確定 Delete 方法所影響的記錄數(shù)目,該值可以是下列常量之一。
AdAffectCurrent 默認(rèn)。僅刪除當(dāng)前記錄。
AdAffectGroup 刪除滿(mǎn)足當(dāng)前 Filter 屬性設(shè)置的記錄。要使用該選項(xiàng),必須將 Filter 屬性設(shè)置為有效的預(yù)定義常量之一。
adAffectAll 刪除所有記錄。
adAffectAllChapters 刪除所有子集記錄。
使用立即更新模式將在數(shù)據(jù)庫(kù)中進(jìn)行立即刪除,否則記錄將標(biāo)記為從緩存刪除,實(shí)際的刪除將在調(diào)用 Update 方法時(shí)進(jìn)行。3、Update 方法
保存對(duì) Recordset 對(duì)象的當(dāng)前記錄所做的所有更改
recordset.Update Fields, Values
Fields   可選。變體型,代表單個(gè)名稱(chēng);或變體型數(shù)組,代表需要修改的字段(一個(gè)或多個(gè))名稱(chēng)及序號(hào)位置。
Values   可選。變體型,代表單個(gè)值;或變體型數(shù)組,代表新記錄中字段(單個(gè)或多個(gè))值。
如果希望取消對(duì)當(dāng)前記錄所做的任何更改或者放棄新添加的記錄,則必須調(diào)用 CancelUpdate 方法。4、CancelUpdate 方法
recordset.CancelUpdate
使用 CancelUpdate 方法可取消對(duì)當(dāng)前記錄所作的任何更改或放棄新添加的記錄。在調(diào)用 Update 方法后將無(wú)法撤消對(duì)當(dāng)前記錄或新記錄所做的更改,如果在調(diào)用 CancelUpdate 方法時(shí)添加新記錄,則調(diào)用 AddNew 之前的當(dāng)前記錄將再次成為當(dāng)前記錄。如果尚未更改當(dāng)前記錄或添加新記錄,調(diào)用 CancelUpdate 方法將產(chǎn)生錯(cuò)誤。5、Find 方法
搜索 Recordset 中滿(mǎn)足指定標(biāo)準(zhǔn)的記錄。如果滿(mǎn)足標(biāo)準(zhǔn),則記錄集位置設(shè)置在找到的記錄上,否則位置將設(shè)置在記錄集的末尾。
Find (criteria, SkipRows, searchDirection, start)
criteria   字符串,包含指定用于搜索的列名、比較操作符和值的語(yǔ)句。
SkipRows    可選,長(zhǎng)整型值,其默認(rèn)值為零,它指定當(dāng)前行或 start 書(shū)簽的位移以開(kāi)始搜索。
searchDirection    可選的 SearchDirectionEnum 值,指定搜索應(yīng)從當(dāng)前行還是下一個(gè)有效行開(kāi)始。其值可為 adSearchForward 或 adSearchBackward。搜索是在記錄集的開(kāi)始還是末尾結(jié)束由 searchDirection 值決定。
start    可選,變體型書(shū)簽,用作搜索的開(kāi)始位置。
criteria “比較操作符”可以是“>”(大于)、“<”(小于)、“=”(等于)、“>=”(大于或等于)、“<=”(小于或等于)、“<>”(不等于)或“l(fā)ike”(模式匹配)。 criteria 中的值可以是字符串、浮點(diǎn)數(shù)或者日期。字符串值以單引號(hào)分界(如“state = 'WA'”)。日期值以“#”(數(shù)字記號(hào))分界(如“start_date > #7/22/97#”)。
需要注意的是find是不支持多字段。但是可以用filter實(shí)現(xiàn)。"name='abc'"AND "city='sh'" 是不允許的6、Move 方法
移動(dòng) Recordset 對(duì)象中當(dāng)前記錄的位置
recordset.Move NumRecords, Start
NumRecords    帶符號(hào)長(zhǎng)整型表達(dá)式,指定當(dāng)前記錄位置移動(dòng)的記錄數(shù)。
Start    可選,字符串或變體型,用于計(jì)算書(shū)簽。也可為下列值之一:
AdBookmarkCurrent 默認(rèn)。從當(dāng)前記錄開(kāi)始。
AdBookmarkFirst 從首記錄開(kāi)始。
AdBookmarkLast 從尾記錄開(kāi)始。
需要注意的是:
(1)如果 NumRecords 參數(shù)大于零,則當(dāng)前記錄位置將向前移動(dòng)(向記錄集的末尾)。如果 NumRecords 小于零,則當(dāng)前記錄位置向后移動(dòng)(向記錄集的開(kāi)始)。
(2)從空的 Recordset 對(duì)象調(diào)用 Move 方法將產(chǎn)生錯(cuò)誤。
(3)如果 Move 調(diào)用將當(dāng)前記錄位置移動(dòng)到首記錄之前,則 ADO 將當(dāng)前記錄放置在記錄集(BOF 為 True)的首記錄之前。在 BOF 屬性已經(jīng)為 True 時(shí)試圖向后移動(dòng)將產(chǎn)生錯(cuò)誤;如果 Move 調(diào)用將當(dāng)前記錄位置移動(dòng)到尾記錄之后,則 ADO 將當(dāng)前記錄放置在記錄集(EOF 為 True)的尾記錄之后。在 EOF 屬性已經(jīng)為 True 時(shí)試圖向前移動(dòng)將產(chǎn)生錯(cuò)誤。7、MoveFirst、MoveLast、MoveNext 和 MovePrevious 方法
在指定 Recordset 對(duì)象中移動(dòng)到第一個(gè)、最后一個(gè)、下一個(gè)或前一個(gè)記錄并使該記錄成為當(dāng)前記錄。
recordset.{MoveFirst MoveLast MoveNext MovePrevious}
需要注意的是:
(1)使用 MoveNext 方法將當(dāng)前記錄向前移動(dòng)一個(gè)記錄(向 Recordset 的底部)。如果最后一個(gè)記錄是當(dāng)前記錄并且調(diào)用 MoveNext 方法,則 ADO 將當(dāng)前記錄設(shè)置到 Recordset (EOF 為 True)的尾記錄之后。當(dāng) EOF 屬性已經(jīng)為 True 時(shí)試圖向前移動(dòng)將產(chǎn)生錯(cuò)誤。
(2)使用 MovePrevious 方法將當(dāng)前記錄位置向后移動(dòng)一個(gè)記錄(向記錄集的頂部)。Recordset 對(duì)象必須支持向后游標(biāo)移動(dòng);否則方法調(diào)用將產(chǎn)生錯(cuò)誤。如果首記錄是當(dāng)前記錄并且調(diào)用 MovePrevious 方法,則 ADO 將當(dāng)前記錄設(shè)置在 Recordset (BOF 為 True)的首記錄之前。而 BOF 屬性為 True 時(shí)向后移動(dòng)將產(chǎn)生錯(cuò)誤。8、Clone 方法
創(chuàng)建與現(xiàn)有 Recordset 對(duì)象相同的復(fù)制 Recordset 對(duì)象?蛇x擇指定該副本為只讀。
Set rstDuplicate = rstOriginal.Clone
rstDuplicate   對(duì)象變量,標(biāo)識(shí)正在創(chuàng)建的復(fù)制 Recordset 對(duì)象。
rstOriginal   對(duì)象變量,標(biāo)識(shí)要被復(fù)制的 Recordset 對(duì)象。
使用 Clone 方法可創(chuàng)建多個(gè) Recordset 對(duì)象副本,這對(duì)于希望在給定的記錄組中保留多個(gè)當(dāng)前記錄十分有用。使用 Clone 方法比使用與初始定義相同的定義創(chuàng)建和打開(kāi)新 Recordset 對(duì)象要有效得多。
也就是說(shuō)
rs.open exec,conn,1,1
rs2.open exec,conn,1,1
應(yīng)該這么改寫(xiě)
rs.open exec,conn,1,1
rs2=rs.clone需要注意的是:
(1)新創(chuàng)建副本的當(dāng)前記錄將設(shè)置為首記錄。
(2)關(guān)閉原始 Recordset 時(shí)并不關(guān)閉它的副本,而關(guān)閉某個(gè)副本也將不關(guān)閉原始 Recordset 或任何其他副本。9、Close 方法
關(guān)閉打開(kāi)的對(duì)象及任何相關(guān)對(duì)象。
object.Close
需要注意的是:
(1)使用 Close 方法可關(guān)閉Recordset 對(duì)象以便釋放所有關(guān)聯(lián)的系統(tǒng)資源。關(guān)閉對(duì)象并非將它從內(nèi)存中刪除,可以更改它的屬性設(shè)置并且在此后再次打開(kāi)。要將對(duì)象從內(nèi)存中完全刪除,可將對(duì)象變量設(shè)置為 Nothing。
(2)如果正在立即更新模式下進(jìn)行編輯,調(diào)用 Close 方法將產(chǎn)生錯(cuò)誤,應(yīng)首先調(diào)用 Update 或 CancelUpdate 方法。
10、Open 方法,為什么最后說(shuō)這個(gè),因?yàn)榍懊娴母黜?xiàng)屬性方法沒(méi)有弄清楚,我們是不會(huì)理解CursorType參數(shù)的
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
Recordset對(duì)象可以通過(guò)Source屬性來(lái)連接Command對(duì)象。Source參數(shù)可以是一個(gè)Command對(duì)象名稱(chēng)、一段SQL命令、一個(gè)指定的數(shù)據(jù)表名稱(chēng)或是一個(gè)Stored Procedure。假如省略這個(gè)參數(shù),系統(tǒng)則采用Recordset對(duì)象的Source屬性。ActiveConnectionRecordset對(duì)象可以通過(guò)ActiveConnection屬性來(lái)連接Connection對(duì)象。這里的ActiveConnection可以是一個(gè)Connection對(duì)象或是一串包含數(shù)據(jù)庫(kù)連接信息(ConnectionString)的字符串參數(shù)。CursorTypeRecordset對(duì)象Open方法的CursorType參數(shù)表示將以什么樣的游標(biāo)類(lèi)型啟動(dòng)數(shù)據(jù),包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下:--------------------------------------------------------------常數(shù) 常數(shù)值 說(shuō)明-------------------------------------------------------------adOpenForwardOnly 0 缺省值,啟動(dòng)一個(gè)只能向前移動(dòng)的游標(biāo)(Forward Only)。adOpenKeyset 1 啟動(dòng)一個(gè)Keyset類(lèi)型的游標(biāo)。adOpenDynamic 2 啟動(dòng)一個(gè)Dynamic類(lèi)型的游標(biāo)。adOpenStatic 3 啟動(dòng)一個(gè)Static類(lèi)型的游標(biāo)。-------------------------------------------------------------以上幾個(gè)游標(biāo)類(lèi)型將直接影響到Recordset對(duì)象所有的屬性和方法,以下列表說(shuō)明他們之間的區(qū)別。Recordset屬性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic
AbsolutePage 不支持 不支持 可讀寫(xiě) 可讀寫(xiě)AbsolutePosition 不支持 不支持 可讀寫(xiě) 可讀寫(xiě)B(tài)OF 只讀 只讀 只讀 只讀CursorType 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)EOF 只讀 只讀 只讀 只讀Filter 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)LockType 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)PageCount 不支持 不支持 只讀 只讀PageSize 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)RecordCount 不支持 不支持 只讀 只讀AddNew 支持 支持 支持 支持CancelBatch 支持 支持 支持 支持CancelUpdate 支持 支持 支持 支持Close 支持 支持 支持 支持Delete 支持 支持 支持 支持Move 不支持 支持 支持 支持MoveFirst 支持 支持 支持 支持MoveLast 不支持 支持 支持 支持MoveNext 支持 支持 支持 支持MovePrevious 不支持 支持 支持 支持Open 支持 支持 支持 支持Update 支持 支持 支持 支持UpdateBatch 支持 支持 支持 支持--------------------------------------------------------------Recordset對(duì)象Open方法的LockType參數(shù)表示要采用的Lock類(lèi)型,如果忽略這個(gè)參數(shù),那么系統(tǒng)會(huì)以Recordset對(duì)象的LockType屬性為預(yù)設(shè)值。LockType參數(shù)包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:常數(shù) 常數(shù)值 說(shuō)明--------------------------------------------------------------adLockReadOnly 1 缺省值,Recordset對(duì)象以只讀方式啟動(dòng),無(wú)法運(yùn)行AddNew、Update及Delete等方法adLockPrssimistic 2 當(dāng)數(shù)據(jù)源正在更新時(shí),系統(tǒng)會(huì)暫時(shí)鎖住其他用戶(hù)的動(dòng)作,以保持?jǐn)?shù)據(jù)一致性。adLockOptimistic 3 當(dāng)數(shù)據(jù)源正在更新時(shí),系統(tǒng)并不會(huì)鎖住其他用戶(hù)的動(dòng)作,其他用戶(hù)可以對(duì)數(shù)據(jù)進(jìn)行增、刪、改的操作。adLockBatchOptimistic 4 當(dāng)數(shù)據(jù)源正在更新時(shí),其他用戶(hù)必須將CursorLocation屬性改為adUdeClientBatch才能對(duì)數(shù)據(jù)進(jìn)行增、刪、改的操作。需要注意的是:
如果數(shù)據(jù)源沒(méi)有返回記錄,那么提供者將 BOF 和 EOF 屬性同時(shí)設(shè)置為 True,并且不定義當(dāng)前記錄位置。如果游標(biāo)類(lèi)型允許,仍然可以將新數(shù)據(jù)添加到該空 Recordset 對(duì)象。


標(biāo)簽:3天學(xué)好ADO