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