ODBC數(shù)據(jù)源創(chuàng)建配置文檔_第1頁
ODBC數(shù)據(jù)源創(chuàng)建配置文檔_第2頁
ODBC數(shù)據(jù)源創(chuàng)建配置文檔_第3頁
ODBC數(shù)據(jù)源創(chuàng)建配置文檔_第4頁
ODBC數(shù)據(jù)源創(chuàng)建配置文檔_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、ADO使用詳解Connection對象C o n n e c t i o n對象是使我們能與數(shù)據(jù)存儲相連的對象。只有C o n n e c t i o n對象才能指定希望使用的OLE DB提供者、連接到數(shù)據(jù)存儲的安全細(xì)節(jié)以及其他任何連接到數(shù)據(jù)存儲特有的細(xì)節(jié)。不必顯式創(chuàng)建一個C o n n e c t i o n對象以連接到數(shù)據(jù)存儲。沒有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將會隱含地為你創(chuàng)建一個C o n n e c

2、 t i o n對象。如果要對提供者運行多條命令,應(yīng)該顯式地創(chuàng)建一個C o n n e c t i o n對象,這比每運行一條命令就創(chuàng)建一個連接更有效。除了為數(shù)據(jù)存儲提供連接以外, C o n n e c t i o n對象允許針對數(shù)據(jù)存儲執(zhí)行命令操作。這些命令可以是結(jié)構(gòu)化的或存儲的命令(例如,S Q L命令或一個存儲過程),并且可以有選擇地從數(shù)據(jù)存儲中返回一些數(shù)據(jù)。Command對象C o m m a n d 對象是對數(shù)據(jù)存儲執(zhí)行命令的對象。看到這里讀者可能會產(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對象中運行一條命令時,已經(jīng)隱含地創(chuàng)建了一個C o m m a n d對象。有時其他對象允許向命令傳入?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中使用最為普遍的對象,因為它含有從數(shù)據(jù)存儲中提取的數(shù)據(jù)集。我們經(jīng)常運行不返回數(shù)據(jù)的命令,比如那些增加或更新數(shù)據(jù)的命令,但在大多數(shù)情況下很有可能會取得一系列記錄。R e c o r d s e t對象是擁有這些記錄的對象??梢愿?增加、更新和刪除)記錄集中的記錄,上下移動記錄,過濾記錄并只顯示部分內(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集合中有記錄集中每一個字段(列)的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ù)存儲連接字符串連接字符串依賴于提供者,因為每個數(shù)據(jù)提供者可能需要不同的細(xì)節(jié)。值得注意的重要一點是, O D B C的OLE DB提供者是缺省的,所以,如果不使用Provide = 部分,系統(tǒng)將自動地使用O D B C。下面為不同的提供者列舉了連接字符串的例子,在本書的后面將會看到更多的例子。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目錄下。雖然讀者可能會嘗試將數(shù)據(jù)庫作為We b文件存放于相同的目錄下,但不要這樣做,否則任何人都可以下載整個數(shù)據(jù)庫文件。將數(shù)據(jù)庫存放于We b目錄外永遠(yuǎn)是明智的,沒有人可以從外面訪問該文件。使用包含文件可以將創(chuàng)建connect對象的語法寫入一個asp文件,然后用包含文件的語句將其放入所需要的文件中,例<!- #INCLUDE FILE=”Connect.

