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"
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所示: