使用 Recordset 對象處理結果 為了檢索數據、檢查結果和更改數據庫,ADO 提供了 Recordset 對象。正如名字所示,“Recordset”對象具有用來檢索和顯示數據庫行(或叫“記錄”)的功能,這取決于您的查詢約束條件。“Recordset”對象保留由查詢返回的每一條記錄的位置,這樣就能使您查看所有的結果,每次一條。
檢索記錄集 成功的 Web 數據應用程序既使用“Connection”對象來建立鏈接,又使用“Recordset”對象來處理返回的數據。通過綜合使用這兩種對象的一些特殊功能,開發出的數據庫應用程序幾乎可以執行所有的數據處理任務。例如,下面的服務器端腳本使用“Recordset”對象執行 SQL 的 SELECT 命令。此 SELECT 命令用來檢索基于查詢約束條件的信息集。此查詢也包含 SQL WHERE 子句,用來將查詢限制到一個指定的標準。在本例中,WHERE 子句將查詢限制在 Customers 數據庫表中姓氏字段包含 Smith 的所有記錄。
<% '建立數據源連接 strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb" Set cnn = Server.CreateObject("ADODB.Connection") cnn.Open strConnectionString
'例示 Recordset 對象 Set rstCustomers = Server.CreateObject("ADODB.Recordset")
'使用 Open 方法打開記錄集 '并使用通過 Connection 對象建立的連接。 strSQL = "SELECT FirstName, LastName FROM Customers WHERE LastName = 'Smith' " rstCustomers.Open strSQL, cnn
'遍歷記錄集和顯示結果 '并使用 MoveNext 方法遞增記錄位置。 Set objFirstName = rstCustomers("FirstName") Set objLastName = rstCustomers("LastName") Do Until rstCustomers.EOF Response.Write objFirstName & " " & objLastName & "<BR>" rstCustomers.MoveNext Loop
%> 注意,在上例中,“Connection”對象建立數據庫連接,而“Recordset”對象使用同一連接從數據庫中檢索結果。當需要精確配置建立數據庫鏈接的方式時,該方法非常有用。例如,如果要指定在連接中止之前的時間延遲,可能需要使用“Connection”對象設置該屬性。但是,如果只想使用 ADO 的默認連接屬性建立連接,您可以使用“Recordset”對象的“Open”方法來建立鏈接:
<% strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb" strSQL = "SELECT FirstName, LastName FROM Customers WHERE LastName = 'Smith' " Set rstCustomers = Server.CreateObject("ADODB.Recordset")
'使用 Open 方法打開連接 '并使用通過 Connection 對象建立的連接。 rstCustomers.Open strSQL, strConnectionString
'遍歷記錄集,顯示結果, '并使用 MoveNext 方法遞增記錄位置。 Set objFirstName = rstCustomers("FirstName") Set objLastName = rstCustomers("LastName") Do Until rstCustomers.EOF Response.Write objFirstName & " " & objLastName & "<BR>" rstCustomers.MoveNext Loop %> 當使用“Recordset”對象的“Open”方法來建立連接時,實際上正在隱含地使用“Connection”對象保護鏈接的安全。詳細信息,請參閱 Microsoft ActiveX 數據對象 (ADO) 文檔,可在 Microsoft Universal Data Access Web 站點 http://www.microsoft.com/data/ 上找到該文檔。
注意 要明顯提高 ASP 數據庫應用程序的性能,請考慮在“應用程序”狀態中高速緩存記錄集。詳細信息,請參閱高速緩存數據。
統計記錄集中返回的記錄數有時候很有用。“Recordset”對象的“Open”方法使您能夠指定可選的光標參數,以確定潛在提供者檢索和瀏覽記錄集的方法。通過給用來執行查詢的語句添加 adOpenKeyset 光標參數,可以使客戶端應用程序完全地瀏覽記錄集。因此,應用程序可使用 RecordCount 屬性精確地統計記錄集中的記錄數。請參看下面的示例:
<% Set rs = Server.CreateObject("ADODB.Recordset") rs.Open "SELECT * FROM NewOrders", "Provider=Microsoft.Jet.OLEDB.3.51;Data Source='C:\CustomerOrders\Orders.mdb'", adOpenKeyset, adLockOptimistic, adCmdText
'使用 Recordset 對象的 RecordCount 屬性進行統計。 If rs.RecordCount >= 5 then Response.Write "我們已經收到下面" & rs.RecordCount & "個新訂單<BR>"
Do Until rs.EOF Response.Write rs("CustomerFirstName") & " " & rs("CustomerLastName") & "<BR>" Response.Write rs("AccountNumber") & "<BR>" Response.Write rs("Quantity") & "<BR>" Response.Write rs("DeliveryDate") & "<BR><BR>" rs.MoveNext Loop
Else Response.Write "訂單數少于 " & rs.RecordCount & "。" End If
rs.Close %> 使用 Command 對象改善查詢 使用 ADO 的 Command 對象執行查詢的方式與使用“Connection”和“Recordset”對象執行查詢的方式一樣,但是使用“Command”對象可以準備(或編譯)對數據庫源的查詢,然后使用各種不同的值重復發送此查詢。用這種方法編譯查詢的好處在于,當您需要重新發布修改過的已有查詢時,可以大大地減少發布時間。另外,還可以留下部分 SQL 查詢不進行定義,用到了在執行之前改變查詢部分的選項。
“Command”對象的“Parameters”集合可以使您避免每次重新發布查詢時都要重建查詢的麻煩。例如,如果您需要定期更新基于 Web 的庫存系統的供應和費用信息,就可以按照下面的方式預定義查詢:
<% '使用 Connection 對象打開連接注意,Command 對象 '并不具有用來建立連接的 Open 方法。 strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb" Set cnn = Server.CreateObject("ADODB.Connection") cnn.Open strConnectionString
'例示 Command 對象;使用 ActiveConnection 屬性將 '連接附加到 Command 對象上。 Set cmn= Server.CreateObject("ADODB.Command") Set cmn.ActiveConnection = cnn
'定義 SQL 查詢。 cmn.CommandText = "INSERT INTO Inventory (Material, Quantity) VALUES (?, ?)"
'在 Command 對象首次執行之前保存在 CommandText 屬性 '中指定的查詢的預備(或預編譯)版本。 cmn.Prepared = True
'定義查詢參數配置信息。 cmn.Parameters.Append cmn.CreateParameter("material_type",adVarChar, ,255 ) cmn.Parameters.Append cmn.CreateParameter("quantity",adVarChar, ,255 )
'定義并執行第一個插入操作。 cmn("material_type") = "日光燈泡" cmn("quantity") = "40" cmn.Execute ,,adCmdText + adExecuteNoRecords
'定義并執行第二個插入操作。 cmn("material_type") = "保險絲" cmn("quantity") = "600" cmn.Execute ,,adCmdText + adExecuteNoRecords . . . %> 要點 ADO 參數(如 adCmdText)是一些簡單變量,這意味著在使用數據訪問腳本中的 ADO 參數之前需要先定義參數值。由于 ADO 使用了大量的參數,因此通過“組件類型庫”來定義參數更容易些,組件類型庫是包含所有 ADO 參數和常量定義的文件。有關實施 ADO 類型庫的詳細信息,請參閱使用變量和常量主題中的使用常量部分。
在上例中,您將注意到腳本使用不同的值重復構建和重新發布 SQL 查詢,但并沒有重新定義并重新發送查詢到數據庫源中。使用“Command”命令編譯查詢也有如下優點:可避免當將字符串和變量連接成 SQL 查詢時引起問題。特別地,使用“Command”對象的“Parameter”集合,您可以避免那些與定義特定類型字符串、日期和時間變量相關的問題。例如,包含單引號 (') 的 SQL 查詢值可能導致查詢失敗:
strSQL = "INSERT INTO Customers (FirstName, LastName) VALUES ('Robert','O'Hara')" 注意,姓氏“O'Hara”包含一個單引號,這與用來表示 SQL VALUES 關鍵字中數據的單引號沖突。通過將查詢值約束為“Command”對象參數可以避免此類問題。
合并 HTML 表單和數據庫訪問 包含 HTML 表單的 Web 頁可允許用戶遠程查詢數據庫并檢索指定的信息。使用 ADO 您可以創建出非常簡單的用來收集用戶表單信息的腳本、創建自定義的數據庫查詢并將信息返回給用戶。使用 ASP 的“Request”對象,您可以檢索輸入到 HTML 表單中的信息并將這些信息嵌入到 SQL 語句中。例如,下面的腳本塊會將由 HTML 表單提供的信息插入到表中。腳本使用“Request”對象的“Form”集合來收集用戶信息。
<% '使用 Connection 對象打開連接Command 對象 '并不具有用來建立連接的 Open 方法。 strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\CompanyCatalog\Seeds.mdb" Set cnn = Server.CreateObject("ADODB.Connection") cnn.Open strConnectionString
'例示 Command 對象 '并使用 ActiveConnection 屬性附加對象 '連接附加到 Command 對象上。 Set cmn= Server.CreateObject("ADODB.Command") Set cmn.ActiveConnection = cnn
'定義 SQL 查詢。 cmn.CommandText = "INSERT INTO MySeedsTable (Type) VALUES (?)"
'定義查詢參數配置信息。 cmn.Parameters.Append cmn.CreateParameter("type",adVarChar, ,255)
'指派輸入值并執行更新。 cmn("type") = Request.Form("SeedType") cmn.Execute ,,adCmdText + adExecuteNoRecords %> 有關表單和使用 ASP“Request”對象的詳細信息,請參閱處理用戶輸入。
管理數據庫連接 設計完善的 Web 數據庫應用程序(如服務成千上萬個客戶的聯機訂購輸入應用程序)的一個主要挑戰就是如何正確管理數據庫連接。打開并維護數據庫連接,尤其是當沒有信息傳輸時也要打開和維護,會嚴重消耗數據庫服務器的資源并導致連接性問題。設計良好的 Web 數據庫應用程序可重復利用數據庫連接并補償因網絡通信量導致的延遲。
超時連接 數據庫服務器當活動突然激增時會產生積壓,同時大大增加建立數據庫連接所需的時間。因此,過多的連接延遲會降低數據庫應用程序的性能。
使用“Connection”對象的“ConnectionTimeout”可以限制應用程序在放棄連接嘗試并發布錯誤消息之前等待的時間數。例如,下面的腳本將“ConnectionTimeout”屬性設置為在取消連接嘗試之前等待 20 秒。
Set cnn = Server.CreateObject("ADODB.Connection") cnn.ConnectionTimeout = 20 cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb"
“ConnectionTimeout”屬性默認為 30 秒。
注意 在將“ConnectionTimeout”屬性并入數據庫應用程序之前,請確保您的連接提供者和數據源支持該屬性。
共用連接 連接池可使您的 Web 應用程序使用“池”中的連接,“池”指的是包含許多不需要重新建立的自由連接的容器。創建連接并放入連接池中后,應用程序可以重復使用該連接而不必執行連接進程。這可明顯地提高性能,特別是在應用程序通過網絡連接或需要重復連接和斷開的情況下更是如此。另外,共用的連接可被多個應用程序重復使用。
OLE DB 會話池 OLE DB 具有一個共用特性,稱為“會話池”,用來提高大型 Web 數據庫應用程序的活動性能。會話池保護連接安全和一些其他屬性。共用的連接只在連接兩端提出匹配的請求時才可重新使用。默認情況下,Microsoft SQL server 和 Oracle 的 OLE DB 提供者支持會話池。這意味著并不需要配置應用程序、服務器或數據庫即可使用會話池。然而,如果提供者默認情況下不支持會話池,則需要創建注冊表設置以啟用會話池。關于會話池的詳細信息,請參閱 OLE DB 2.0 Software Development Kit (SDK) 文檔。
ODBC 連接池 如果希望 ODBC 驅動程序分享連接池,您必須配置特定的數據庫驅動程序,然后在 Windows 注冊表中設置驅動程序的“CPTimeout”屬性。“CPTimeout”屬性確定連接在連接池中保留的時間長度。如果連接在池中保留的時間超過“CPTimeout”設置的持續時間,連接將關閉并從池中刪除。“CPTimeout”的默認值是 60 秒。
通過創建帶有下面設置的注冊表鍵值,您可以有選擇地設置“CPTimeout”屬性以啟用特定 ODBC 數據庫驅動程序的連接池:
\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\driver-name\CPTimeout = 超時數 (REG_SZ, 以秒為單位)
例如,下面的鍵值將 SQL Server 驅動程序的連接池超時設置為 180 秒(3 分鐘)。
\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\SQL Server\CPTimeout = 180 注意 默認情況下,Web 服務器激活 SQL Server 的連接池并將“CPTimeout”設置為 60 秒。
使用跨多頁的連接 雖然可以通過將連接儲存在 ASP 的“Application”對象中來重復使用跨多頁的連接,但這樣做可能導致不必要地保持打開的連接,并且可能損害使用連接池的優勢。如果有許多用戶需要連接到同一 ASP 應用程序,一種更好的方法是重復使用跨多個 Web 頁的數據庫連接字符串,只需將字符串放置到 ASP 的“Application”對象中即可。例如,您可以在 Global.asa 文件的 Application_OnStart 事件過程中指定連接字符串,如下面的腳本所示:
Application("ConnectionString") = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb"
然后在每一個訪問數據庫的 ASP 文件中,寫入
<OBJECT RUNAT=SERVER ID=cnn PROGID="ADODB.Connection"></OBJECT> 以創建該頁的連接對象實例,并使用腳本
cnn.Open Application("ConnectionString") 打開該連接。要關閉連接,在該頁的末尾可以使用
cnn.Close 在個別用戶需要重復使用跨多個 Web 頁連接的情況下,您將發現使用“Session”對象儲存連接字符串比使用“Application”對象更具優勢。
關閉連接 要充分利用連接池,請盡可能顯式關閉數據庫連接。默認情況下,連接在腳本執行完后終止。然而,通過顯式關閉腳本已不再需要的連接,您可以減少對數據庫服務器的要求,并使得其他用戶可以使用該連接。
可以使用“Connection”對象的“Close”方法顯式終止“Connection”對象和數據庫之間的連接。下面的腳本將打開和關閉連接:
<% strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb" Set cnn = Server.CreateObject("ADODB.Connection") cnn.Open strConnectionString cnn.Close %>
--------------------------------------------------------------------------------
© 1997-1999 Microsoft Corporation。保留所有權利。
|