7、asp”>這樣不必再為每個A S P頁面都輸入連接細(xì)節(jié),同時方便于更改整個站點都使用的連接。包含文件也是放置M E TA D ATA標(biāo)簽的好地方。使用連接狀態(tài)將連接字符串存入應(yīng)用程序變量是一個常用的技巧,同使用一個包含文件一樣有效。例如,可以在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é)的字符串??梢允荗DBC DSN的名稱、數(shù)據(jù)鏈接文件的名稱或真實的連接細(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,指定異步地建立連接。忽略這個參數(shù),則建立一個同步連接連接的例子下面是幾個示例,這里假定s t r C o n n包含一個有效的連接字符串。為了打開一個連接,使用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這兩種實現(xiàn)方法之間沒有什么區(qū)別,如果使用前一種方法來實現(xiàn)連接, C o n n e t i o n S t r i n g屬性同時也被賦值。值得注意的是,一旦與數(shù)據(jù)存儲建立了連接, A D O可能會改變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ù)如何保存和處理很重要,因為這為選擇使用哪種記錄集提供了更多的參考。記錄集有不同的類型,在一些細(xì)小的地方存在著差異,很容易造成失誤。首先需要認(rèn)真談?wù)摰氖枪鈽?biāo)的概念。光標(biāo)光標(biāo)用來管理記錄集和記錄集的當(dāng)前位置能用光標(biāo)做什么是由光標(biāo)的類型決定的1. 光標(biāo)類型光標(biāo)的類型標(biāo)識了光標(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、就固定了。其他用戶對記錄的更改、添加和刪除都是不可見的。允許在記錄集中向前、向后移動。 只許前移( a d O p e n F o r w a r d O n l y )。缺省的光標(biāo)類型,除了只允許向前移動外,其余的與靜態(tài)光標(biāo)相同。 動態(tài)( a d O p e n D y n a m i c )。動態(tài)的光標(biāo)沒有固定的記錄集。其他用戶的更改、添加或刪除操作在記錄集中是可見的。允許在記錄集中向前、向后移動。 鍵集( a d O p e n K e y s e t )。鍵集類型的光標(biāo)除了記錄集是固定的,其余的與動態(tài)光標(biāo)相似??梢钥吹狡渌脩舻男薷?,但新記錄卻不可見。如果別的用戶刪除了記錄,那么這些記

13、錄在記錄集中將會變得不可訪問。這項功能是通過標(biāo)識記錄集的鍵來實現(xiàn)的,所以鍵一直保留著,即使改變或刪除記錄。鎖定鎖定就是如何確保數(shù)據(jù)的完整性,確保更改不會被覆蓋。我們需要避免的典型情況是多次更新,比如一個用戶改動了一些數(shù)據(jù),接著另一個用戶立即又將其做了修改。為了對這種情況加以保護(hù),要鎖定記錄,有許多不同的方法可以保證記錄得到保護(hù)??赏ㄟ^鎖定類型來設(shè)置這些方法。1. 鎖定類型鎖定類型決定更新記錄時記錄是否或如何被鎖定。有四種類型的鎖定: 只讀( 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ù)據(jù)提供者將嘗試鎖定記錄以確保成功地編輯記錄。只要編輯一開始,則立即鎖住記錄。 樂觀的( a d L o c k O p t i m i s t i c ):直到用U p d a t e方法提交更新記錄時才鎖定記錄。 批量樂觀的( a d L o c k B a t c h O p t i m i s t i c ):允許修改多個記錄,只有調(diào)用U p d a t e B a t c h方法后才鎖定記錄。當(dāng)不需要改動任何記錄時,應(yīng)該使用只讀的記錄集,這樣提供者不用做任何檢測。對于一般的使用,樂觀的鎖定可能是最好的選擇,因為記錄只被鎖定一小段時間,數(shù)

15、據(jù)在這段時間被更新。這減少了資源的使用。悲觀的鎖定提高了數(shù)據(jù)的完整性,但卻是以犧牲并發(fā)性為代價的。并發(fā)性是許多用戶在同一時間查閱數(shù)據(jù)的能力。鎖定的記錄對其他用戶是不可見的,因而數(shù)據(jù)的并發(fā)性降低了。樂觀的鎖定只在一小段時間內(nèi)鎖定記錄,所以增強了數(shù)據(jù)的并發(fā)性,但同時其他用戶修改數(shù)據(jù)的幾率也增加了。創(chuàng)建記錄集創(chuàng)建一個記錄集十分容易,通過調(diào)用R e c o r d s e t對象的O p e n方法來實現(xiàn):Recordset.Open Source,Activeconnection,Cursortype,Locktype,Options其參數(shù)及說明如表所示參數(shù)說明S o u r c e數(shù)據(jù)源。可以是數(shù)

16、據(jù)庫中的表名、存儲的查詢或過程、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記錄集使用的連接??梢允且粋€連接字符串或者一個打開的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注意,有幾個參數(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)前指針自動地位于第一條記錄上。如果在記錄集中沒有記錄,那么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:存儲過程名。 adCmdFile:保存的記錄集的文件名。 adCmdTa b l e D i r e c t:表名。 adCmdURLBind:U R L地址O p t i o n s參數(shù)可以是以上常數(shù)中的任一個,但也可以加入下列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:除了獲取記錄不阻止命令運行以外,其他與a d A s y n c F e t c h相似。 adExecuteNoRecords:命令不返回任何記錄。為了加入這些選項之一,可以使用O r符號(等同于加號“+”)adcmdStoredProc Or adExecuteNoRecords2. 在記錄集中移動一旦打開了一個記錄集,經(jīng)常需要遍歷每一條記錄。這需要使用E O F屬性。當(dāng)?shù)竭_(dá)記錄集的末尾時,E O F就變?yōu)門r u e,因此可以這樣創(chuàng)建一個循環(huán):Rsauthors.Open “Authors”,StrconnWhile Not Rsaut

