




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、ADO使用詳解Connection對象C o n n e c t i o n對象是使我們能與數(shù)據(jù)存儲(chǔ)相連的對象。只有C o n n e c t i o n對象才能指定希望使用的OLE DB提供者、連接到數(shù)據(jù)存儲(chǔ)的安全細(xì)節(jié)以及其他任何連接到數(shù)據(jù)存儲(chǔ)特有的細(xì)節(jié)。不必顯式創(chuàng)建一個(gè)C o n n e c t i o n對象以連接到數(shù)據(jù)存儲(chǔ)。沒有C o n n e c t i o n對象,一樣可以創(chuàng)建C o m m a n d、R e c o r d s e t和R e c o r d對象。如果不創(chuàng)建自己的C o n n e c t i o n對象,A D O將會(huì)隱含地為你創(chuàng)建一個(gè)C o n n e c
2、 t i o n對象。如果要對提供者運(yùn)行多條命令,應(yīng)該顯式地創(chuàng)建一個(gè)C o n n e c t i o n對象,這比每運(yùn)行一條命令就創(chuàng)建一個(gè)連接更有效。除了為數(shù)據(jù)存儲(chǔ)提供連接以外, C o n n e c t i o n對象允許針對數(shù)據(jù)存儲(chǔ)執(zhí)行命令操作。這些命令可以是結(jié)構(gòu)化的或存儲(chǔ)的命令(例如,S Q L命令或一個(gè)存儲(chǔ)過程),并且可以有選擇地從數(shù)據(jù)存儲(chǔ)中返回一些數(shù)據(jù)。Command對象C o m m a n d 對象是對數(shù)據(jù)存儲(chǔ)執(zhí)行命令的對象。看到這里讀者可能會(huì)產(chǎn)生疑問,C o n n e c t i o n對象不也能這樣做嗎?是的,但是C o n n e c t i o n對象在處理命令的功
3、能上受到一定的限制,而C o m m a n d對象是特別為處理命令的各方面問題而創(chuàng)建的。當(dāng)從C o n n e c t i o n對象中運(yùn)行一條命令時(shí),已經(jīng)隱含地創(chuàng)建了一個(gè)C o m m a n d對象。有時(shí)其他對象允許向命令傳入?yún)?shù),但在C o n n e c t i o n對象中不能指定參數(shù)的任何細(xì)節(jié)。使用C o m m a n d對象允許指定參數(shù)(以及輸出參數(shù)和命令執(zhí)行后的返回值)的精確細(xì)節(jié)(比如,數(shù)據(jù)類型和長度)。因此,除了執(zhí)行命令和得到一系列返回記錄,也可能得到一些由命令提供的附加信息。對于那些不返回任何記錄的命令,如插入新數(shù)據(jù)或更新數(shù)據(jù)的S Q L查詢, C o m m a n
4、d對象也是有用的。Recordset對象R e c o r d s e t對象是A D O中使用最為普遍的對象,因?yàn)樗袕臄?shù)據(jù)存儲(chǔ)中提取的數(shù)據(jù)集。我們經(jīng)常運(yùn)行不返回?cái)?shù)據(jù)的命令,比如那些增加或更新數(shù)據(jù)的命令,但在大多數(shù)情況下很有可能會(huì)取得一系列記錄。R e c o r d s e t對象是擁有這些記錄的對象??梢愿?增加、更新和刪除)記錄集中的記錄,上下移動(dòng)記錄,過濾記錄并只顯示部分內(nèi)容等等。R e c o r d s e t對象也包含F(xiàn) i e l d s集合,F(xiàn) i e l d s集合中有記錄集中每一個(gè)字段(列)的F i l e d對象。無論是在A S P頁面中處理數(shù)據(jù),還是利用遠(yuǎn)程數(shù)據(jù)
5、服務(wù)( R D S )遠(yuǎn)程使用數(shù)據(jù),R e c o r d s e t對象是必須處理的對象。連接到數(shù)據(jù)存儲(chǔ)連接字符串連接字符串依賴于提供者,因?yàn)槊總€(gè)數(shù)據(jù)提供者可能需要不同的細(xì)節(jié)。值得注意的重要一點(diǎn)是, O D B C的OLE DB提供者是缺省的,所以,如果不使用Provide = 部分,系統(tǒng)將自動(dòng)地使用O D B C。下面為不同的提供者列舉了連接字符串的例子,在本書的后面將會(huì)看到更多的例子。1. 微軟A c c e s s如果使用O D B C,而沒有D S N:Driver=Microsoft Access Driver (*.mdb);DBQ=C:wroxdatabase_name.mdb
6、對于本地的OLE DB提供者:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:wroxdatabase_name.mdb上面的例子說明了A c c e s s數(shù)據(jù)庫存放于C : w r o x目錄下。雖然讀者可能會(huì)嘗試將數(shù)據(jù)庫作為We b文件存放于相同的目錄下,但不要這樣做,否則任何人都可以下載整個(gè)數(shù)據(jù)庫文件。將數(shù)據(jù)庫存放于We b目錄外永遠(yuǎn)是明智的,沒有人可以從外面訪問該文件。使用包含文件可以將創(chuàng)建connect對象的語法寫入一個(gè)asp文件,然后用包含文件的語句將其放入所需要的文件中,例<!- #INCLUDE FILE=”Connect.
7、asp”>這樣不必再為每個(gè)A S P頁面都輸入連接細(xì)節(jié),同時(shí)方便于更改整個(gè)站點(diǎn)都使用的連接。包含文件也是放置M E TA D ATA標(biāo)簽的好地方。使用連接狀態(tài)將連接字符串存入應(yīng)用程序變量是一個(gè)常用的技巧,同使用一個(gè)包含文件一樣有效。例如,可以在g l o b a l . a s a文件中加入下面的代碼:Sub Application_Onstart()Strconn=”Provider=SQLOLEDB;Data source=WATCHER;”Set application(“connectionstring”)=strconnEnd sub在A S P頁面中,可以使用下面的代碼:se
8、t conpubs=server.createobject(“ADODB.connection”)conpubs.open application(“connectionstring”)連接語法如果使用顯式定義的C o n n e c t i o n對象,可以使用O p e n方法,它的語法如下:Connect.Open Connectionstring,Userid,Password,Options參數(shù)如表所示參數(shù)說明C o n n e c t i o n S t r i n g包含連接細(xì)節(jié)的字符串。可以是ODBC DSN的名稱、數(shù)據(jù)鏈接文件的名稱或真實(shí)的連接細(xì)節(jié)U s e r I D連接期
9、間,用戶使用的名字。覆蓋連接字符串中提供的任何用戶名P a s s w o r d用戶的口令。覆蓋連接字符串中提供的任何口令O p t i o n s可以是a d A s y n c C o n n e c t,指定異步地建立連接。忽略這個(gè)參數(shù),則建立一個(gè)同步連接連接的例子下面是幾個(gè)示例,這里假定s t r C o n n包含一個(gè)有效的連接字符串。為了打開一個(gè)連接,使用C o n n e c t i o n對象的O p e n方法。例如:Set Conpubs=Server.Createobject(“ADODB.Connection”)Conpubs.Open StrconnConpubs.
10、Close也可以使用C O N N E C T I O N S T R I N G屬性:Set Conpubs=Server.Createojbect(“ADODB.Connection”)Conpubs.Connectionstring=StrconnConpubs.OpenConpubs.Close這兩種實(shí)現(xiàn)方法之間沒有什么區(qū)別,如果使用前一種方法來實(shí)現(xiàn)連接, C o n n e t i o n S t r i n g屬性同時(shí)也被賦值。值得注意的是,一旦與數(shù)據(jù)存儲(chǔ)建立了連接, A D O可能會(huì)改變C o n n e c t i o n S t r i n g屬性值。不必?fù)?dān)心,A D O只填
11、寫一些額外的屬性值。記錄集前面已經(jīng)提到,記錄集是A D O中最常用的對象,這并不值得奇怪。畢竟,他們包含著數(shù)據(jù)。但是,對于記錄集還有比想象的更多的內(nèi)容,知道數(shù)據(jù)如何保存和處理很重要,因?yàn)檫@為選擇使用哪種記錄集提供了更多的參考。記錄集有不同的類型,在一些細(xì)小的地方存在著差異,很容易造成失誤。首先需要認(rèn)真談?wù)摰氖枪鈽?biāo)的概念。光標(biāo)光標(biāo)用來管理記錄集和記錄集的當(dāng)前位置能用光標(biāo)做什么是由光標(biāo)的類型決定的1. 光標(biāo)類型光標(biāo)的類型標(biāo)識(shí)了光標(biāo)所能夠提供的功能。這里有四種類型的光標(biāo): 靜態(tài)( a d O p e n S t a t i c )。靜態(tài)光標(biāo)含有對記錄的靜態(tài)拷貝。這意味著在記錄集建立之后,記錄集的內(nèi)容
12、就固定了。其他用戶對記錄的更改、添加和刪除都是不可見的。允許在記錄集中向前、向后移動(dòng)。 只許前移( a d O p e n F o r w a r d O n l y )。缺省的光標(biāo)類型,除了只允許向前移動(dòng)外,其余的與靜態(tài)光標(biāo)相同。 動(dòng)態(tài)( a d O p e n D y n a m i c )。動(dòng)態(tài)的光標(biāo)沒有固定的記錄集。其他用戶的更改、添加或刪除操作在記錄集中是可見的。允許在記錄集中向前、向后移動(dòng)。 鍵集( a d O p e n K e y s e t )。鍵集類型的光標(biāo)除了記錄集是固定的,其余的與動(dòng)態(tài)光標(biāo)相似??梢钥吹狡渌脩舻男薷?,但新記錄卻不可見。如果別的用戶刪除了記錄,那么這些記
13、錄在記錄集中將會(huì)變得不可訪問。這項(xiàng)功能是通過標(biāo)識(shí)記錄集的鍵來實(shí)現(xiàn)的,所以鍵一直保留著,即使改變或刪除記錄。鎖定鎖定就是如何確保數(shù)據(jù)的完整性,確保更改不會(huì)被覆蓋。我們需要避免的典型情況是多次更新,比如一個(gè)用戶改動(dòng)了一些數(shù)據(jù),接著另一個(gè)用戶立即又將其做了修改。為了對這種情況加以保護(hù),要鎖定記錄,有許多不同的方法可以保證記錄得到保護(hù)??赏ㄟ^鎖定類型來設(shè)置這些方法。1. 鎖定類型鎖定類型決定更新記錄時(shí)記錄是否或如何被鎖定。有四種類型的鎖定: 只讀( a d L o c k R e a d O n l y ):缺省鎖定類型,記錄集是只讀的,不能修改記錄。 悲觀的( a d L o c k P e s s
14、 i m i s t i c ):當(dāng)修改記錄時(shí),數(shù)據(jù)提供者將嘗試鎖定記錄以確保成功地編輯記錄。只要編輯一開始,則立即鎖住記錄。 樂觀的( a d L o c k O p t i m i s t i c ):直到用U p d a t e方法提交更新記錄時(shí)才鎖定記錄。 批量樂觀的( a d L o c k B a t c h O p t i m i s t i c ):允許修改多個(gè)記錄,只有調(diào)用U p d a t e B a t c h方法后才鎖定記錄。當(dāng)不需要改動(dòng)任何記錄時(shí),應(yīng)該使用只讀的記錄集,這樣提供者不用做任何檢測。對于一般的使用,樂觀的鎖定可能是最好的選擇,因?yàn)橛涗浿槐绘i定一小段時(shí)間,數(shù)
15、據(jù)在這段時(shí)間被更新。這減少了資源的使用。悲觀的鎖定提高了數(shù)據(jù)的完整性,但卻是以犧牲并發(fā)性為代價(jià)的。并發(fā)性是許多用戶在同一時(shí)間查閱數(shù)據(jù)的能力。鎖定的記錄對其他用戶是不可見的,因而數(shù)據(jù)的并發(fā)性降低了。樂觀的鎖定只在一小段時(shí)間內(nèi)鎖定記錄,所以增強(qiáng)了數(shù)據(jù)的并發(fā)性,但同時(shí)其他用戶修改數(shù)據(jù)的幾率也增加了。創(chuàng)建記錄集創(chuàng)建一個(gè)記錄集十分容易,通過調(diào)用R e c o r d s e t對象的O p e n方法來實(shí)現(xiàn):Recordset.Open Source,Activeconnection,Cursortype,Locktype,Options其參數(shù)及說明如表所示參數(shù)說明S o u r c e數(shù)據(jù)源??梢允菙?shù)
16、據(jù)庫中的表名、存儲(chǔ)的查詢或過程、S Q L字符串、C o m m a n d對象或適用于提供者的其他命令對象A c t i v e C o n n e c t i o n記錄集使用的連接??梢允且粋€(gè)連接字符串或者一個(gè)打開的C o n n e c t i o n對象C u r s o r Ty p e使用的光標(biāo)類型。必須是定義的光標(biāo)類型中的一種,缺省值為a d F o r w a r d O n l yL o c k Ty p e使用的鎖定類型。必須是定義的鎖定類型中的一種,缺省值為a d L o c k R e a d O n l yO p t i o n s告訴提供者S o u r c e參
17、數(shù)的內(nèi)容是什么,如表、文本字符串等等例如,要打開數(shù)據(jù)庫p u b s中a u t h o r s表上的記錄集:Dim RsauthorsSet Rsauthors=Server.Createobject(“ADODB.Recordset”)Rsauthors.Open “Authors”,StrconnRsauthors.CloseSet Rsauthors=Nothing注意,有幾個(gè)參數(shù)沒有指定。實(shí)際上,所有的參數(shù)都是可選的,可以在打開記錄集之前為它們設(shè)置相應(yīng)的屬性值:Dim RsauthorsSet Rsauthors=Server.Createobject(“ADODB.Recordse
18、t”)With Rsauthors.Source=”Authors”.Activeconnection=Strconn.Cursortype=Adopenforwardonly.Locktype=Adlockreadonly.OpenEnd WithRsauthors.CloseSet Rsauthors=Nothing一旦打開記錄集,當(dāng)前指針自動(dòng)地位于第一條記錄上。如果在記錄集中沒有記錄,那么E O F和B O F屬性都是Tr u e:1. Options參數(shù)O p e n方法的O p t i o n s參數(shù)允許指定命令文本內(nèi)容。它可以是以下C o m m a n d Ty p e E n
19、u m常數(shù)之一: adCmdTe x t:文本命令,比如S Q L字符串。 adCmdTa b l e:表名。 adCmdStoredProc:存儲(chǔ)過程名。 adCmdFile:保存的記錄集的文件名。 adCmdTa b l e D i r e c t:表名。 adCmdURLBind:U R L地址O p t i o n s參數(shù)可以是以上常數(shù)中的任一個(gè),但也可以加入下列E x e c u t e O p t i o n E n u m常數(shù): adAsyncExcute:異步地執(zhí)行命令。 adAsyncFetch:取得初始的行集后,異步地獲取剩下的行。 a d A s y n c F e t
20、c h N o n B l o c k i n g:除了獲取記錄不阻止命令運(yùn)行以外,其他與a d A s y n c F e t c h相似。 adExecuteNoRecords:命令不返回任何記錄。為了加入這些選項(xiàng)之一,可以使用O r符號(hào)(等同于加號(hào)“+”)adcmdStoredProc Or adExecuteNoRecords2. 在記錄集中移動(dòng)一旦打開了一個(gè)記錄集,經(jīng)常需要遍歷每一條記錄。這需要使用E O F屬性。當(dāng)?shù)竭_(dá)記錄集的末尾時(shí),E O F就變?yōu)門r u e,因此可以這樣創(chuàng)建一個(gè)循環(huán):Rsauthors.Open “Authors”,StrconnWhile Not Rsaut
21、hors.EofResponse.Write Rsauthors(“Au_Lname”) & “,” & Rsauthors(“Au_Fname”) & “<Br>”Rsauthors.MovenextWend如果記錄集允許向后移動(dòng),則可以使用M o v e P r e v i o u s方法。在這種情況下,循環(huán)中需要檢測B O F屬性值。另外分別還有移動(dòng)到第一條和最后一條記錄的M o v e F i r s t和M o v e L a s t方法3. 使用F i e l d s集合F i e l d s集合包含記錄集中每一字段(列)的F i e l d s
22、對象。F i e l d s集合是記錄集的缺省集合,因此在訪問字段時(shí)可以省略,就如同上面的W h i l e.We n d例子中的情況。因此,有多種訪問字段的方法:Rsauthors.Fields(“Au_Lname”).ValueRsauthors(“Au_Lname”).ValueRsauthors(1).ValueRsauthors.Fields(1).Value可以使用字段名,或使用它在集合中的位置。使用名字是最好的,因?yàn)檫@樣將使代碼更易于維護(hù)。Va l u e屬性是字段的缺省屬性,因此也可以省略,比如:rsAuthors(“au_lname”)如果想遍歷所有字段,可以使用For Ea
23、ch結(jié)構(gòu):For Each Fld In Rsauthors.FieldsResponse.Write Fld.Name & “:” & Fld.Value & “<BR>”Next這個(gè)例子將打印每一個(gè)字段的名字和值。4. 書簽當(dāng)在記錄集中移動(dòng)時(shí),可能需要保留記錄的位置,以后再移回來。同真實(shí)的書簽相似,一個(gè)記錄集書簽是一個(gè)指向單個(gè)記錄的唯一的指針。為了使用書簽,只需將B o o k m a r k屬性值賦予一個(gè)變量:var bkmk=rsAuthors.Bookmark然后,可以在記錄集中移動(dòng),以后可以通過相反的命令將記錄移到做過書簽標(biāo)記的相應(yīng)記錄上:Rsa
24、uthors.Bookmark=Varbkmk5. 支持的功能如上所述,并非所有的記錄集都支持書簽。還有許多其他的記錄集選項(xiàng)也不是被所有的提供者或記錄集類型支持的,因此可以用S u p p o r t s方法驗(yàn)證一下。S u p p o r t s方法使用一個(gè)或多個(gè)C u r s o r O p t i o n E n u m值作為參數(shù),返回Tr u e或F a l s e表明是否支持該選項(xiàng)。過濾記錄集過濾是一種暫時(shí)地限定記錄集中可見記錄的一種方法。如果僅顯示記錄集中的某些記錄,但又不需要每次都重新查詢數(shù)據(jù)庫,這種方法非常有用。1. 使用條件過濾F i l t e r屬性擁有多個(gè)參數(shù),其中一個(gè)
25、就是條件表達(dá)式,它非常像S Q L中W h e r e字句:rsAuthors.Filter=”state=ca”這個(gè)語句限定記錄集只顯示州名為c a的記錄。使用這個(gè)過濾條件將使當(dāng)前指針回到第一條匹配記錄上。可以遍歷記錄集中的全部記錄,并且只有匹配條件的記錄才可見。不僅僅限于單一條件,還可以使用A n d或O r把多個(gè)條件連接在一起:rsAuthors.Filetr=”au_lname=Homer or au_lname=Francis”這將過濾出姓為F r a n c i s或H o m e r的記錄。上面的例子顯示了一個(gè)列匹配一個(gè)值的過濾方法,也可以使用下面操作符中的任何一種:< :
26、小于。> :大于。<= :小于等于。>= :大于等于。<> :不等于。LIKE :通配符。當(dāng)使用通配符操作時(shí),可以使用“ *”或“%”符號(hào)。例如:rsAuthors.Filter=”au_lname LINK Ho%”“*”或“%”作為一個(gè)通配符,匹配任何字符,因此上面的例子會(huì)匹配a u _ l n a m e字段中以“H o”字符開始的所有記錄??梢允褂每兆址蹇者^濾條件,這樣將顯示全部記錄:rsAuthors.Filter=”2. 使用常數(shù)過濾F i l t e r屬性也能用F i l t e r G r o u p E n u m常數(shù)作為其參數(shù) adFil
27、terNone:清空當(dāng)前過濾條件,與使用一個(gè)空字符串的效果相同。 a d F i l t e r P e n d i n g R e c o r d s:只顯示那些已改變的,但還沒有送到服務(wù)器的記錄,只在成批更新模式下可用。 a d F i l t e r A ff e c t e d R e c o r d s:只顯示那些受上一次調(diào)用D e l e t e、R e s y n c、U p d a t e B a t c h和C a n c e l B a t c h方法影響的記錄。 a d F i l t e r F e t c h e d R e c o r d s:顯示高速緩存中的記錄,
28、即上一次調(diào)用讀取記錄的命令時(shí)的結(jié)果。 adFilterConflictingRecords:顯示在上一次成批更新中更新失敗的記錄。3. 使用書簽過濾最后一種過濾記錄集的方法是使用一個(gè)書簽數(shù)組??梢允褂眠@個(gè)技術(shù)創(chuàng)建一個(gè)記錄列表,然后再應(yīng)用一個(gè)過濾條件對其過濾。例如:rsAuthors.Open authors,strconn,adopenkeyset,adlockreadonly,adcmdtabledirect保存書簽avarbkmk(0)=rsAuthors.bookmarkrsauthors.movenextrsauthors.movenext保存書簽avarbkmk(1)=rsautho
29、rs.bookmarkrsauthors.movelastavarbkmk(2)=rsauthors.bookmark應(yīng)用過濾rsquthors.filter=array(avarbkmk(0),avarbkmk(1),avarbkmk(2)while not rsauthors.eof response.write rsauthors(“au_lname”) & “<BR>” rsauthors.movenextwend當(dāng)循環(huán)至記錄集末尾位置時(shí),會(huì)發(fā)現(xiàn)只有三條記錄,因?yàn)橹挥腥齻€(gè)書簽應(yīng)用于過濾條件注意,不能直接使用數(shù)組a v a r B k m k,必須使用A r r a
30、y函數(shù)將各個(gè)書簽轉(zhuǎn)換成不同的數(shù)組。查找記錄查找單個(gè)的記錄由F i n d方法來完成。它類似于使用條件的過濾方法:rsAuthors.Find “au_lname=lloyd”它們之間最主要的區(qū)別在于這種方法只能有一個(gè)條件,不允許使用A n d或O r??梢允褂每蛇x的參數(shù)指定一些額外的選項(xiàng),其完整的語法如下:recordset.find criteria,skiprows,searchdirection,startS k i p R o w s是一個(gè)數(shù)字,表示在開始查找記錄前跳過的行數(shù)。缺省為0,查詢從當(dāng)前行開始。S e a r c h D i r e c t i o n可以是a d S e a
31、 r c h F o r w a d,表示向前搜索記錄;或者a d S e a r c h B a c k w a r d,表示向后搜索記錄。S t a r t是一個(gè)書簽,指出開始查找記錄的位置。如果找到相應(yīng)的記錄,當(dāng)前指針將位于匹配的記錄上,如果沒有找到記錄,那么將位于下面兩個(gè)位置中的一個(gè): 如果是向前搜索,則位于記錄集末尾位置的后面, E O F被設(shè)置為Tr u e。 如果是向后搜索,則位于記錄集開始位置的前面, B O F被設(shè)置為Tr u e。如果沒有找到相應(yīng)的記錄,記錄的重新定位可以由書簽輕松解決,因?yàn)榭梢詾楫?dāng)前位置制作書簽,如果在查找記錄過程中沒有找到所需的記錄,那么再移回到上次保存
32、的位置。例如:保存當(dāng)前記錄號(hào)varbkmk=rsauthors.bookmark查找記錄rsauthors.find “au_lname=sussman”是否找到if not rsauthors.EOF thenresponse.write “Found:” & rsAuthors(“au_lname”) & “,” & rsauthors(“au_fname”) & “<BR>”ElseResponse.write “Not found.<BR>”Rsauthors.bookmark=varbkmkend if使用F i l t e r
33、屬性強(qiáng)于F i n d方法的一個(gè)原因是F i n d語句只能指定一個(gè)查詢條件,而F i l t e r屬性允許指定多個(gè)條件。也就是說,當(dāng)想要查找的字段條件不止一個(gè)時(shí),不能使用F i n d方法。然而,可以先過濾記錄,如果找到記錄可以再刪除過濾條件修改記錄可以設(shè)置除了a d L o c k R e a d O n l y之外的鎖定類型,配合使用R e c o r d s e t對象的方法去修改數(shù)據(jù)(假定有相應(yīng)的權(quán)限)。記住,缺省的鎖定類型是只讀的。1. 添加記錄要在記錄集中添加記錄,使用A d d N e w方法。有兩種使用A d d N e w的方法。第一種沒有任何參數(shù),僅僅調(diào)用A d d N
34、 e w,在記錄集的最后添加一個(gè)空記錄。在調(diào)用U p d a t e方法保存所做的更改之前,可以隨意地修改字段中的數(shù)據(jù):with rsauthors .open “authors”,strconn,adopendynamic,adlockoptimistic,adcmdtabledirect .addnew.fields(“au_id”)=”123-12-1234”.fields(“au_lname”)=”Lloyd”.fields(“au_fname”)=”Janine”.fields(“contract”)=0 .updateend with這只是添加了一條新紀(jì)錄,設(shè)置四個(gè)強(qiáng)制型的字段值。
35、另一種方法是使用A d d N e w方法的可選參數(shù),這是兩個(gè)數(shù)組,一個(gè)是字段名,另一個(gè)是字段的值。With rsauthors .open “authors”,strconn,adopendynamic,adlockoptimistic,adcmdtabledirect .addnew array(“au_id”,”au_lname”,”au_fname”,”contract”), array(“123-12-1234”,”Lloyd”,”Janine”,0)end with這個(gè)方法不需要調(diào)用U p d a t e方法。2. 編輯記錄編輯記錄與添加記錄的方法相似,不同之處在于不需要調(diào)用A d
36、 d N e w方法:strSQL=”SELECT * FROM authors WHERE au_lname=Lloyd”width rsAuthors .open strSQL,strconn,adopendynamic,adlockoptimistic,adcmdtext .fields(“contract”)=1 .updateend with這僅僅是將當(dāng)前記錄(在這種情況下是第一條記錄,因?yàn)閯倓偞蜷_記錄集)的c o n t r a c t字段的值賦為1。3. 刪除記錄刪除記錄需調(diào)用D e l e t e方法。刪除哪一條記錄取決于可選的參數(shù),可以是下面A ff e c t E n u
37、m常數(shù)中的一個(gè): adAff e c t C u r r e n t:刪除當(dāng)前記錄,缺省操作。 adAff e c t G r o u p:刪除匹配當(dāng)前過濾條件的所有記錄。 adAf f e c t A l l:刪除記錄集中的全部記錄。 adAf f e c t A l l C h a p t e r s:刪除所有段( c h a p t e r )中的記錄。最簡單的調(diào)用形式是:rsAuthors.Delete這將刪除當(dāng)前記錄。如果有一個(gè)過濾條件,并想刪除所有匹配該條件的記錄,那么僅需加上適當(dāng)?shù)某?shù)rsAuthors.Delete adAffectGroup4. 自動(dòng)遞增的字段當(dāng)添加一條新記錄
38、時(shí),一般會(huì)碰到這樣一個(gè)問題:如何處理那些自動(dòng)遞增的或標(biāo)識(shí)字段(Identity Filed)。這些字段是由服務(wù)器自動(dòng)更新的數(shù)字字段,一般用于為每一行提供一個(gè)唯一的字段值。當(dāng)數(shù)據(jù)庫含有多個(gè)表時(shí),那么這個(gè)唯一的字段經(jīng)常被當(dāng)作關(guān)聯(lián)表的外鍵。所以,添加一條新記錄時(shí),經(jīng)常需要找出它們的值。例如,考慮一下有兩個(gè)字段的表,一個(gè)自動(dòng)遞增的I D字段(SQL Server中的I D E N T I T Y字段或A c c e s s中的A u t o N u m b e r字段),一個(gè)字段名為N a m e的文本字段。現(xiàn)在考慮一下下面的向表中添加記錄的代碼:With Rsdata .Open “Tbltest”
39、,Adopendynamic,Adlockoptimistic,Adcmdtabledirect .Addnew .Fields(“Name”)=”Janine” .Update Intid=.Fields(“ID”)End With管理錯(cuò)誤Errors集合E r r o r s集合包含由單個(gè)A D O命令的執(zhí)行而引起的每一個(gè)錯(cuò)誤的E r r o r對象。使用E r r o r s集合的原因是由于在一個(gè)命令的執(zhí)行過程中,可能會(huì)引起多個(gè)錯(cuò)誤, OLE DB提供者需要提供一種方式通知客戶方已有多個(gè)錯(cuò)誤發(fā)生。關(guān)于E r r o r s集合有兩個(gè)重要的地方需要注意: 每次執(zhí)行A D O命令,如果發(fā)生錯(cuò)
40、誤,就清空錯(cuò)誤集,同時(shí)代之以新的錯(cuò)誤內(nèi)容。當(dāng)然,如果沒有錯(cuò)誤發(fā)生, E r r o r s集合不會(huì)受到影響。所以,即使A D O命令成功執(zhí)行,這個(gè)集合中也可能含有錯(cuò)誤信息。 OLE DB提供者可能會(huì)將包含信息的消息或警告裝入E r r o r s集合,錯(cuò)誤號(hào)為0。所以不能只檢查集合中的錯(cuò)誤號(hào)而假定錯(cuò)誤已經(jīng)發(fā)生。比如,使用O D B C提供者與SQL Server連接,可能會(huì)得到一個(gè)“錯(cuò)誤”,告知缺省的數(shù)據(jù)庫已經(jīng)被改變了。如果回頭看一下本章開始講到的對象模型,可能會(huì)發(fā)現(xiàn)E r r o r s集合只能由C o n n e c t i o n對象訪問。讀者可能會(huì)覺得奇怪,如果不顯式地創(chuàng)建一個(gè)C o
41、n n e c t i o n對象,如何訪問E r r o r s集合?R e c o r d s e t對象有一個(gè)A c t i v e C o n n e c t i o n屬性,含有當(dāng)前記錄集的C o n n e c t i o n對象,這意味著可以這樣得到E r r o r s集合:rsAuthors.ActiveConnection.Errors如果想看發(fā)生的全部錯(cuò)誤,則需要遍歷整個(gè)E r r o r s集合:for each errAuthors In rsAuthors.ActiveConnection.Errors display errornext為了顯示一些合理的錯(cuò)誤信息,
42、需要確切地知道在E r r o r s集合中到底有些什么。屬性說明N u m b e rA D O錯(cuò)誤號(hào)N a t i v e E r r o r從數(shù)據(jù)提供者獲得的錯(cuò)誤號(hào)S Q L S t a t e連接到S Q L數(shù)據(jù)庫時(shí), 5位的S Q L狀態(tài)代碼S o u r c e引起錯(cuò)誤的對象D e s c r i p t i o n 錯(cuò)誤說明文本這意味著循環(huán)過程現(xiàn)在可以變成這樣:For Each Errauthors In Rsauthors.Activeconnection.Errors Response.Write “Number:” & Errauthors.Number &
43、_ “<BR>Nativeerror:” & Errauthors.Nativeerror &_ “<BR>Sqlstate:” & Errauthors.Sqlstate &_ “<BR>Source:” & Errauthors.Source & _ “<BR>Description:” & Errauthors.Description & “<P>”NextASP頁面中的A D O錯(cuò)誤在第4、7章,我們研究了A S P的錯(cuò)誤,以及如何簡潔并徹底地處理這些錯(cuò)誤。ASP
44、 3.0的一個(gè)新特征就是自定義錯(cuò)誤頁面,但這對于A D O確實(shí)用處不大,因?yàn)槟_本中的變量無法傳入自定義的錯(cuò)誤頁面。這就意味著我們無法檢測E r r o r s集合。,但是V B S c r i p t對于錯(cuò)誤的處理仍然有許多不足。目前,最好的檢測錯(cuò)誤的方法是使用On Error Resume Next語句,然后在可能會(huì)引起錯(cuò)誤的每一行A D O代碼后檢查E r r o r s集合。就像這樣:<% On Error Resume Next Dim Rsauthors Dim Strsql Set Rsauthors=Server.Createobject(“ADODB.Recordset”
45、) Strsql=”SELECT * From Authors” Rsauthors.Open Strsql,Strconn,Adopendynamic,Adlockoptimistic,Adcmdtext檢查是否有錯(cuò)誤,如果沒有,則顯示出記錄 If Checkforerrors(Rsauthors.Activeconnection)=False Then While Not Rsauthors.EOF Response.Write Rsauthors(“Au_Lname”) & “,” & Rsauthors(“Au_Fname”) * “<BR>” Wend E
46、nd If Rsauthors.Close Set Rsauthors=Nothing%>這里可使用Checkforerrors子程序來檢測是否有錯(cuò)誤發(fā)生Function Checkforerrors(Objconn) Dim Objerror 錯(cuò)誤對象 If Objconn.Errors.Count>0 Then 循環(huán)顯示錯(cuò)誤信息 For Each Objerror In Objconn.Errors If Objerror.Number<>0 Then 用表格形式顯示錯(cuò)誤 代碼省略 Checkforerrors=True End If NextElse Checkf
47、orerror=FalseEnd IfEnd Function 這并不是一個(gè)技術(shù)含量較高的解決方案,但確實(shí)是用V B S c r i p t所能做到的最好的解決方案。真正的不足是必須自己檢測錯(cuò)誤。連接、命令和過程Connection對象C o n n e c t i o n對象是為我們與數(shù)據(jù)存儲(chǔ)提供連接的對象,但這并非C o n n e c t i o n對象的全部功能。除了存儲(chǔ)連接的細(xì)節(jié)外(比如數(shù)據(jù)存儲(chǔ)的類型,以及其支持的特性),也可以利用C o n n e c t i o n對象運(yùn)行命令。這些命令可能是查詢動(dòng)作,比如更新、插入或刪除操作,也可以是返回一個(gè)記錄集的命令。讀者可能會(huì)覺得奇怪:既
48、然有了R e c o r d s e t對象,這又有什么用?這正是A D O的靈活性所在,可以根據(jù)當(dāng)前的情況,以及對當(dāng)前任務(wù)的適用性選擇使用任一種對象。從C o n n e c t i o n對象運(yùn)行的命令一般是查詢動(dòng)作,但了解能夠得到返回的記錄集也是非常有用的。返回一個(gè)記錄集為了從C o n n e c t i o n對象返回一個(gè)記錄集,要使用E x e c u t e方法。語法是:Connection.Execute CommandText, RecordsAffected, Options參數(shù)及說明如下表所示:參 數(shù)說 明C o m m a n d s Te x執(zhí)行的命令文本。與R e
49、c o r d s e t的O p e n方法中的S o u r c e參數(shù)相同,也能代表一個(gè)現(xiàn)有的C o m m a n d對象R e c o r d s A ff e c t e d受命令執(zhí)行影響的記錄數(shù)O p t i o n命令選項(xiàng),可以是一個(gè)或多個(gè)C o m m a n d Ty p e E n u m或E x e c u t e O p t i o n E n u m常數(shù),詳細(xì)的值請見上一Execute方法可選擇地返回一個(gè)記錄集,在這種情況下只要將返回值賦給記錄集變量。例如:Set conpubs=server.CreateObject(“ADODB.Connection”)Conp
50、ubs.Open strConnSet rsauthors=Conpubs.Execute(“authors”)讀者可能會(huì)奇怪使用C o n n e c t i o n對象的E x e c u t e方法與使用R e c o r d s e t對象的O p e n方法之間到底有什么區(qū)別?看上去區(qū)別不是很大,使用R e c o r d s e t對象的O p e n方法可以改變光標(biāo)類型和鎖定類型。這些選項(xiàng)對于C o n n e c t i o n對象的E x e c u t e方法是不可用的,因此永遠(yuǎn)只能得到一個(gè)只能前移的、只讀的記錄集。操作命令如果正在運(yùn)行操作命令,比如一個(gè)SQL UPDAT
51、E語句,那么可以使用R e c o r d s A ff e c t e d參數(shù)找出有多少條記錄受到該命令的影響。例如:Dim strSQL As StringDim lngrecs As LongStrSQL=”UPDATE titles SET price=price * 1.1 WHERE type=”business”Conpubs.Execute strSQL,lngrecs,adCMDtextResponse.Write lngRecs & “records whrer updated.”上述代碼將所有類型為B u s i n e s s的書的單價(jià)增加了1 0 %。一旦E
52、x e c u t e命令執(zhí)行完畢,受U p d a t e命令影響的記錄數(shù)就返回到變量l n g R e c s中,這就是R e c o r d s A ff e c t e d參數(shù)。注意,已經(jīng)為命令指定了a d C m d Te x t選項(xiàng),告訴A D O C o m m a n d Te x t參數(shù)是一個(gè)文本命令。一般這不是嚴(yán)格必須的,其目的只是讓A D O預(yù)先知道執(zhí)行的命令屬于何種類型,這樣能夠提高性能。記住,這個(gè)值可以是一個(gè)或多個(gè)C o m m a n d Ty p e E n u m值。無記錄集返回如果上面的例子不返回記錄集,那么在E x e c u t e語句中加入另一個(gè)選項(xiàng)也是
53、較好的方法:conpubs.Execute strSQL,lngRecs,adCmdText+adExecuteNorecords使用a d E x e c u t e N o R e c o r d s告訴A D O執(zhí)行的命令不返回任何記錄。所以, A D O不必費(fèi)心去創(chuàng)建一個(gè)記錄集。如果省略了該選項(xiàng),那么A D O將會(huì)創(chuàng)建一個(gè)空的記錄集,很明顯這浪費(fèi)了時(shí)間,因此加上這個(gè)選項(xiàng)將會(huì)加快語句的執(zhí)行。Command對象C o m m a n d對象特定地為處理各種類型的命令而設(shè)計(jì),特別是那些需要參數(shù)的命令。與C o n n e c t i o n對象相似, C o m m a n d對象可以運(yùn)行返
54、回記錄集和不返回記錄集兩種類型的命令。實(shí)際上,如果命令不含有參數(shù),那么它并不關(guān)心是使用C o n n e c t i o n對象,還是C o m m a n d對象,還是R e c o r d s e t對象返回記錄集對于一個(gè)返回記錄集的命令,可使用E x e c u t e方法。然而,與C o n n e c t i o n對象不同,必須使用C o m m a n d Te x t屬性,而不能在E x e c u t e方法中使用命令文本。Set cmdAuthors=Server.CreateObject(“ADODB.Command”)cmdAuthors.CommandText=”Au
55、thors”Set rsAuthors=cmdAuthors.Execute這是告訴C o m m a n d對象去執(zhí)行一個(gè)簡單的、返回一個(gè)只讀記錄集的命令的最簡便方法。E x e c u t e方法也有一些可選參數(shù),如表9 - 2所示。參數(shù)說明R e c o r d s A ff e c t e d受命令影響的記錄數(shù)P a r a m e t e r s參數(shù)值數(shù)組O p t i o n s 命命令選項(xiàng),與R e c o r d s e t的O p e n方法中的O p t i o n s選項(xiàng)相似參數(shù)R e c o r d s A ffected 與O p t i o n s同前面解釋的一樣,
56、另外也可以使用C o m m a n d Ty p e屬性設(shè)置命令類型:Set cmdAuthors=Server.CreateObject(“ADODB.Command”)cmdAuthors.CommandText=”Authors”cmdAuthors.CommandType=adCmdTableSet rsAuthors=cmdAuthors.Execute如果不設(shè)置其他參數(shù),也可以在E x e c u t e行上設(shè)置,必須為它們使用逗號(hào):Set rsAuthors=cmdAuthors.Execute(,adCmdTable)改變光標(biāo)類型值得注意是,使用E x e c u t e方法返回的記錄集具有缺省的光標(biāo)和鎖定類型。這意味著這是只能前移的、只讀的記錄集。雖然使用E x e c u t e方法不能改變這種情況,但對這個(gè)問題有一個(gè)解決的方法。如果需要使用一個(gè)命令,并且要求不同的光標(biāo)和鎖定類型,那么應(yīng)該使用R e c o r d s e t的O p e n方法,此時(shí)C o m m a n d對象作為R e c o r d s e t的數(shù)據(jù)源。例如:cmdAuthros.ActiveConnection=strConncmdAuthors.CommandText=”Authors”cmdAmandType=adCmdTablers
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年電子啟動(dòng)開關(guān)項(xiàng)目可行性研究報(bào)告
- 2025年電動(dòng)調(diào)節(jié)閥控制箱項(xiàng)目可行性研究報(bào)告
- 2025年甲肝病毒檢測試劑盒項(xiàng)目可行性研究報(bào)告
- 2025年環(huán)型壺項(xiàng)目可行性研究報(bào)告
- 溫州肯恩大學(xué)《有機(jī)化學(xué)A(上)》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西服裝學(xué)院《論文寫作基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江省紹興市新昌中學(xué)2025年高三第三次調(diào)研測試物理試題含解析
- 云南省文山州硯山縣一中2025年高三(實(shí)驗(yàn)班)第三次質(zhì)檢英語試題含解析
- 寧波職業(yè)技術(shù)學(xué)院《寫作(二)》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇省興化市顧莊學(xué)區(qū)重點(diǎn)名校2025年初三語文試題3月診斷性測試一模試題含解析
- 足療消防安全培訓(xùn)
- 陣發(fā)性室性心動(dòng)過速的護(hù)理課件
- 高考地理一輪復(fù)習(xí)課件哭泣的咸海主題探究中亞
- 六年級(jí)簡便計(jì)算課件
- 6.1 豐富多彩的世界體育
- RoHS 申明格式-個(gè)人用
- VDA6.3-2016過程審核對應(yīng)的資料
- 部編版語文五年級(jí)下冊第八單元測試卷5套(含答案)
- 新媒體運(yùn)營(用戶運(yùn)營內(nèi)容運(yùn)營活動(dòng)運(yùn)營產(chǎn)品運(yùn)營社群運(yùn)營)PPT完整全套教學(xué)課件
- 住宅樓屋面工程策劃方案講解圖文豐富
- 中國暈厥診斷與治療專家共識(shí)(更新)
評(píng)論
0/150
提交評(píng)論