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