?? page11.htm
字號:
<p>rsCustomers.Open strSQL, cn </p>
<p> </p>
<p>'Cycle through record set and display the results</p>
<p>' and increment record position with MoveNext method</p>
<p>Set objFirstName = rsCustomers("FirstName") </p>
<p>Set objLastName = rsCustomers("LastName") </p>
<p>Do Until rsCustomers.EOF </p>
<p>Response.Write objFirstName & " " & objLastName &
"<BR>"</p>
<p>rsCustomers.MoveNext</p>
<p>Loop</p>
<p>%></p>
<p>注意,在前面的例子中,用來建立數據庫連接的 Connection 對象和
Recordset
對象使用該連接從數據庫中檢索結果。當您需要精確地設置和數據庫建立鏈接所采用的方式時,這個方法是非常有用的。例如,如果您需要在連接嘗試失敗之前指定等待的時間,則需要使用
Connection 對象去設置屬性。但是,如果您僅僅想使用 ADO
默認的連接屬性建立連接,則應該使用 Recordset 對象的 Open
方法去建立鏈接:</p>
<p><%</p>
<p>strDSN = "FILEDSN=MyDatabase.dsn"</p>
<p>strSQL = "SELECT FirstName, LastName FROM Customers WHERE LastName = 'Smith'
"</p>
<p>Set rsCustomers = Server.CreateObject("ADODB.Recordset")</p>
<p>'Open a connection using the Open method</p>
<p>'and use the connection established by the Connection object</p>
<p>rsCustomers.Open strSQL, strDSN </p>
<p> </p>
<p>'Cycle through the record set, display the results,</p>
<p>' and increment record position with MoveNext method</p>
<p>Set objFirstName = rsCustomers("FirstName") </p>
<p>Set objLastName = rsCustomers("LastName") </p>
<p>Do Until rsCustomers.EOF</p>
<p>Response.Write objFirstName & " " & objLastName &
"<BR>"</p>
<p>rsCustomers.MoveNext</p>
<p>Loop</p>
<p>%></p>
<p>當使用 Recordset 對象的 Open 方法建立一個連接時,必須使用
Connection 對象去保證鏈接的安全。詳細信息,請參閱 Microsoft ActiveX
Data Objects (ADO)。</p>
<p>用 Command 對象改善查詢</p>
<p>通過 ADO Command 對象,可以象用 Connection 對象和 Recordset
對象那樣執行查詢,唯一的不同在于用 Command
對象您可以在數據庫源上準備、編譯您的查詢并且反復使用一組不同的值來發出查詢。這種方式的編譯查詢的優點是您可以最大程度地減少向現有查詢重復發出修改的請求所需的時間。另外,您還可以在執行之前通過您的查詢的可變部分的選項使
SQL 查詢保持局部未定義。</p>
<p>Command 對象的 parameter
集合減少了您的麻煩,使您不必在每次重新發出查詢時重新建立查詢。例如,如果需要有規律地更新基于庫存清單的
Web 系統中的供應和價格信息,可以用下面的方法預先定義查詢:</p>
<p><% </p>
<p>'Open a connection using Connection object Command object</p>
<p>'does not have an Open method for establishing a connection</p>
<p>strDSN = "FILEDSN=MyDatabase.dsn" </p>
<p>Set cn = Server.CreateObject("ADODB.Connection")</p>
<p>cn.Open strDSN</p>
<p>'Instantiate Command object; use ActiveConnection property to attach </p>
<p>'connection to Command object</p>
<p>Set cm= Server.CreateObject("ADODB.Command")</p>
<p>Set cm.ActiveConnection = cn</p>
<p> </p>
<p>'Define SQL query</p>
<p>cm.CommandText = "INSERT INTO Inventory (Material, Quantity) VALUES (?, ?)" </p>
<p>'Save a prepared (or pre-compiled) version of the query specified in CommandText</p>
<p>'property before a Command object's first execution. </p>
<p>cm.Prepared = True</p>
<p>'Define query parameter configuration information</p>
<p>cm.Parameters.Append cm.CreateParameter("material_type",200, ,255 )</p>
<p>cm.Parameters.Append cm.CreateParameter("quantity",200, ,255 )</p>
<p>'Define and execute first insert</p>
<p>cm("material_type") = "light bulbs" </p>
<p>cm("quantity") = "40" </p>
<p>cm.Execute</p>
<p> </p>
<p>'Define and execute second insert</p>
<p>cm("material_type") = "fuses" </p>
<p>cm("quantity") = "600" </p>
<p>cm.Execute</p>
<p>%></p>
<p>請檢查上面的例子,您將注意到,腳本用不同的數值重復構建和發出一個
SQL 查詢,而沒有重新定義和重發送查詢到數據庫源。用 Command
對象編譯查詢也可避免 SQL
查詢引起的合并字符串和表格變量問題。特別是,通過使用 Command
對象的 Parameter
集合可以避免與定義字符串、日期、時間變量的類型有關的問題。例如,包含“'”的
SQL 查詢值可能導致查詢失?。?lt;/p>
<p>strSQL = "INSERT INTO Customers (FirstName, LastName) VALUES
('Robert','O'Hara')" </p>
<p>注意,姓 O'Hara 中包含一個“'”,它與在 SQL VALUES
關鍵字中用來表示數據的“'”沖突。通過將查詢數值作為 Command
對象參數綁定,可以避免此類問題。</p>
<p><strong>結合 HTML 表格和數據庫訪問</strong></p>
<p>包含 HTML 表格的 Web
頁可使用戶遠程查詢數據庫并且檢索特定的信息。用 ADO
您可以創建非常簡單的腳本來收集用戶表格信息、創建自定義的數據庫查詢以及將信息返回給用戶。使用
ASP Request 對象,您可以檢索輸入到 HTML
表格的信息并將這些信息合并到 SQL
語句中。例如,下面的腳本模塊將 HTML
表格提供的信息插入表格中。此腳本用 Request 對象的 Form
集合收集用戶信息。</p>
<p><%</p>
<p>'Open a connection using Connection object. The Command object</p>
<p>'does not have an Open method for establishing a connection</p>
<p>strDSN = "FILEDSN=MyDatabase.dsn" </p>
<p>Set cn = Server.CreateObject("ADODB.Connection")</p>
<p>cn.Open strDSN</p>
<p>'Instantiate Command object</p>
<p>'and use ActiveConnection property to attach </p>
<p>'connection to Command object</p>
<p>Set cm= Server.CreateObject("ADODB.Command")</p>
<p>Set cm.ActiveConnection = cn</p>
<p> </p>
<p>'Define SQL query</p>
<p>cm.CommandText = "INSERT INTO MySeedsTable (Type) VALUES (?)" </p>
<p>'Define query parameter configuration information</p>
<p>cm.Parameters.Append cm.CreateParameter("type",200, ,255 )</p>
<p>'Define and execute insert</p>
<p>cm("type") = Request("SeedType") </p>
<p>cm.Execute</p>
<p>%></p>
<p>有關表格和使用 ASP Request 對象的詳細信息,請參閱 使用 HTML
表格。</p>
<p><strong>管理數據庫連接</strong></p>
<p>設計一個能經得起考驗的 Web
數據庫應用程序(例如為幾千個客戶服務的聯機購物應用程序)的最大挑戰,在于如何合理地管理數據庫連接。打開并且保持數據庫連接,即使在沒有信息傳輸時,也會嚴重耗費數據庫服務器的資源并且可能會導致連接性問題。設計良好的
Web
數據庫應用程序將回收數據庫連接并能夠補償由于網絡堵塞造成的延遲。</p>
<p><strong>使連接超時</strong></p>
<p>活動的突然增長可能使數據庫服務器變得十分笨拙,大量增加建立數據庫連接的時間。結果是,過長的連接延時將降低數據庫的性能。</p>
<p>用 Connection 對象的 ConnectionTimeout,您可以限制放棄連接嘗試并發出錯誤消息之前應用程序等待的時間。例如,下面的腳本設置
ConnectionTimeout 屬性,在取消連接嘗試之前等待 20 秒:</p>
<p>Set cn = Server.CreateObject("ADODB.Connection")</p>
<p>cn.ConnectionTimeout = 20</p>
<p>cn.Open "FILEDSN=MyDatabase.dsn"</p>
<p>默認的 ConnectionTimeout 屬性是 30 秒。</p>
<p>注意 在將 ConnectionTimeout
屬性合并到數據庫應用程序之前,一定要確保連接提供程序和數據源支持該屬性。</p>
<p><strong>共享連接</strong></p>
<p>經常建立和中斷數據庫連接的 Web
數據庫應用程序可能會降低數據庫服務器的性能。ASP 支持用 ODBC 3.5
的共享特性有效管理連接。連接共享維持打開的數據庫連接并管理不同的用戶共享該連接,以維持其性能和減少空閑的連接數。對每一個連接請求,連接池首先確定池中是否存在空閑的連接。如果存在,連接池返回連接而不是建立到數據庫的新連接。</p>
<p>如果希望將 ODBC
驅動程序加入到連接共享中,則必須配置數據庫驅動程序并在 Windows
NT 注冊表中設置驅動程序的 CPTimeout 屬性。當 ODBC
斷開連接時,連接被存入池中,而不是被斷開。CPTimeout
屬性決定在連接池中的連接保留的時間長度。如果在池中連接保留的時間比
CPTimeout 設置的時間長,則連接將被關閉并且從池中刪除。CPTimeout
的默認值是 60 秒。</p>
<p>您可以通過創建如下設置的注冊表鍵來有選擇地設置 CPTimeout
的屬性,從而啟用特定 ODBC 數據庫驅動程序的連接池:</p>
<p> </p>
<p>\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\driver-name\CPTimeout = timeout </p>
<p>(REG_SZ, units are in seconds)</p>
<p>例如,下面的鍵將 SQL Server 驅動程序的連接池的超時設置定為 180
秒(3 分鐘)。</p>
<p>\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\SQL Server\CPTimeout = 180</p>
<p>注意 默認情況下,通過將 CPTimeout 設置為 60 秒,Web 服務器將激活
SQL Server 的連接池。</p>
<p><strong>使用跨頁連接</strong></p>
<p>盡管您可以通過存儲 ASP 的 Application
對象的連接重復使用跨頁連接,但是,始終使連接保持打開是不必要的,也沒有充分利用連接池的優點。如果有許多用戶需要連接到同一個
ASP 數據庫應用程序,一個好方法就是,將跨頁連接字符串置于 ASP 的
Application 對象中,重復使用數據庫連接。例如,可以在 Global.asa
文件的 Application_OnStart
事件過程中指定連接字符串,如下面的腳本所示:</p>
<p> </p>
<p>Application.lock</p>
<p>Application("ConnectionString") = "FILEDSN=MyDatabase.dsn"</p>
<p>Application.unlock</p>
<p>然后,在每一個訪問數據庫的 ASP 文件中寫入:</p>
<p><OBJECT RUNAT=Server ID=cn PROGID="ADODB.Connection"> </OBJECT></p>
<p>要想創建連接對象的實例,請使用以下腳本:</p>
<p>cn.Open Application("ConnectionString")</p>
<p>對于打開的連接,可以在頁尾寫入以下腳本,關閉連接:</p>
<p>cn.Close</p>
<p>在單個用戶需要重復使用跨頁連接的情況下,使用 Session
對象連接比使用 Application 對象更好。 </p>
<p><strong>關閉連接</strong></p>
<p>要想更好地使用連接池,就應盡快地關閉數據庫連接。默認情況下,當腳本執行完以后,連接將被終止。當不再需要連接時將其關閉,就可以減少對數據庫服務器的要求并可以使其他用戶能夠使用該連接。</p>
<p>可以使用 Connection 對象的 Close 方法終止 Connection
對象和數據庫之間的連接。下面的腳本打開連接,然后將其關閉:</p>
<p><% strDSN = "FILEDSN=MyDatabase.dsn"</p>
<p>Set cn = Server.CreateObject("ADODB.Connection")</p>
<p>cn.Open </p>
<p>cn.Close</p>
<p>%></font></p>
<layer src="http://www.spidersoft.com/ads/bwz468_60.htm" visibility=hidden id=a1 width=600 onload="moveToAbsolute(ad1.pageX,ad1.pageY); a1.clip.height=60;visibility='show';"></layer>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -