8.2.5 Stream對(duì)象 Stream對(duì)象用于訪問(wèn)節(jié)點(diǎn)的內(nèi)容,比如一個(gè)E-Mail消息,或一個(gè)Web頁(yè)面。利用Stream對(duì)象可以訪問(wèn)文件或資源的真實(shí)內(nèi)容。因此,結(jié)合Record和Recordset對(duì)象,不僅可以訪問(wèn)Web服務(wù)器上的文件或email消息,還可以訪問(wèn)相應(yīng)的內(nèi)容。這樣,就可以創(chuàng)建一個(gè)只使用ADO去訪問(wèn)郵件系統(tǒng)的郵件客戶(hù)。這也許不會(huì)有太多的優(yōu)點(diǎn),但意味著可不必了解郵件系統(tǒng)的API或?qū)ο竽P停瑴p少了學(xué)習(xí)上的彎路。 Stream的另一個(gè)用途是XML,可以訪問(wèn)一系列作為XML流的數(shù)據(jù)(結(jié)構(gòu)化或半結(jié)構(gòu)化)。 Stream對(duì)象用來(lái)處理二進(jìn)制數(shù)據(jù),所以,可以用來(lái)處理BLOB類(lèi)型的數(shù)據(jù),比如數(shù)據(jù)庫(kù)中的圖像或大文本數(shù)據(jù)。 同樣,在本書(shū)第11、12章中你會(huì)看到更多的有關(guān)Stream對(duì)象的例子。
8.2.6 集合 ADO對(duì)象庫(kù)中有一些集合,每個(gè)集合都有零個(gè)或更多個(gè)與其關(guān)聯(lián)的對(duì)象的拷貝。可以使用相同的代碼結(jié)構(gòu)去遍歷這些集合。 在VBScript中的語(yǔ)法是: For Each object In Collection ' Do something with object Next 例如,遍歷一個(gè)Recordset對(duì)象的Fields集: For Each objField In rs.Fields Response.Write objField.Name & "<BR>" Next 如果選擇JScript,那么可以使用Enumerator對(duì)象: for (objField = new Enumerator(rs.Fields); !objField.atEnd(); objField.moveNext()) Response.Write (objField.item().Name + '<BR>'); 1. Fields集合 Fields集合擁有與記錄集或記錄關(guān)聯(lián)的Field對(duì)象。對(duì)基于結(jié)構(gòu)化數(shù)據(jù)的記錄集,比如SQL數(shù)據(jù),字段相應(yīng)于數(shù)據(jù)中的列,并含有列的詳細(xì)內(nèi)容,比如名稱(chēng)、數(shù)據(jù)類(lèi)型、長(zhǎng)度等等。在以后幾章看到大量的關(guān)于Fields集合的例子。 對(duì)于半結(jié)構(gòu)化的數(shù)據(jù),對(duì)象的屬性相應(yīng)于字段。在第12章會(huì)看到更多的相關(guān)的介紹。 2. Parameters集合 Parameters集合僅被Command對(duì)象使用,確定在存儲(chǔ)命令中的參數(shù)。SQL數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程頻繁地使用參數(shù),并允許數(shù)據(jù)傳入和傳出預(yù)定義的SQL語(yǔ)句。如果擁有向ADO返回信息的參數(shù),則會(huì)十分有用,因?yàn)檫@樣從存儲(chǔ)過(guò)程中返回的就不只是一個(gè)記錄集。例如,考慮一個(gè)更新多個(gè)表然后返回一個(gè)記錄集的復(fù)雜存儲(chǔ)過(guò)程,可以用一個(gè)輸出參數(shù)顯示更新了多少條記錄。 另一個(gè)使用參數(shù)的理由是性能問(wèn)題,特別是在僅僅需要從存儲(chǔ)過(guò)程返回單個(gè)值的時(shí)候。在這種情況下,沒(méi)有創(chuàng)建記錄集的必要,只需要保存一個(gè)值即可,因而不需要返回記錄集,而返回輸出參數(shù)的值是更為有效的方法。 在第9章會(huì)看到有關(guān)Parameter集合的詳細(xì)介紹。 3. Error集合 Error集合包含因運(yùn)行命令而引起的上一次ADO或OLE DB提供者錯(cuò)誤的詳細(xì)內(nèi)容,只能被Connection對(duì)象訪問(wèn)。可能會(huì)覺(jué)得這是個(gè)限制,因?yàn)椴槐仫@式定義Connection對(duì)象,但可以通過(guò)Command、Recordset和Record對(duì)象的ActiveConnection屬性訪問(wèn)隱含的Connection對(duì)象。例如: For Each objError In rs.ActiveConnection.Errors Response.Write objError.Name & "<BR>" Next 在本章后面,將詳細(xì)討論Error集合。 4. Properties集合 為了避免混亂,Properties集合沒(méi)有在前面的對(duì)象模型圖上加以顯示。它與對(duì)象模型的關(guān)系顯示在圖8-5中: 圖8-5 Property與對(duì)象之間的關(guān)系 Properties集合存在的原因是因?yàn)锳DO是用來(lái)處理許多不同的數(shù)據(jù)存儲(chǔ),都有不同的特征。將屬性(Property)組成一個(gè)集合,可以使之能夠動(dòng)態(tài)地根據(jù)不同的數(shù)據(jù)提供者而隨時(shí)改變。例如,Jet的OLE DB提供者允許訪問(wèn)Jet特殊的安全屬性: Set conDB = Server.CreateObject ("ADODB.Connection") conDB.Open "DSN=Nwind"
conDB.Properties ("Jet OLEDB:Database Password") = "LetMeIn" 其他的提供者沒(méi)有這個(gè)屬性,因此把它加到Connection對(duì)象中作為一個(gè)靜態(tài)屬性是不明智的。ADO根據(jù)所使用的OLE DB提供者,會(huì)用提供者缺省值填充屬性集合。 雖然這里有關(guān)于Properties集合的使用說(shuō)明,但在本書(shū)中不準(zhǔn)備詳細(xì)敘述Properties集合。要獲得更多的關(guān)于該集合的介紹,請(qǐng)參閱《Professional ADO 2.5 Programming》或《ADO 2.5 Programming's Reference》,兩者都由Wrox出版。
8.2.7 ADO常數(shù) 當(dāng)使用ADO時(shí),會(huì)發(fā)現(xiàn)有許多預(yù)先定義的用于眾多選項(xiàng)的常數(shù),比如定義光標(biāo)類(lèi)型和鎖類(lèi)型的常數(shù)。使用像Visual Basic或Visual C++這樣的語(yǔ)言,一旦引用了ADO類(lèi)型庫(kù),自然會(huì)用到這些常數(shù)。在ASP中情況不同,有兩種選擇。 引用常數(shù)的第一種方法是把它們包含進(jìn)ASP文件: <!-- #INCLUDE FILE="adovbc.inc" --> 可以將包含文件拷入本地目錄,或者從安裝目錄引用它,其缺省路徑為C:\Program Files\Common Files\System\ado(以上文件包含用于VBScript的ADO常數(shù)——對(duì)于JScript,應(yīng)該使用adojavas.Inc)。使用這個(gè)方法的一點(diǎn)不足是會(huì)使ASP頁(yè)面變得過(guò)大,因?yàn)榘巳康某?shù),而其中許多是不需要使用的。 可以創(chuàng)建自己的只含有所需要的常數(shù)的包含文件,但越來(lái)越多使用ADO的功能時(shí),很可能會(huì)發(fā)現(xiàn)需要不斷地編輯、維護(hù)這個(gè)文件。 一個(gè)比較好的解決的方法是創(chuàng)建一個(gè)對(duì)類(lèi)型庫(kù)的引用,這種方法不需要將常數(shù)包含進(jìn)ASP文件而直接可以引用常數(shù): <!-- METADATA TYPE="typelib" FILE="C:\Program Files\ Common Files\System\ado\msado15.dll" --> 不要懷疑這個(gè)DLL的名字是msado15.dll,這是一個(gè)正確的名字,包含最新版本的ADO。 可以在需要的地方把這個(gè)METADATA語(yǔ)句包含進(jìn)每一個(gè)ASP文件,或者放入global.asa文件,這樣應(yīng)用程序中的每個(gè)Web頁(yè)面都可以引用這些常數(shù)。
8.3 連接到數(shù)據(jù)存儲(chǔ) 如果需要訪問(wèn)一個(gè)數(shù)據(jù)存儲(chǔ),應(yīng)該創(chuàng)建一個(gè)到數(shù)據(jù)存儲(chǔ)的連接。前面已經(jīng)提到過(guò):可以顯式地創(chuàng)建一個(gè)Connection對(duì)象,或者讓ADO隱含地創(chuàng)建一個(gè)連接。對(duì)于任何一種方式,都必須知道數(shù)據(jù)存儲(chǔ)的詳細(xì)內(nèi)容。 雖然用于連接的實(shí)際細(xì)節(jié)不盡相同,但對(duì)于所有類(lèi)型的數(shù)據(jù)存儲(chǔ),其連接的實(shí)際方法是相同的。這并不令人驚奇,因?yàn)椴煌奶峁┱咝枰煌?lèi)型的信息。在允許用戶(hù)訪問(wèn)數(shù)據(jù)存儲(chǔ)之前,一些提供者需要用戶(hù)的證書(shū),而別的提供者卻接受默認(rèn)的安全證書(shū)。 連接到數(shù)據(jù)源有好幾種方法: · 連接字符串。在字符串中放入連接的細(xì)節(jié),或在打開(kāi)數(shù)據(jù)存儲(chǔ)時(shí),直接將連接細(xì)節(jié)加入到命令中。這種方法的優(yōu)點(diǎn)是連接細(xì)節(jié)將保留在ASP頁(yè)面中。不足之處,如果你有較多的頁(yè)面,在改變了連接細(xì)節(jié)時(shí),將陷于繁重的維護(hù)工作當(dāng)中。解決的方法是創(chuàng)建一個(gè)包含連接細(xì)節(jié)的字符串變量,并放進(jìn)一個(gè)ASP包含文件,這樣的話僅僅有一個(gè)連接字符串的實(shí)例,但能保持與其他的ASP頁(yè)面相符。另一個(gè)常用的技術(shù)就是將應(yīng)用程序中的連接字符串存儲(chǔ)到狀態(tài)變量中,這樣可以被應(yīng)用程序中的所有頁(yè)面使用。 · 數(shù)據(jù)鏈接文件。這是一個(gè)含有連接細(xì)節(jié)的文件(擴(kuò)展名為.udl)。優(yōu)點(diǎn)是對(duì)于任何數(shù)據(jù)的ASP頁(yè)面只需要一個(gè)數(shù)據(jù)鏈接文件。要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)鏈接文件,只需創(chuàng)建一個(gè)新的文本文件,并重新命名(要確保Windows資源管理器顯示文件擴(kuò)展名)。一旦重新命名了該文件,就可以打開(kāi)它(雙擊)以顯示Data Link Properties對(duì)話框。以前版本的ADO允許從Windows資源管理器的New菜單建立數(shù)據(jù)鏈接文件。我們將在本章稍后看到有關(guān)數(shù)據(jù)鏈接文件的內(nèi)容。 · ODBC數(shù)據(jù)源,或DSN。有點(diǎn)類(lèi)似于數(shù)據(jù)鏈接文件,但只適用于ODBC數(shù)據(jù)源。它們集中起來(lái)用于ASP頁(yè)面,數(shù)據(jù)源必須是系統(tǒng)數(shù)據(jù)源。ODBC數(shù)據(jù)源從ODBC數(shù)據(jù)源管理器(ODBC Data Source Administrator)中創(chuàng)建,這個(gè)工具可在Administrative Tools文件夾中找到。 這三種方式無(wú)論哪一種都可以使用,使用哪一種只是一種偏愛(ài)而已。直接的連接字符串可能速度快一些,因?yàn)樘峁┧械倪B接細(xì)節(jié)。數(shù)據(jù)鏈接文件需要從文件中讀出連接細(xì)節(jié),ODBC數(shù)據(jù)源需要從注冊(cè)表中讀取連接細(xì)節(jié)。當(dāng)然,速度的差異是很小的,每種方法各有優(yōu)缺點(diǎn)。
8.3.1 連接字符串 連接字符串依賴(lài)于提供者,因?yàn)槊總(gè)數(shù)據(jù)提供者可能需要不同的細(xì)節(jié)。 值得注意的重要一點(diǎn)是,ODBC的OLE DB提供者是缺省的,所以,如果不使用Provide=部分,系統(tǒng)將自動(dòng)地使用ODBC。 下面為不同的提供者列舉了連接字符串的例子,在本書(shū)的后面將會(huì)看到更多的例子。 1. 微軟Access 如果使用ODBC,而沒(méi)有DSN: Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:\wrox\database_name.mdb 對(duì)于本地的OLE DB提供者: Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\wrox\database_name.mdb 上面的例子說(shuō)明了Access數(shù)據(jù)庫(kù)存放于C:\wrox目錄下。雖然讀者可能會(huì)嘗試將數(shù)據(jù)庫(kù)作為Web文件存放于相同的目錄下,但不要這樣做,否則任何人都可以下載整個(gè)數(shù)據(jù)庫(kù)文件。將數(shù)據(jù)庫(kù)存放于Web目錄外永遠(yuǎn)是明智的,沒(méi)有人可以從外面訪問(wèn)該文件。 2. 微軟SQL Server 對(duì)于微軟SQL Server,使用針對(duì)ODBC的提供者: Driver={SQL Server}; Server=server_name; Database=database_name; UID=user_name; PWD=user_password 例如: Driver={SQL Server}; Server=WATCHER; Database=pubs; UID=davids; PWD=whisky 對(duì)于本地OLE DB提供者,語(yǔ)法類(lèi)似: Provider=SQLOLEDB; Data Source=server_name; Initial Catalog=database_name; User Id=user_name; Password=user_password 例如: Provider=SQLOLEDB; Data Source=WATHCHER; Initial Catalog=pubs; User Id=davids; Password=whisky 3. 微軟索引服務(wù) 索引服務(wù)只能通過(guò)本地的OLE DB提供者使用。其語(yǔ)法: Provider=MSIDXS; Data Source=catalog_name 例如,使用Web目錄 Provider=MSIDXS; Data Source=Web 4. ODBC驅(qū)動(dòng)程序 在使用針對(duì)ODBC的OLE DB提供者的例子中,Driver顯得較為冗長(zhǎng)。例如: Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:\wrox\database_name.mdb 當(dāng)創(chuàng)建一個(gè)新數(shù)據(jù)源時(shí),使用的驅(qū)動(dòng)程序的準(zhǔn)確名字應(yīng)該是從驅(qū)動(dòng)程序列表中得到的,如圖8-6所示:
圖8-6 驅(qū)動(dòng)程序列表 5. 數(shù)據(jù)鏈接文件 以前版本的ADO允許在資源管理器中的目錄上右擊鼠標(biāo)來(lái)創(chuàng)建一個(gè)數(shù)據(jù)鏈接文件。創(chuàng)建了新文件后,打開(kāi)該文件從而得到Data Link Properties對(duì)話框。在寫(xiě)本書(shū)的時(shí)候,微軟已經(jīng)從鼠標(biāo)右鍵菜單中刪除了該選項(xiàng),因?yàn)樗麄冇X(jué)得這會(huì)讓用戶(hù)感到混亂。但微軟聲稱(chēng)會(huì)提供一個(gè)注冊(cè)表文件以便再次引入這項(xiàng)功能。 不要忘了,也可以簡(jiǎn)單地通過(guò)創(chuàng)建一個(gè)空文本文件,并將其擴(kuò)展名改為.udl來(lái)創(chuàng)建一個(gè)數(shù)據(jù)鏈接文件。 一旦有了物理上的數(shù)據(jù)鏈接文件,就可以通過(guò)鼠標(biāo)雙擊或者右擊鼠標(biāo)選擇Open打開(kāi)文件。接下來(lái),讀者會(huì)看到圖8-7所示的對(duì)話框:
圖8-7 Data Link Properties對(duì)話框 圖中的詳細(xì)內(nèi)容因選擇的提供者的不同而不同。上面的例子顯示了SQL Server提供者,連接到一個(gè)稱(chēng)為WATHER的SQL Server上,以davids的身份登錄(口令被屏蔽了),使用pubs數(shù)據(jù)庫(kù)。注意,如果選擇Allow saving password選擇,輸入的口令將會(huì)在UDL文件中以明文保存下來(lái)。 如果要改變提供者,可以選擇“Provider”(提供者)選項(xiàng)卡,如圖8-8所示:
圖8-8 改變提供者的選項(xiàng)卡 通過(guò)這個(gè)選擇,可以選出所需的提供者,然后按下Next按鈕填入適當(dāng)?shù)倪B接細(xì)節(jié)。 也可以在文本編輯器中編輯文件,如圖8-9所示:
圖8-9 改變提供者的選項(xiàng)卡 可以看到在UDL文件中確實(shí)存有一個(gè)連接字符串。 要使用數(shù)據(jù)鏈接文件,僅需要在打開(kāi)連接時(shí)指定這個(gè)數(shù)據(jù)鏈接文件: conPubs.Open "File Name=C:\wrox\pubs.udl" 6. ODBC數(shù)據(jù)源 ODBC數(shù)據(jù)源(通常稱(chēng)謂數(shù)據(jù)源名稱(chēng),即DSN)可以通過(guò)Administrative菜單的Data Source選項(xiàng)進(jìn)行設(shè)置。在以前版本的Windows中把它作為控制面板中的一個(gè)小程序。為了在ASP頁(yè)面中訪問(wèn)DSN,必須確定該DSN已經(jīng)被設(shè)置為系統(tǒng)DSN。這只需在Data Source Administrator中選擇System DSN選項(xiàng)卡,然后選擇Add按鈕,如圖8-10所示:
圖8-10 選擇數(shù)據(jù)源的界面 然后,就可以選擇希望使用的ODBC驅(qū)動(dòng)程序,并填入適當(dāng)?shù)腛DBC參數(shù)。 一旦建立了DSN,可以使用連接字符串的“DSN=”屬性。例如: conPubs.Open "DSN=pubs"
8.3.2 使用包含文件 使用包含文件連接字符串的包含文件提供了一個(gè)中心區(qū)域來(lái)存儲(chǔ)許多ASP頁(yè)面需要的連接細(xì)節(jié)。要這樣做,僅僅需要?jiǎng)?chuàng)建一個(gè)新的ASP文件,不妨稱(chēng)為Connection.asp,并在其中加入下面的代碼: <% strConn = "Provider=SQLOLEDB; Data Source=WATCHER; " & _ "Initial Catalog=pubs; User Id=davids; Password=whisky" %> 在ASP頁(yè)面中,現(xiàn)在可以在該頁(yè)的頂端加入這一行: <!-- #INCLUDE FILE="Connection.asp" --> 這樣不必再為每個(gè)ASP頁(yè)面都輸入連接細(xì)節(jié),同時(shí)方便于更改整個(gè)站點(diǎn)都使用的連接。 包含文件也是放置METADATA標(biāo)簽的好地方。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!