21、hors.EofResponse.Write Rsauthors(“Au_Lname”) & “,” & Rsauthors(“Au_Fname”) & “<Br>”Rsauthors.MovenextWend如果記錄集允許向后移動,則可以使用M o v e P r e v i o u s方法。在這種情況下,循環(huán)中需要檢測B O F屬性值。另外分別還有移動到第一條和最后一條記錄的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集合是記錄集的缺省集合,因此在訪問字段時可以省略,就如同上面的W h i l e.We n d例子中的情況。因此,有多種訪問字段的方法:Rsauthors.Fields(“Au_Lname”).ValueRsauthors(“Au_Lname”).ValueRsauthors(1).ValueRsauthors.Fields(1).Value可以使用字段名,或使用它在集合中的位置。使用名字是最好的,因為這樣將使代碼更易于維護(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這個例子將打印每一個字段的名字和值。4. 書簽當(dāng)在記錄集中移動時,可能需要保留記錄的位置,以后再移回來。同真實的書簽相似,一個記錄集書簽是一個指向單個記錄的唯一的指針。為了使用書簽,只需將B o o k m a r k屬性值賦予一個變量:var bkmk=rsAuthors.Bookmark然后,可以在記錄集中移動,以后可以通過相反的命令將記錄移到做過書簽標(biāo)記的相應(yīng)記錄上:Rsa

24、uthors.Bookmark=Varbkmk5. 支持的功能如上所述,并非所有的記錄集都支持書簽。還有許多其他的記錄集選項也不是被所有的提供者或記錄集類型支持的,因此可以用S u p p o r t s方法驗證一下。S u p p o r t s方法使用一個或多個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表明是否支持該選項。過濾記錄集過濾是一種暫時地限定記錄集中可見記錄的一種方法。如果僅顯示記錄集中的某些記錄,但又不需要每次都重新查詢數(shù)據(jù)庫,這種方法非常有用。1. 使用條件過濾F i l t e r屬性擁有多個參數(shù),其中一個

25、就是條件表達(dá)式,它非常像S Q L中W h e r e字句:rsAuthors.Filter=”state=ca”這個語句限定記錄集只顯示州名為c a的記錄。使用這個過濾條件將使當(dāng)前指針回到第一條匹配記錄上。可以遍歷記錄集中的全部記錄,并且只有匹配條件的記錄才可見。不僅僅限于單一條件,還可以使用A n d或O r把多個條件連接在一起:rsAuthors.Filetr=”au_lname=Homer or au_lname=Francis”這將過濾出姓為F r a n c i s或H o m e r的記錄。上面的例子顯示了一個列匹配一個值的過濾方法,也可以使用下面操作符中的任何一種:< :

26、小于。> :大于。<= :小于等于。>= :大于等于。<> :不等于。LIKE :通配符。當(dāng)使用通配符操作時,可以使用“ *”或“%”符號。例如:rsAuthors.Filter=”au_lname LINK Ho%”“*”或“%”作為一個通配符,匹配任何字符,因此上面的例子會匹配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)前過濾條件,與使用一個空字符串的效果相同。 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)用讀取記錄的命令時的結(jié)果。 adFilterConflictingRecords:顯示在上一次成批更新中更新失敗的記錄。3. 使用書簽過濾最后一種過濾記錄集的方法是使用一個書簽數(shù)組。可以使用這個技術(shù)創(chuàng)建一個記錄列表,然后再應(yīng)用一個過濾條件對其過濾。例如: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)至記錄集末尾位置時,會發(fā)現(xiàn)只有三條記錄,因為只有三個書簽應(yīng)用于過濾條件注意,不能直接使用數(shù)組a v a r B k m k,必須使用A r r a

30、y函數(shù)將各個書簽轉(zhuǎn)換成不同的數(shù)組。查找記錄查找單個的記錄由F i n d方法來完成。它類似于使用條件的過濾方法:rsAuthors.Find “au_lname=lloyd”它們之間最主要的區(qū)別在于這種方法只能有一個條件,不允許使用A n d或O r。可以使用可選的參數(shù)指定一些額外的選項,其完整的語法如下:recordset.find criteria,skiprows,searchdirection,startS k i p R o w s是一個數(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是一個書簽,指出開始查找記錄的位置。如果找到相應(yīng)的記錄,當(dāng)前指針將位于匹配的記錄上,如果沒有找到記錄,那么將位于下面兩個位置中的一個: 如果是向前搜索,則位于記錄集末尾位置的后面, E O F被設(shè)置為Tr u e。 如果是向后搜索,則位于記錄集開始位置的前面, B O F被設(shè)置為Tr u e。如果沒有找到相應(yīng)的記錄,記錄的重新定位可以由書簽輕松解決,因為可以為當(dāng)前位置制作書簽,如果在查找記錄過程中沒有找到所需的記錄,那么再移回到上次保存

32、的位置。例如:保存當(dāng)前記錄號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、屬性強于F i n d方法的一個原因是F i n d語句只能指定一個查詢條件,而F i l t e r屬性允許指定多個條件。也就是說,當(dāng)想要查找的字段條件不止一個時,不能使用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,在記錄集的最后添加一個空記錄。在調(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è)置四個強制型的字段值。

35、另一種方法是使用A d d N e w方法的可選參數(shù),這是兩個數(shù)組,一個是字段名,另一個是字段的值。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這個方法不需要調(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)前記錄(在這種情況下是第一條記錄,因為剛剛打開記錄集)的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ù)中的一個: 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)前記錄。如果有一個過濾條件,并想刪除所有匹配該條件的記錄,那么僅需加上適當(dāng)?shù)某?shù)rsAuthors.Delete adAffectGroup4. 自動遞增的字段當(dāng)添加一條新記錄

38、時,一般會碰到這樣一個問題:如何處理那些自動遞增的或標(biāo)識字段(Identity Filed)。這些字段是由服務(wù)器自動更新的數(shù)字字段,一般用于為每一行提供一個唯一的字段值。當(dāng)數(shù)據(jù)庫含有多個表時,那么這個唯一的字段經(jīng)常被當(dāng)作關(guān)聯(lián)表的外鍵。所以,添加一條新記錄時,經(jī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字段),一個字段名為N a m e的文本字段?,F(xiàn)在考慮一下下面的向表中添加記錄的代碼:With Rsdata .Open “Tbltest”

39、,Adopendynamic,Adlockoptimistic,Adcmdtabledirect .Addnew .Fields(“Name”)=”Janine” .Update Intid=.Fields(“ID”)End With管理錯誤Errors集合E r r o r s集合包含由單個A D O命令的執(zhí)行而引起的每一個錯誤的E r r o r對象。使用E r r o r s集合的原因是由于在一個命令的執(zhí)行過程中,可能會引起多個錯誤, OLE DB提供者需要提供一種方式通知客戶方已有多個錯誤發(fā)生。關(guān)于E r r o r s集合有兩個重要的地方需要注意: 每次執(zhí)行A D O命令,如果發(fā)生錯

40、誤,就清空錯誤集,同時代之以新的錯誤內(nèi)容。當(dāng)然,如果沒有錯誤發(fā)生, E r r o r s集合不會受到影響。所以,即使A D O命令成功執(zhí)行,這個集合中也可能含有錯誤信息。 OLE DB提供者可能會將包含信息的消息或警告裝入E r r o r s集合,錯誤號為0。所以不能只檢查集合中的錯誤號而假定錯誤已經(jīng)發(fā)生。比如,使用O D B C提供者與SQL Server連接,可能會得到一個“錯誤”,告知缺省的數(shù)據(jù)庫已經(jīng)被改變了。如果回頭看一下本章開始講到的對象模型,可能會發(fā)現(xiàn)E r r o r s集合只能由C o n n e c t i o n對象訪問。讀者可能會覺得奇怪,如果不顯式地創(chuàng)建一個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對象有一個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ā)生的全部錯誤,則需要遍歷整個E r r o r s集合:for each errAuthors In rsAuthors.ActiveConnection.Errors display errornext為了顯示一些合理的錯誤信息,

42、需要確切地知道在E r r o r s集合中到底有些什么。屬性說明N u m b e rA D O錯誤號N a t i v e E r r o r從數(shù)據(jù)提供者獲得的錯誤號S Q L S t a t e連接到S Q L數(shù)據(jù)庫時, 5位的S Q L狀態(tài)代碼S o u r c e引起錯誤的對象D e s c r i p t i o n 錯誤說明文本這意味著循環(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錯誤在第4、7章,我們研究了A S P的錯誤,以及如何簡潔并徹底地處理這些錯誤。ASP

44、 3.0的一個新特征就是自定義錯誤頁面,但這對于A D O確實用處不大,因為腳本中的變量無法傳入自定義的錯誤頁面。這就意味著我們無法檢測E r r o r s集合。,但是V B S c r i p t對于錯誤的處理仍然有許多不足。目前,最好的檢測錯誤的方法是使用On Error Resume Next語句,然后在可能會引起錯誤的每一行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檢查是否有錯誤,如果沒有,則顯示出記錄 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子程序來檢測是否有錯誤發(fā)生Function Checkforerrors(Objconn) Dim Objerror 錯誤對象 If Objconn.Errors.Count>0 Then 循環(huán)顯示錯誤信息 For Each Objerror In Objconn.Errors If Objerror.Number<>0 Then 用表格形式顯示錯誤 代碼省略 Checkforerrors=True End If NextElse Checkf

47、orerror=FalseEnd IfEnd Function 這并不是一個技術(shù)含量較高的解決方案,但確實是用V B S c r i p t所能做到的最好的解決方案。真正的不足是必須自己檢測錯誤。連接、命令和過程Connection對象C o n n e c t i o n對象是為我們與數(shù)據(jù)存儲提供連接的對象,但這并非C o n n e c t i o n對象的全部功能。除了存儲連接的細(xì)節(jié)外(比如數(shù)據(jù)存儲的類型,以及其支持的特性),也可以利用C o n n e c t i o n對象運行命令。這些命令可能是查詢動作,比如更新、插入或刪除操作,也可以是返回一個記錄集的命令。讀者可能會覺得奇怪:既

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對象運行的命令一般是查詢動作,但了解能夠得到返回的記錄集也是非常有用的。返回一個記錄集為了從C o n n e c t i o n對象返回一個記錄集,要使用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ù)相同,也能代表一個現(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命令選項,可以是一個或多個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方法可選擇地返回一個記錄集,在這種情況下只要將返回值賦給記錄集變量。例如:Set conpubs=server.CreateObject(“ADODB.Connection”)Conp

50、ubs.Open strConnSet rsauthors=Conpubs.Execute(“authors”)讀者可能會奇怪使用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)類型和鎖定類型。這些選項對于C o n n e c t i o n對象的E x e c u t e方法是不可用的,因此永遠(yuǎn)只能得到一個只能前移的、只讀的記錄集。操作命令如果正在運行操作命令,比如一個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的書的單價增加了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選項,告訴A D O C o m m a n d Te x t參數(shù)是一個文本命令。一般這不是嚴(yán)格必須的,其目的只是讓A D O預(yù)先知道執(zhí)行的命令屬于何種類型,這樣能夠提高性能。記住,這個值可以是一個或多個C o m m a n d Ty p e E n u m值。無記錄集返回如果上面的例子不返回記錄集,那么在E x e c u t e語句中加入另一個選項也是

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不必費心去創(chuàng)建一個記錄集。如果省略了該選項,那么A D O將會創(chuàng)建一個空的記錄集,很明顯這浪費了時間,因此加上這個選項將會加快語句的執(zhí)行。Command對象C o m m a n d對象特定地為處理各種類型的命令而設(shè)計,特別是那些需要參數(shù)的命令。與C o n n e c t i o n對象相似, C o m m a n d對象可以運行返

54、回記錄集和不返回記錄集兩種類型的命令。實際上,如果命令不含有參數(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對象返回記錄集對于一個返回記錄集的命令,可使用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í)行一個簡單的、返回一個只讀記錄集的命令的最簡便方法。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 命命令選項,與R e c o r d s e t的O p e n方法中的O p t i o n s選項相似參數(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è)置,必須為它們使用逗號:Set rsAuthors=cmdAuthors.Execute(,adCmdTable)改變光標(biāo)類型值得注意是,使用E x e c u t e方法返回的記錄集具有缺省的光標(biāo)和鎖定類型。這意味著這是只能前移的、只讀的記錄集。雖然使用E x e c u t e方法不能改變這種情況,但對這個問題有一個解決的方法。如果需要使用一個命令,并且要求不同的光標(biāo)和鎖定類型,那么應(yīng)該使用R e c o r d s e t的O p e n方法,此時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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論