📄 访问数据库 (2001年1月20日).txt
字号:
%>
注意,在前面的例子中,用来建立数据库连接的 Connection 对象和 Recordset 对象使用该连接从数据库中检索结果。当您需要精确地设置和数据库建立链接所采用的方式时,这个方法是非常有用的。例如,如果您需要在连接尝试失败之前指定等待的时间,则需要使用 Connection 对象去设置属性。但是,如果您仅仅想使用 ADO 默认的连接属性建立连接,则应该使用 Recordset 对象的 Open 方法去建立链接:
lt;%
strDSN = "FILEDSN=MyDatabase.dsn"
strSQL = "SELECT FirstName, LastName FROM Customers WHERE LastName = 'Smith' "
Set rsCustomers = Server.CreateObject("ADODB.Recordset")
'Open a connection using the Open method
'and use the connection established by the Connection object
rsCustomers.Open strSQL, strDSN
'Cycle through the record set, display the results,
' and increment record position with MoveNext method
Set objFirstName = rsCustomers("FirstName")
Set objLastName = rsCustomers("LastName")
Do Until rsCustomers.EOF
Response.Write objFirstName & " " & objLastName & "
"
rsCustomers.MoveNext
Loop
%>
当使用 Recordset 对象的 Open 方法建立一个连接时,必须使用 Connection 对象去保证链接的安全。详细信息,请参阅 Microsoft ActiveX Data Objects (ADO)。
用 Command 对象改善查询
通过 ADO Command 对象,可以象用 Connection 对象和 Recordset 对象那样执行查询,唯一的不同在于用 Command 对象您可以在数据库源上准备、编译您的查询并且反复使用一组不同的值来发出查询。这种方式的编译查询的优点是您可以最大程度地减少向现有查询重复发出修改的请求所需的时间。另外,您还可以在执行之前通过您的查询的可变部分的选项使 SQL 查询保持局部未定义。
Command 对象的 parameter 集合减少了您的麻烦,使您不必在每次重新发出查询时重新建立查询。例如,如果需要有规律地更新基于库存清单的 Web 系统中的供应和价格信息,可以用下面的方法预先定义查询:
lt;%
'Open a connection using Connection object Command object
'does not have an Open method for establishing a connection
strDSN = "FILEDSN=MyDatabase.dsn"
Set cn = Server.CreateObject("ADODB.Connection")
cn.Open strDSN
'Instantiate Command object; use ActiveConnection property to attach
'connection to Command object
Set cm= Server.CreateObject("ADODB.Command")
Set cm.ActiveConnection = cn
'Define SQL query
cm.CommandText = "INSERT INTO Inventory (Material, Quantity) VALUES (?, ?)"
'Save a prepared (or pre-compiled) version of the query specified in CommandText
'property before a Command object's first execution.
cm.Prepared = True
'Define query parameter configuration information
cm.Parameters.Append cm.CreateParameter("material_type",200, ,255 )
cm.Parameters.Append cm.CreateParameter("quantity",200, ,255 )
'Define and execute first insert
cm("material_type") = "light bulbs"
cm("quantity") = "40"
cm.Execute
'Define and execute second insert
cm("material_type") = "fuses"
cm("quantity") = "600"
cm.Execute
%>
请检查上面的例子,您将注意到,脚本用不同的数值重复构建和发出一个 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 集合收集用户信息。
lt;%
'Open a connection using Connection object. The Command object
'does not have an Open method for establishing a connection
strDSN = "FILEDSN=MyDatabase.dsn"
Set cn = Server.CreateObject("ADODB.Connection")
cn.Open strDSN
'Instantiate Command object
'and use ActiveConnection property to attach
'connection to Command object
Set cm= Server.CreateObject("ADODB.Command")
Set cm.ActiveConnection = cn
'Define SQL query
cm.CommandText = "INSERT INTO MySeedsTable (Type) VALUES (?)"
'Define query parameter configuration information
cm.Parameters.Append cm.CreateParameter("type",200, ,255 )
'Define and execute insert
cm("type") = Request("SeedType")
cm.Execute
%>
有关表格和使用 ASP Request 对象的详细信息,请参阅 使用 HTML 表格。
管理数据库连接
设计一个能经得起考验的 Web 数据库应用程序(例如为几千个客户服务的联机购物应用程序)的最大挑战,在于如何合理地管理数据库连接。打开并且保持数据库连接,即使在没有信息传输时,也会严重耗费数据库服务器的资源并且可能会导致连接性问题。设计良好的 Web 数据库应用程序将回收数据库连接并能够补偿由于网络堵塞造成的延迟。
使连接超时
活动的突然增长可能使数据库服务器变得十分笨拙,大量增加建立数据库连接的时间。结果是,过长的连接延时将降低数据库的性能。
用 Connection 对象的 ConnectionTimeout,您可以限制放弃连接尝试并发出错误消息之前应用程序等待的时间。例如,下面的脚本设置 ConnectionTimeout 属性,在取消连接尝试之前等待 20 秒:
Set cn = Server.CreateObject("ADODB.Connection")
cn.ConnectionTimeout = 20
cn.Open "FILEDSN=MyDatabase.dsn"
默认的 ConnectionTimeout 属性是 30 秒。
注意 在将 ConnectionTimeout 属性合并到数据库应用程序之前,一定要确保连接提供程序和数据源支持该属性。
共享连接
经常建立和中断数据库连接的 Web 数据库应用程序可能会降低数据库服务器的性能。ASP 支持用 ODBC 3.5 的共享特性有效管理连接。连接共享维持打开的数据库连接并管理不同的用户共享该连接,以维持其性能和减少空闲的连接数。对每一个连接请求,连接池首先确定池中是否存在空闲的连接。如果存在,连接池返回连接而不是建立到数据库的新连接。
如果希望将 ODBC 驱动程序加入到连接共享中,则必须配置数据库驱动程序并在 Windows NT 注册表中设置驱动程序的 CPTimeout 属性。当 ODBC 断开连接时,连接被存入池中,而不是被断开。CPTimeout 属性决定在连接池中的连接保留的时间长度。如果在池中连接保留的时间比 CPTimeout 设置的时间长,则连接将被关闭并且从池中删除。CPTimeout 的默认值是 60 秒。
您可以通过创建如下设置的注册表键来有选择地设置 CPTimeout 的属性,从而启用特定 ODBC 数据库驱动程序的连接池:
\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\driver-name\CPTimeout = timeout
(REG_SZ, units are in seconds)
例如,下面的键将 SQL Server 驱动程序的连接池的超时设置定为 180 秒(3 分钟)。
\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\SQL Server\CPTimeout = 180
注意 默认情况下,通过将 CPTimeout 设置为 60 秒,Web 服务器将激活 SQL Server 的连接池。
使用跨页连接
尽管您可以通过存储 ASP 的 Application 对象的连接重复使用跨页连接,但是,始终使连接保持打开是不必要的,也没有充分利用连接池的优点。如果有许多用户需要连接到同一个 ASP 数据库应用程序,一个好方法就是,将跨页连接字符串置于 ASP 的 Application 对象中,重复使用数据库连接。例如,可以在 Global.asa 文件的 Application_OnStart 事件过程中指定连接字符串,如下面的脚本所示:
Application.lock
Application("ConnectionString") = "FILEDSN=MyDatabase.dsn"
Application.unlock
然后,在每一个访问数据库的 ASP 文件中写入:
要想创建连接对象的实例,请使用以下脚本:
cn.Open Application("ConnectionString")
对于打开的连接,可以在页尾写入以下脚本,关闭连接:
cn.Close
在单个用户需要重复使用跨页连接的情况下,使用 Session 对象连接比使用 Application 对象更好。
关闭连接
要想更好地使用连接池,就应尽快地关闭数据库连接。默认情况下,当脚本执行完以后,连接将被终止。当不再需要连接时将其关闭,就可以减少对数据库服务器的要求并可以使其他用户能够使用该连接。
可以使用 Connection 对象的 Close 方法终止 Connection 对象和数据库之间的连接。下面的脚本打开连接,然后将其关闭:
lt;% strDSN = "FILEDSN=MyDatabase.dsn"
Set cn = Server.CreateObject("ADODB.Connection")
cn.Open
cn.Close
%>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -