直播中
8.2.6 集合
ADO對(duì)象庫中有一些集合,每個(gè)集合都有零個(gè)或更多個(gè)與其關(guān)聯(lián)的對(duì)象的拷貝。可以使用相同的代碼結(jié)構(gòu)去遍歷這些集合。
在VBScript中的語法是:
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)容,比如名稱、數(shù)據(jù)類型、長度等等。在以后幾章看到大量的關(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ù)庫中的存儲(chǔ)過程頻繁地使用參數(shù),并允許數(shù)據(jù)傳入和傳出預(yù)定義的SQL語句。如果擁有向ADO返回信息的參數(shù),則會(huì)十分有用,因?yàn)檫@樣從存儲(chǔ)過程中返回的就不只是一個(gè)記錄集。例如,考慮一個(gè)更新多個(gè)表然后返回一個(gè)記錄集的復(fù)雜存儲(chǔ)過程,可以用一個(gè)輸出參數(shù)顯示更新了多少條記錄。
另一個(gè)使用參數(shù)的理由是性能問題,特別是在僅僅需要從存儲(chǔ)過程返回單個(gè)值的時(shí)候。在這種情況下,沒有創(chuàng)建記錄集的必要,只需要保存一個(gè)值即可,因而不需要返回記錄集,而返回輸出參數(shù)的值是更為有效的方法。
在第9章會(huì)看到有關(guān)Parameter集合的詳細(xì)介紹。
3. Error集合
Error集合包含因運(yùn)行命令而引起的上一次ADO或OLE DB提供者錯(cuò)誤的詳細(xì)內(nèi)容,只能被Connection對(duì)象訪問??赡軙?huì)覺得這是個(gè)限制,因?yàn)椴槐仫@式定義Connection對(duì)象,但可以通過Command、Recordset和Record對(duì)象的ActiveConnection屬性訪問隱含的Connection對(duì)象。例如:
For Each objError In rs.ActiveConnection.Errors
Response.Write objError.Name & "<BR>"
Next
在本章后面,將詳細(xì)討論Error集合。
4. Properties集合
為了避免混亂,Properties集合沒有在前面的對(duì)象模型圖上加以顯示。它與對(duì)象模型的關(guān)系顯示在圖8-5中:
圖8-5 Property與對(duì)象之間的關(guān)系
Properties集合存在的原因是因?yàn)锳DO是用來處理許多不同的數(shù)據(jù)存儲(chǔ),都有不同的特征。將屬性(Property)組成一個(gè)集合,可以使之能夠動(dòng)態(tài)地根據(jù)不同的數(shù)據(jù)提供者而隨時(shí)改變。例如,Jet的OLE DB提供者允許訪問Jet特殊的安全屬性:
Set conDB = Server.CreateObject ("ADODB.Connection")
conDB.Open "DSN=Nwind"
conDB.Properties ("Jet OLEDB:Database Password") = "LetMeIn"
其他的提供者沒有這個(gè)屬性,因此把它加到Connection對(duì)象中作為一個(gè)靜態(tài)屬性是不明智的。ADO根據(jù)所使用的OLE DB提供者,會(huì)用提供者缺省值填充屬性集合。
雖然這里有關(guān)于Properties集合的使用說明,但在本書中不準(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)類型和鎖類型的常數(shù)。使用像Visual Basic或Visual C++這樣的語言,一旦引用了ADO類型庫,自然會(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àn)榘巳康某?shù),而其中許多是不需要使用的。
可以創(chuàng)建自己的只含有所需要的常數(shù)的包含文件,但越來越多使用ADO的功能時(shí),很可能會(huì)發(fā)現(xiàn)需要不斷地編輯、維護(hù)這個(gè)文件。
一個(gè)比較好的解決的方法是創(chuàng)建一個(gè)對(duì)類型庫的引用,這種方法不需要將常數(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語句包含進(jìn)每一個(gè)ASP文件,或者放入global.asa文件,這樣應(yīng)用程序中的每個(gè)Web頁面都可以引用這些常數(shù)。
8.3 連接到數(shù)據(jù)存儲(chǔ)
如果需要訪問一個(gè)數(shù)據(jù)存儲(chǔ),應(yīng)該創(chuàng)建一個(gè)到數(shù)據(jù)存儲(chǔ)的連接。前面已經(jīng)提到過:可以顯式地創(chuàng)建一個(gè)Connection對(duì)象,或者讓ADO隱含地創(chuàng)建一個(gè)連接。對(duì)于任何一種方式,都必須知道數(shù)據(jù)存儲(chǔ)的詳細(xì)內(nèi)容。
雖然用于連接的實(shí)際細(xì)節(jié)不盡相同,但對(duì)于所有類型的數(shù)據(jù)存儲(chǔ),其連接的實(shí)際方法是相同的。這并不令人驚奇,因?yàn)椴煌奶峁┱咝枰煌愋偷男畔?。在允許用戶訪問數(shù)據(jù)存儲(chǔ)之前,一些提供者需要用戶的證書,而別的提供者卻接受默認(rèn)的安全證書。
連接到數(shù)據(jù)源有好幾種方法:
· 連接字符串。在字符串中放入連接的細(xì)節(jié),或在打開數(shù)據(jù)存儲(chǔ)時(shí),直接將連接細(xì)節(jié)加入到命令中。這種方法的優(yōu)點(diǎn)是連接細(xì)節(jié)將保留在ASP頁面中。不足之處,如果你有較多的頁面,在改變了連接細(xì)節(jié)時(shí),將陷于繁重的維護(hù)工作當(dāng)中。解決的方法是創(chuàng)建一個(gè)包含連接細(xì)節(jié)的字符串變量,并放進(jìn)一個(gè)ASP包含文件,這樣的話僅僅有一個(gè)連接字符串的實(shí)例,但能保持與其他的ASP頁面相符。另一個(gè)常用的技術(shù)就是將應(yīng)用程序中的連接字符串存儲(chǔ)到狀態(tài)變量中,這樣可以被應(yīng)用程序中的所有頁面使用。
· 數(shù)據(jù)鏈接文件。這是一個(gè)含有連接細(xì)節(jié)的文件(擴(kuò)展名為.udl)。優(yōu)點(diǎn)是對(duì)于任何數(shù)據(jù)的ASP頁面只需要一個(gè)數(shù)據(jù)鏈接文件。要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)鏈接文件,只需創(chuàng)建一個(gè)新的文本文件,并重新命名(要確保Windows資源管理器顯示文件擴(kuò)展名)。一旦重新命名了該文件,就可以打開它(雙擊)以顯示Data Link Properties對(duì)話框。以前版本的ADO允許從Windows資源管理器的New菜單建立數(shù)據(jù)鏈接文件。我們將在本章稍后看到有關(guān)數(shù)據(jù)鏈接文件的內(nèi)容。
· ODBC數(shù)據(jù)源,或DSN。有點(diǎn)類似于數(shù)據(jù)鏈接文件,但只適用于ODBC數(shù)據(jù)源。它們集中起來用于ASP頁面,數(shù)據(jù)源必須是系統(tǒng)數(shù)據(jù)源。ODBC數(shù)據(jù)源從ODBC數(shù)據(jù)源管理器(ODBC Data Source Administrator)中創(chuàng)建,這個(gè)工具可在Administrative Tools文件夾中找到。
這三種方式無論哪一種都可以使用,使用哪一種只是一種偏愛而已。直接的連接字符串可能速度快一些,因?yàn)樘峁┧械倪B接細(xì)節(jié)。數(shù)據(jù)鏈接文件需要從文件中讀出連接細(xì)節(jié),ODBC數(shù)據(jù)源需要從注冊表中讀取連接細(xì)節(jié)。當(dāng)然,速度的差異是很小的,每種方法各有優(yōu)缺點(diǎn)。
8.3.1 連接字符串
連接字符串依賴于提供者,因?yàn)槊總€(gè)數(shù)據(jù)提供者可能需要不同的細(xì)節(jié)。
值得注意的重要一點(diǎn)是,ODBC的OLE DB提供者是缺省的,所以,如果不使用Provide=部分,系統(tǒng)將自動(dòng)地使用ODBC。
下面為不同的提供者列舉了連接字符串的例子,在本書的后面將會(huì)看到更多的例子。
1. 微軟Access
如果使用ODBC,而沒有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
上面的例子說明了Access數(shù)據(jù)庫存放于C:\wrox目錄下。雖然讀者可能會(huì)嘗試將數(shù)據(jù)庫作為Web文件存放于相同的目錄下,但不要這樣做,否則任何人都可以下載整個(gè)數(shù)據(jù)庫文件。將數(shù)據(jù)庫存放于Web目錄外永遠(yuǎ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提供者,語法類似:
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ū)動(dòng)程序
在使用針對(duì)ODBC的OLE DB提供者的例子中,Driver顯得較為冗長。例如:
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)來創(chuàng)建一個(gè)數(shù)據(jù)鏈接文件。創(chuàng)建了新文件后,打開該文件從而得到Data Link Properties對(duì)話框。在寫本書的時(shí)候,微軟已經(jīng)從鼠標(biāo)右鍵菜單中刪除了該選項(xiàng),因?yàn)樗麄冇X得這會(huì)讓用戶感到混亂。但微軟聲稱會(huì)提供一個(gè)注冊表文件以便再次引入這項(xiàng)功能。
不要忘了,也可以簡單地通過創(chuàng)建一個(gè)空文本文件,并將其擴(kuò)展名改為.udl來創(chuàng)建一個(gè)數(shù)據(jù)鏈接文件。
一旦有了物理上的數(shù)據(jù)鏈接文件,就可以通過鼠標(biāo)雙擊或者右擊鼠標(biāo)選擇Open打開文件。接下來,讀者會(huì)看到圖8-7所示的對(duì)話框:
圖8-7 Data Link Properties對(duì)話框
圖中的詳細(xì)內(nèi)容因選擇的提供者的不同而不同。上面的例子顯示了SQL Server提供者,連接到一個(gè)稱為WATHER的SQL Server上,以davids的身份登錄(口令被屏蔽了),使用pubs數(shù)據(jù)庫。注意,如果選擇Allow saving password選擇,輸入的口令將會(huì)在UDL文件中以明文保存下來。
如果要改變提供者,可以選擇“Provider”(提供者)選項(xiàng)卡,如圖8-8所示:
圖8-8 改變提供者的選項(xiàng)卡
通過這個(gè)選擇,可以選出所需的提供者,然后按下Next按鈕填入適當(dāng)?shù)倪B接細(xì)節(jié)。
也可以在文本編輯器中編輯文件,如圖8-9所示:
圖8-9 改變提供者的選項(xiàng)卡
可以看到在UDL文件中確實(shí)存有一個(gè)連接字符串。
要使用數(shù)據(jù)鏈接文件,僅需要在打開連接時(shí)指定這個(gè)數(shù)據(jù)鏈接文件:
conPubs.Open "File Name=C:\wrox\pubs.udl"
6. ODBC數(shù)據(jù)源
ODBC數(shù)據(jù)源(通常稱謂數(shù)據(jù)源名稱,即DSN)可以通過Administrative菜單的Data Source選項(xiàng)進(jìn)行設(shè)置。在以前版本的Windows中把它作為控制面板中的一個(gè)小程序。為了在ASP頁面中訪問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ū)域來存儲(chǔ)許多ASP頁面需要的連接細(xì)節(jié)。要這樣做,僅僅需要?jiǎng)?chuàng)建一個(gè)新的ASP文件,不妨稱為Connection.asp,并在其中加入下面的代碼:
<%
strConn = "Provider=SQLOLEDB; Data Source=WATCHER; " & _
"Initial Catalog=pubs; User Id=davids; Password=whisky"
%>
在ASP頁面中,現(xiàn)在可以在該頁的頂端加入這一行:
<!-- #INCLUDE FILE="Connection.asp" -->
這樣不必再為每個(gè)ASP頁面都輸入連接細(xì)節(jié),同時(shí)方便于更改整個(gè)站點(diǎn)都使用的連接。 包含文件也是放置METADATA標(biāo)簽的好地方。