ActiveX 數(shù)據(jù)對象 (ADO) 是一種既易于使用又可擴(kuò)充的技術(shù),用來將數(shù)據(jù)庫訪問添加到您的 Web 頁可以使用 ADO 編寫簡潔和可升級的腳本以連接到與 OLE DB 兼容的數(shù)據(jù)源,如數(shù)據(jù)庫、電子表格、順序數(shù)據(jù)文件或電子郵件目錄。OLE DB 是一個系統(tǒng)級的編程接口,它提供一套標(biāo)準(zhǔn)的 COM 接口,用來展示數(shù)據(jù)庫管理系統(tǒng)的功能。使用 ADO 的對象模型,您可以輕松地(使用 VBScript 或 JScript 等腳本語言)訪問這些接口并將數(shù)據(jù)庫功能添加到您的 Web 應(yīng)用程序中。另外,您還可以使用 ADO 訪問與開放式數(shù)據(jù)庫互連 (ODBC) 兼容的數(shù)據(jù)庫。
如果您是一位對數(shù)據(jù)庫互連知識有一定了解的腳本編寫者,您將會發(fā)現(xiàn) ADO 的命令語法很簡單,而且很容易使用。如果您是一位經(jīng)驗(yàn)豐富的開發(fā)人員,您將會非常欣賞 ADO 提供的這種可升級的對各種數(shù)據(jù)源的高性能訪問。
關(guān)于 ADO 的詳細(xì)信息,請訪問 Microsoft 通用數(shù)據(jù)訪問 (UDA) Web 站點(diǎn) http://www.microsoft.com/data/。
創(chuàng)建連接字符串 創(chuàng)建 Web 應(yīng)用程序的第一步是給 ADO 提供一種定位并識別數(shù)據(jù)源的方法。這是通過“連接字符串”來完成的,連接字符串是一系列用分號分隔的參數(shù),用來定義諸如數(shù)據(jù)源提供者和數(shù)據(jù)源位置等參數(shù)。ADO 使用連接字符串來識別 OLE DB “提供者”并將提供者指向數(shù)據(jù)源。提供者是一個組件,用來描述數(shù)據(jù)源并以行集合的形式將信息展示給應(yīng)用程序。
下表列出了幾個通用數(shù)據(jù)源的 OLE DB 連接字符串:
數(shù)據(jù)源 OLE DB 連接字符串 Microsoft Access Provider=Microsoft.Jet.OLEDB.4.0;Source=指向 .mdb 文件的物理路徑 Microsoft SQL Server Provider=SQLOLEDB.1;Source=指向服務(wù)器上數(shù)據(jù)庫的路徑 Oracle Provider=MSDAORA.1;Source=指向服務(wù)器上數(shù)據(jù)庫的路徑 Microsoft Indexing Service Provider=MSIDXS.1;Source=指向文件的路徑
為了提供向后兼容,ODBC 的 OLE DB 提供者支持 ODBC 連接字符串語法。下表列出了通常使用的 ODBC 連接字符串:
數(shù)據(jù)源驅(qū)動程序 ODBC 連接字符串 Microsoft Access Driver={Microsoft Access Driver (*.mdb)};DBQ=指向 .mdb 文件的物理路徑 SQL Serverr Driver={SQL Server};SERVER=指向服務(wù)器的路徑 Oracle Driver={Microsoft ODBC for Oracle};SERVER=指向服務(wù)器的路徑 Microsoft Excel Driver={Microsoft Excel Driver (*.xls)};DBQ=指向 .xls 文件的物理路徑; DriverID =278 Microsoft Excel 97 Driver={Microsoft Excel Driver (*.xls)};DBQ=指向 .xls 文件的物理路徑;DriverID=790 Paradox Driver={Microsoft Paradox Driver (*.db)};DBQ=指向 .db 文件的物理路徑; DriverID=26 文本 Driver={Microsoft Text Driver (*.txt;*.csv)}; DefaultDir=指向 .txt 文件的物理路徑 Microsoft Visual FoxPro®(帶有一個數(shù)據(jù)庫容器) Driver={Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDb=指向 .dbc 文件的物理路徑 Microsoft Visual FoxPro(不帶數(shù)據(jù)庫容器) Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDb=指向 .dbf 文件的物理路徑
注意 (使用 UNC 路徑引用位于遠(yuǎn)程計算機(jī)上的數(shù)據(jù)源的)連接字符串可能造成潛在的安全問題。要禁止對您的數(shù)據(jù)源進(jìn)行未授權(quán)訪問,可為需要訪問數(shù)據(jù)的計算機(jī)創(chuàng)建 Windows 賬號,然后對數(shù)據(jù)源應(yīng)用適當(dāng)?shù)?NTFS 權(quán)限。詳細(xì)信息,請參閱使用 NTFS 保護(hù)文件。
設(shè)計 Web 數(shù)據(jù)應(yīng)用程序時應(yīng)考慮的高級問題 由于性能和可靠性的原因,我們強(qiáng)烈推薦,在配置數(shù)據(jù)驅(qū)動 Web 應(yīng)用程序(需要能滿足大約 10 個以上并發(fā)用戶同時進(jìn)行高要求的訪問)時,使用客戶端服務(wù)器數(shù)據(jù)庫引擎。雖然 ADO 適用于與 OLE DB 兼容的任何數(shù)據(jù)源,但經(jīng)過廣泛的測試,主要設(shè)計為與客戶端服務(wù)器數(shù)據(jù)庫(如 Microsoft SQL Server 或 Oracle)一起工作。
ASP 支持共享文件數(shù)據(jù)庫(Microsoft Access 或 Microsoft FoxPro)作為有效的數(shù)據(jù)源。雖然在 ASP 文檔中有些示例使用了“共享文件”數(shù)據(jù)庫,但我們還是建議這些類型的數(shù)據(jù)庫引擎只用于開發(fā)目的或有限的開發(fā)方案中。共享文件數(shù)據(jù)庫可能不如客戶端服務(wù)器數(shù)據(jù)庫更適合于高要求和高質(zhì)量的 Web 應(yīng)用程序。
如果正在開發(fā) ASP 數(shù)據(jù)庫應(yīng)用程序,并且該程序?qū)⑦B接到遠(yuǎn)程 SQL Server 數(shù)據(jù)庫,您還應(yīng)該注意以下幾點(diǎn):
選擇 SQL Server 連接方案 要訪問遠(yuǎn)程 SQL Server 數(shù)據(jù)庫,可以選擇 TCP/IP 套接字方法或已命名管道方法。使用已命名管道,必須在建立連接之前由 Windows 對數(shù)據(jù)庫客戶加以驗(yàn)證,以防止運(yùn)行已命名管道的遠(yuǎn)程計算機(jī)拒絕那些在該計算機(jī)上具有適當(dāng) SQL Server 訪問證書、但沒有 Windows 用戶賬號的用戶的訪問。作為另一個選擇,使用 TCP/IP 套接字的連接將直接連到數(shù)據(jù)庫服務(wù)器,而不通過中間計算機(jī)進(jìn)行連接。如果通過中間計算機(jī),則與使用已命名管道類似。而且由于使用 TCP/IP 套接字的連接會直接連到數(shù)據(jù)庫服務(wù)器,所以用戶可以通過 SQL Server 驗(yàn)證而不是 Windows 驗(yàn)證來獲得訪問。 ODBC 80004005 錯誤 如果訪問 SQL Server 的連接方案沒有正確設(shè)置,則正在查看數(shù)據(jù)庫應(yīng)用程序的用戶可能會收到 ODBC 80004005 錯誤的消息。要糾正這種情況,可使用本地的已命名管道連接代替網(wǎng)絡(luò)的已命名管道連接,但 SQL Server 與 IIS 需在同一計算機(jī)上運(yùn)行。Windows 2000 安全規(guī)則不會受到影響,因?yàn)榇斯艿朗潜镜剡B接而不是網(wǎng)絡(luò)連接,它可以由匿名用戶賬號來模擬。同樣,在 SQL Server 連接字符串(在 Global.asa 文件或網(wǎng)頁級腳本中)中,將參數(shù) SERVER=server name 更改為 SERVER=(local)。關(guān)鍵字 (local) 是由 SQL Server ODBC 驅(qū)動程序識別的特殊參數(shù)。如果該解決方案無法工作,那么請在 IIS 和 SQL Server 之間嘗試使用非驗(yàn)證協(xié)議,如 TCP/IP 套接字。當(dāng) SQL Server 在本地或遠(yuǎn)程計算機(jī)上運(yùn)行時,該協(xié)議將能夠工作。 注意 為了在連接到遠(yuǎn)程數(shù)據(jù)庫時提高性能,請使用 TCP/IP 套接字。
SQL Server 安全 如果使用 SQL Server 的“集成”或“混合”安全特性,并且 SQL Server 數(shù)據(jù)庫駐留在遠(yuǎn)程服務(wù)器上,那么您將無法使用集成的 Windows 驗(yàn)證。特別地,您無法將集成的 Windows 驗(yàn)證證書發(fā)送給遠(yuǎn)程計算機(jī)。這意味著您不得不使用基本驗(yàn)證,該驗(yàn)證需要用戶提供用戶名和密碼信息。 有關(guān)這些問題的詳細(xì)信息,請訪問位于 http://www.microsoft.com/china/support/ 的 Microsoft 產(chǎn)品支持服務(wù) Web 站點(diǎn)。
連接到數(shù)據(jù)源 ADO 提供了“Connection”對象,用于建立與管理應(yīng)用程序和 OLE DB 兼容數(shù)據(jù)源或 ODBC 兼容數(shù)據(jù)庫之間的連接。“Connection”對象的屬性和方法可以用來打開和關(guān)閉數(shù)據(jù)庫連接,并發(fā)布對更新信息的查詢。
要建立數(shù)據(jù)庫連接,首先必須創(chuàng)建“Connection”對象實(shí)例。例如,下面的腳本創(chuàng)建“Connection”對象實(shí)例,接著打開一個連接:
<% '創(chuàng)建 connection 對象 Set cnn = Server.CreateObject("ADODB.Connection") '使用 OLE DB 連接字符串打開連接 cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MarketData\ProjectedSales.mdb" %> 注意 連接字符串在等號 (=) 的左右并不包含空格。
在這種情況下,“Connection”對象的“Open”方法將引用連接字符串。
使用 Connection 對象執(zhí)行 SQL 查詢 使用“Connection”對象的“Execute”方法可以將命令發(fā)布到數(shù)據(jù)源,如結(jié)構(gòu)化查詢語言 (SQL) 查詢。(SQL 是與數(shù)據(jù)庫進(jìn)行通信的工業(yè)標(biāo)準(zhǔn)語言,定義了用來檢索和更新信息的命令。)“Execute”方法可以接收參數(shù),用來指定命令(或查詢)、受影響的數(shù)據(jù)記錄數(shù)和所使用命令的類型。
下面腳本使用“Execute”方法以 SQL “INSERT”命令的形式發(fā)布查詢,該命令用來將數(shù)據(jù)插入指定的數(shù)據(jù)庫表中。在這種情況下,腳本塊將名字“Jose Lugo”插入到名為“Customers”的數(shù)據(jù)庫表中。
<% '定義 OLE DB 連接字符串。 strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb"
'例示 Connection 對象并打開數(shù)據(jù)庫連接。 Set cnn = Server.CreateObject("ADODB.Connection") cnn.Open strConnectionString
'定義 SQL SELECT 語句。 strSQL = "INSERT INTO Customers (FirstName, LastName) VALUES ('Jose','Lugo')"
'使用 Execute 方法將 SQL 查詢發(fā)布到數(shù)據(jù)庫。 cnn.Execute strSQL,,adCmdText + adExecuteNoRecords %> 注意,在用來執(zhí)行查詢的語句中指定了兩個參數(shù):adCmdText 和 adExecuteNoRecords??蛇x參數(shù) adCmdText 指定命令類型,說明提供者必須將此查詢語句(這里是 SQL 查詢語句)評估為命令的文本定義。adExecuteNoRecords 參數(shù)指示 ADO 在沒有結(jié)果返回到應(yīng)用程序時不要創(chuàng)建數(shù)據(jù)記錄集。此參數(shù)只用于定義為文本定義(如 SQL 查詢)的命令類型,或已存儲的數(shù)據(jù)庫過程。雖然 adCmdText 和 adExecuteNoRecords 是可選參數(shù),但在使用“Execute”方法增強(qiáng)數(shù)據(jù)應(yīng)用程序性能時應(yīng)指定這兩個參數(shù)。
要點(diǎn) ADO 參數(shù),如 adCmdText,需要在腳本中先定義然后再使用。一個方便的定義參數(shù)的方法是使用“組件類型庫”,它是包含所有 ADO 參數(shù)定義的文件。要實(shí)施組件類型庫,首先應(yīng)聲明它。將下面的 <METADATA> 標(biāo)記添加到 .asp 文件或 Global.asa 文件中以聲明 ADO 類型庫:
<!--METADATA NAME="Microsoft ActiveX Data Objects 2.5 Library" TYPE="TypeLib" UUID="{00000205-0000-0010-8000-00AA006D2EA4}"--> 有關(guān)實(shí)施組件類型庫的詳細(xì)信息,請參閱使用變量和常量主題中的使用常量部分。
除了 SQL 的 INSERT 命令外,還可以使用 SQL 的 UPDATE 和 DELETE 命令來更改和刪除數(shù)據(jù)庫信息。
使用 SQL 的 UPDATE 命令可以更改數(shù)據(jù)庫表中各個項目的值。下面的腳本使用 UPDATE 命令將 Customers 表中所有在 LastName 字段中包含姓氏 Smith 的 FirstName 字段更改為 Jeff。
<% Set cnn = Server.CreateObject("ADODB.Connection") cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb" cnn.Execute "UPDATE Customers SET FirstName = 'Jeff' WHERE LastName = 'Smith' ",,adCmdText + adExecuteNoRecords %> 要刪除數(shù)據(jù)庫表中指定的記錄,可使用 SQL 的 DELETE 命令。下面的腳本將刪除 Customers 表中所有姓氏為 Smith 的行:
<% Set cnn = Server.CreateObject("ADODB.Connection") cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb" cnn.Execute "DELETE FROM Customers WHERE LastName = 'Smith'",,adCmdText + adExecuteNoRecords %> 注意 在使用 SQL DELETE 命令時務(wù)必小心謹(jǐn)慎。不帶 WHERE 子句的 DELETE 命令將刪除表中的所有行。確保包括 SQL WHERE 子句,以便明確指定要刪除的行。
使用 Recordset 對象處理結(jié)果 為了檢索數(shù)據(jù)、檢查結(jié)果和更改數(shù)據(jù)庫,ADO 提供了 Recordset 對象。正如名字所示,“Recordset”對象具有用來檢索和顯示數(shù)據(jù)庫行(或叫“記錄”)的功能,這取決于您的查詢約束條件。“Recordset”對象保留由查詢返回的每一條記錄的位置,這樣就能使您查看所有的結(jié)果,每次一條。
檢索記錄集 成功的 Web 數(shù)據(jù)應(yīng)用程序既使用“Connection”對象來建立鏈接,又使用“Recordset”對象來處理返回的數(shù)據(jù)。通過綜合使用這兩種對象的一些特殊功能,開發(fā)出的數(shù)據(jù)庫應(yīng)用程序幾乎可以執(zhí)行所有的數(shù)據(jù)處理任務(wù)。例如,下面的服務(wù)器端腳本使用“Recordset”對象執(zhí)行 SQL 的 SELECT 命令。此 SELECT 命令用來檢索基于查詢約束條件的信息集。此查詢也包含 SQL WHERE 子句,用來將查詢限制到一個指定的標(biāo)準(zhǔn)。在本例中,WHERE 子句將查詢限制在 Customers 數(shù)據(jù)庫表中姓氏字段包含 Smith 的所有記錄。
<% '建立數(shù)據(jù)源連接 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
'遍歷記錄集和顯示結(jié)果 '并使用 MoveNext 方法遞增記錄位置。 Set objFirstName = rstCustomers("FirstName") Set objLastName = rstCustomers("LastName") Do Until rstCustomers.EOF Response.Write objFirstName & " " & objLastName & "<BR>" rstCustomers.MoveNext Loop
%> 注意,在上例中,“Connection”對象建立數(shù)據(jù)庫連接,而“Recordset”對象使用同一連接從數(shù)據(jù)庫中檢索結(jié)果。當(dāng)需要精確配置建立數(shù)據(jù)庫鏈接的方式時,該方法非常有用。例如,如果要指定在連接中止之前的時間延遲,可能需要使用“Connection”對象設(shè)置該屬性。但是,如果只想使用 ADO 的默認(rèn)連接屬性建立連接,您可以使用“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
'遍歷記錄集,顯示結(jié)果, '并使用 MoveNext 方法遞增記錄位置。 Set objFirstName = rstCustomers("FirstName") Set objLastName = rstCustomers("LastName") Do Until rstCustomers.EOF Response.Write objFirstName & " " & objLastName & "<BR>" rstCustomers.MoveNext Loop %> 當(dāng)使用“Recordset”對象的“Open”方法來建立連接時,實(shí)際上正在隱含地使用“Connection”對象保護(hù)鏈接的安全。詳細(xì)信息,請參閱 Microsoft ActiveX 數(shù)據(jù)對象 (ADO) 文檔,可在 Microsoft Universal Data Access Web 站點(diǎn) http://www.microsoft.com/data/ 上找到該文檔。
注意 要明顯提高 ASP 數(shù)據(jù)庫應(yīng)用程序的性能,請考慮在“應(yīng)用程序”狀態(tài)中高速緩存記錄集。詳細(xì)信息,請參閱高速緩存數(shù)據(jù)。
統(tǒng)計記錄集中返回的記錄數(shù)有時候很有用。“Recordset”對象的“Open”方法使您能夠指定可選的光標(biāo)參數(shù),以確定潛在提供者檢索和瀏覽記錄集的方法。通過給用來執(zhí)行查詢的語句添加 adOpenKeyset 光標(biāo)參數(shù),可以使客戶端應(yīng)用程序完全地瀏覽記錄集。因此,應(yīng)用程序可使用 RecordCount 屬性精確地統(tǒng)計記錄集中的記錄數(shù)。請參看下面的示例:
<% 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 屬性進(jìn)行統(tǒng)計。 If rs.RecordCount >= 5 then Response.Write "我們已經(jīng)收到下面" & 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 "訂單數(shù)少于 " & rs.RecordCount & "。" End If
rs.Close %> 使用 Command 對象改善查詢 使用 ADO 的 Command 對象執(zhí)行查詢的方式與使用“Connection”和“Recordset”對象執(zhí)行查詢的方式一樣,但是使用“Command”對象可以準(zhǔn)備(或編譯)對數(shù)據(jù)庫源的查詢,然后使用各種不同的值重復(fù)發(fā)送此查詢。用這種方法編譯查詢的好處在于,當(dāng)您需要重新發(fā)布修改過的已有查詢時,可以大大地減少發(fā)布時間。另外,還可以留下部分 SQL 查詢不進(jìn)行定義,用到了在執(zhí)行之前改變查詢部分的選項。
“Command”對象的“Parameters”集合可以使您避免每次重新發(fā)布查詢時都要重建查詢的麻煩。例如,如果您需要定期更新基于 Web 的庫存系統(tǒng)的供應(yīng)和費(fèi)用信息,就可以按照下面的方式預(yù)定義查詢:
<% '使用 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 對象首次執(zhí)行之前保存在 CommandText 屬性 '中指定的查詢的預(yù)備(或預(yù)編譯)版本。 cmn.Prepared = True
'定義查詢參數(shù)配置信息。 cmn.Parameters.Append cmn.CreateParameter("material_type",adVarChar, ,255 ) cmn.Parameters.Append cmn.CreateParameter("quantity",adVarChar, ,255 )
'定義并執(zhí)行第一個插入操作。 cmn("material_type") = "日光燈泡" cmn("quantity") = "40" cmn.Execute ,,adCmdText + adExecuteNoRecords
'定義并執(zhí)行第二個插入操作。 cmn("material_type") = "保險絲" cmn("quantity") = "600" cmn.Execute ,,adCmdText + adExecuteNoRecords . . . %> 要點(diǎn) ADO 參數(shù)(如 adCmdText)是一些簡單變量,這意味著在使用數(shù)據(jù)訪問腳本中的 ADO 參數(shù)之前需要先定義參數(shù)值。由于 ADO 使用了大量的參數(shù),因此通過“組件類型庫”來定義參數(shù)更容易些,組件類型庫是包含所有 ADO 參數(shù)和常量定義的文件。有關(guān)實(shí)施 ADO 類型庫的詳細(xì)信息,請參閱使用變量和常量主題中的使用常量部分。
在上例中,您將注意到腳本使用不同的值重復(fù)構(gòu)建和重新發(fā)布 SQL 查詢,但并沒有重新定義并重新發(fā)送查詢到數(shù)據(jù)庫源中。使用“Command”命令編譯查詢也有如下優(yōu)點(diǎn):可避免當(dāng)將字符串和變量連接成 SQL 查詢時引起問題。特別地,使用“Command”對象的“Parameter”集合,您可以避免那些與定義特定類型字符串、日期和時間變量相關(guān)的問題。例如,包含單引號 (') 的 SQL 查詢值可能導(dǎo)致查詢失?。?
strSQL = "INSERT INTO Customers (FirstName, LastName) VALUES ('Robert','O'Hara')" 注意,姓氏“O'Hara”包含一個單引號,這與用來表示 SQL VALUES 關(guān)鍵字中數(shù)據(jù)的單引號沖突。通過將查詢值約束為“Command”對象參數(shù)可以避免此類問題。
合并 HTML 表單和數(shù)據(jù)庫訪問 包含 HTML 表單的 Web 頁可允許用戶遠(yuǎn)程查詢數(shù)據(jù)庫并檢索指定的信息。使用 ADO 您可以創(chuàng)建出非常簡單的用來收集用戶表單信息的腳本、創(chuàng)建自定義的數(shù)據(jù)庫查詢并將信息返回給用戶。使用 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 (?)"
'定義查詢參數(shù)配置信息。 cmn.Parameters.Append cmn.CreateParameter("type",adVarChar, ,255)
'指派輸入值并執(zhí)行更新。 cmn("type") = Request.Form("SeedType") cmn.Execute ,,adCmdText + adExecuteNoRecords %> 有關(guān)表單和使用 ASP“Request”對象的詳細(xì)信息,請參閱處理用戶輸入。
管理數(shù)據(jù)庫連接 設(shè)計完善的 Web 數(shù)據(jù)庫應(yīng)用程序(如服務(wù)成千上萬個客戶的聯(lián)機(jī)訂購輸入應(yīng)用程序)的一個主要挑戰(zhàn)就是如何正確管理數(shù)據(jù)庫連接。打開并維護(hù)數(shù)據(jù)庫連接,尤其是當(dāng)沒有信息傳輸時也要打開和維護(hù),會嚴(yán)重消耗數(shù)據(jù)庫服務(wù)器的資源并導(dǎo)致連接性問題。設(shè)計良好的 Web 數(shù)據(jù)庫應(yīng)用程序可重復(fù)利用數(shù)據(jù)庫連接并補(bǔ)償因網(wǎng)絡(luò)通信量導(dǎo)致的延遲。
超時連接 數(shù)據(jù)庫服務(wù)器當(dāng)活動突然激增時會產(chǎn)生積壓,同時大大增加建立數(shù)據(jù)庫連接所需的時間。因此,過多的連接延遲會降低數(shù)據(jù)庫應(yīng)用程序的性能。
使用“Connection”對象的“ConnectionTimeout”可以限制應(yīng)用程序在放棄連接嘗試并發(fā)布錯誤消息之前等待的時間數(shù)。例如,下面的腳本將“ConnectionTimeout”屬性設(shè)置為在取消連接嘗試之前等待 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”屬性默認(rèn)為 30 秒。
注意 在將“ConnectionTimeout”屬性并入數(shù)據(jù)庫應(yīng)用程序之前,請確保您的連接提供者和數(shù)據(jù)源支持該屬性。
共用連接 連接池可使您的 Web 應(yīng)用程序使用“池”中的連接,“池”指的是包含許多不需要重新建立的自由連接的容器。創(chuàng)建連接并放入連接池中后,應(yīng)用程序可以重復(fù)使用該連接而不必執(zhí)行連接進(jìn)程。這可明顯地提高性能,特別是在應(yīng)用程序通過網(wǎng)絡(luò)連接或需要重復(fù)連接和斷開的情況下更是如此。另外,共用的連接可被多個應(yīng)用程序重復(fù)使用。
OLE DB 會話池 OLE DB 具有一個共用特性,稱為“會話池”,用來提高大型 Web 數(shù)據(jù)庫應(yīng)用程序的活動性能。會話池保護(hù)連接安全和一些其他屬性。共用的連接只在連接兩端提出匹配的請求時才可重新使用。默認(rèn)情況下,Microsoft SQL server 和 Oracle 的 OLE DB 提供者支持會話池。這意味著并不需要配置應(yīng)用程序、服務(wù)器或數(shù)據(jù)庫即可使用會話池。然而,如果提供者默認(rèn)情況下不支持會話池,則需要創(chuàng)建注冊表設(shè)置以啟用會話池。關(guān)于會話池的詳細(xì)信息,請參閱 OLE DB 2.0 Software Development Kit (SDK) 文檔。
ODBC 連接池 如果希望 ODBC 驅(qū)動程序分享連接池,您必須配置特定的數(shù)據(jù)庫驅(qū)動程序,然后在 Windows 注冊表中設(shè)置驅(qū)動程序的“CPTimeout”屬性。“CPTimeout”屬性確定連接在連接池中保留的時間長度。如果連接在池中保留的時間超過“CPTimeout”設(shè)置的持續(xù)時間,連接將關(guān)閉并從池中刪除。“CPTimeout”的默認(rèn)值是 60 秒。
通過創(chuàng)建帶有下面設(shè)置的注冊表鍵值,您可以有選擇地設(shè)置“CPTimeout”屬性以啟用特定 ODBC 數(shù)據(jù)庫驅(qū)動程序的連接池:
\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\driver-name\CPTimeout = 超時數(shù) (REG_SZ, 以秒為單位)
例如,下面的鍵值將 SQL Server 驅(qū)動程序的連接池超時設(shè)置為 180 秒(3 分鐘)。
\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\SQL Server\CPTimeout = 180 注意 默認(rèn)情況下,Web 服務(wù)器激活 SQL Server 的連接池并將“CPTimeout”設(shè)置為 60 秒。
使用跨多頁的連接 雖然可以通過將連接儲存在 ASP 的“Application”對象中來重復(fù)使用跨多頁的連接,但這樣做可能導(dǎo)致不必要地保持打開的連接,并且可能損害使用連接池的優(yōu)勢。如果有許多用戶需要連接到同一 ASP 應(yīng)用程序,一種更好的方法是重復(fù)使用跨多個 Web 頁的數(shù)據(jù)庫連接字符串,只需將字符串放置到 ASP 的“Application”對象中即可。例如,您可以在 Global.asa 文件的 Application_OnStart 事件過程中指定連接字符串,如下面的腳本所示:
Application("ConnectionString") = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb"
然后在每一個訪問數(shù)據(jù)庫的 ASP 文件中,寫入
<OBJECT RUNAT=SERVER ID=cnn PROGID="ADODB.Connection"></OBJECT> 以創(chuàng)建該頁的連接對象實(shí)例,并使用腳本
cnn.Open Application("ConnectionString") 打開該連接。要關(guān)閉連接,在該頁的末尾可以使用
cnn.Close 在個別用戶需要重復(fù)使用跨多個 Web 頁連接的情況下,您將發(fā)現(xiàn)使用“Session”對象儲存連接字符串比使用“Application”對象更具優(yōu)勢。
關(guān)閉連接 要充分利用連接池,請盡可能顯式關(guān)閉數(shù)據(jù)庫連接。默認(rèn)情況下,連接在腳本執(zhí)行完后終止。然而,通過顯式關(guān)閉腳本已不再需要的連接,您可以減少對數(shù)據(jù)庫服務(wù)器的要求,并使得其他用戶可以使用該連接。
可以使用“Connection”對象的“Close”方法顯式終止“Connection”對象和數(shù)據(jù)庫之間的連接。下面的腳本將打開和關(guān)閉連接:
<% strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb" Set cnn = Server.CreateObject("ADODB.Connection") cnn.Open strConnectionString cnn.Close %>
|