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