分类
ASP访问数据库 如何配置数据库文件DSN‖
| ActiveX Data Objects 页的技术。可以使用 ADO (ODBC) 兼容的数据库和 OL 本编写人员,那么您将发现 验丰富的数据库编程人员, | (ADO) 是一项容易使用并且可 去编写紧凑简明的脚本以便连接 E DB 兼容的数据源。如果您是 ADO 命令语句并不复杂而且容 您将会正确认识 ADO 的先进的 | 扩展的将数据库访问添加到 Web 到 Open Database Connectivity 一个对数据库连接有一定了解的脚 易掌握。同样地,如果您是一个经 与语言无关性和查询处理功能。 |
| 创建 ODBC DSN 文件 |
| 在创建数据库脚本之前 库驱动程序使用 Data Sour Web 应用程序传递给数据库 可以获取 Windows NT 注册 | ,必须提供一条使 ADO 定位、 ce Name (DSN) 定位和标识特定 。典型情况下,DSN 包含数据库 表项中或文本文件的表格。 | 标识和与数据库通讯的途径。数据 的 ODBC 兼容数据库,将信息从 配置、用户安全性和定位信息,且 |
| 通过 ODBC,您可以选 DSN 存储在 Windows NT 注 数据库,而用户 DSN 使用 于从文本文件中获取表格, 一个服务器转移到另一个服 | 择希望创建的 DSN 的类型:用 册表中。系统 DSN 允许所有的 适当的安全身份证明限制数据库 提供了对多用户的访问,并且通 务器。由于以上原因,本主题中 | 户、系统或 文件。用户和系统 用户登录到特定的服务器上去访问 到特定用户的连接。文件 DSN 用 过复制 DSN 文件,可以轻易地从 的示例将使用文件 DSN。 |
| 通过在 Windows 的“开始”菜单打 击“ODBC”图标,然后选择“文件 DSN” 单击“下一步”。按照后面的指示配置适 | 开“控制面板”,您可以创建基于 DSN 的文件。双 属性页,单击“添加”,选择数据库驱动程序,然后 用于您的数据库软件的 DSN。 |
| 配置 Microsoft Access 数据库的文件 DSN |
| 在“创建新数据源”对话框中,从列 “下一步”。键入您的 DSN 文件名,然 ODBC Microsoft Access 97 安装程序” 数据库文件 (*.mdb),然后单击“确定” | 表框选择“Microsoft Access Driver”,然后单击 后单击“下一步”。单击“完成”创建数据源。在“ 对话框中,单击“选择”。选择 Microsoft Access 。 |
| 注意由于性能和可靠性 这样一种 Web 应用程序驱 访问。尽管 ASP 可以使用 计的,而且经过了严格的测 | 的原因,我们极力推荐您使用“ 动的数据,这些 Web 应用程序 任何 ODBC 兼容的数据库,但它 试,这些数据库包括 Microsoft | 客户-服务器数据库引擎”配置由 必须满足 10 个以上的用户的同时 是为使用客户-服务器数据库而设 ? SQL Server、Oracle 等。 |
| ASP 支持共享文件数据库(如 Micro 的数据源。尽管在 ASP 文档中的一些示 引擎用于开发或有限的配置方案。共享文 量的 Web 应用程序的客户-服务器数据库 | soft ? Access 或 Microsoft ? FoxPro)作为有效 例使用共享文件数据库,但我们建议只将此类数据库 件数据库可能无法很好地适用于可满足高需求、高质 。 |
| 配置 SQL Server 数据库文件 DSN |
| 注意如果数据库驻留在 面的过程使用 SQL Server 数据源”对话框中,从列表 的名称,然后单击“下一步 的名称、登录 ID 和密码。 框中键入包含 SQL Server 的方式。如果要选择 SQL 在“创建 SQL Server 的新 ANSI 标识,然后单击“下 名为“创建 SQL Server 的 (详细信息,请单击“帮助 ”)中,选择登录设置。 “ODBC Microsoft SQL Ser 创建,“测试结果”对话框 | 远程服务器上,请与服务器管理 的 ODBC 默认的设置,它可能不 框中选择“SQL Server”,然后 ”。单击“完成”创建数据源。 在“创建 SQL Server 的新数据 数据库的服务器的名称,然后单 服务器验证,请输入一个登录 I 数据源”对话框中,设置默认数 一步”。(要获取详细信息,请 新数据源”)中,选择一种字符 ”。)在下一个对话框(同样名 注意典型情况下, 您只能使用 ver 安装程序”对话框中,单击 将指出测试成功完成。 | 员联系,获取附加的配置信息;下 适用于您的硬件配置。在“创建新 单击“下一步”。键入 DSN 文件 键入运行 SQL 服务程序的服务器 源”对话框中,在“服务器”列表 击“下一步”。选择验证登录 ID D 和密码,然后单击“下一步”。 据库、存储过程设置的驱动程序和 单击“帮助”。)在对话框(同样 转换方法,然后单击“下一步”。 为“创建 SQL Server 的新数据源 日志来调试数据库访问问题。 在 “测试数据源”。如果 DSN 正确 |
| SQL server 连接和安全信息 |
| 如果您正在开发用于连 问题: | 接远程 SQL Server 数据库的 A | SP 数据库应用程序,应考虑以下 |
| 连接方案- 您可以选择 。当使用命名管道时,因为 有适当的 SQL Server 访问 绝访问命名管道。作为一种 ,而不必通过使用命名管道 server,所以通过 SQL Se 的确认。 | TCP/IP 套接字和命名管道的方 在建立连接之前,数据库用户必 身份而在该计算机上没有 Windo 替代方案,使用 TCP/IP 套接字 的中间计算机。因为使用 TCP/I rver 的确认,用户就可以获得 | 法访问远程的 SQL Server 数据库 须被 Windows NT 确认,所以对只 ws NT 用户帐号的用户可能会被拒 的连接可直接连接到数据库服务器 P 套接字连接可直接连接到数据库 访问权,而不必通过 Windows NT |
| 注意在连接皆冻淌菘馐笔褂?TCP/IP 套接字可提高性能。 |
| 安全性 - 如果您使用 SQL Server 库位于远程服务器上,则不能使用 Windo Windows NT 请求/响应身份证转发到远程 供用户名和口令信息进行。 | 的 集成 或混合 安全特性,并且 SQL Server 数据 ws NT 请求/响应的确认。也就是说,不能将 计算机上,而只能使用基本身份验证,它根据用户提 |
| 有关这一主题的详细信息,请参阅 h Microsoft SQL Server 技术支持主页。 | ttp://www.microsoft.com/sqlsupport/ 上的 |
| 配置 Oracle 数据库文件 DSN |
| 首先要确保 Oracle 用 务器管理员联系或参阅数据 Microsoft ODBC for Oracl 下一步”。单击“完成”创 意 DSN 文件用 .dsn 扩展 有关创建 DSN 文件的详细 /microsoft.com/odbc/。 | 户软件被正确地安装要创建 DSN 库软件文档。在“创建新数据源 e”,然后单击“下一步”。键 建数据源。输入用户名、密码和 名,位于 ProgramsCommon Fi 信息,请访问 Microsoft ODBC | 的计算机上。详细信息,请与服 ”对话框中,从列表框中选择“ 入 DSN 文件的名称,然后单击“ 服务器名,然后单击“确定”。注 lesODBCData Sources 目录中。 Web 站点:http:/ |
| 连接数据库 |
| 访问数据库信息的第一 该对象建立和管理τ贸绦?br>法,可以使用它们打开和关 | 步是和数据库源建立连接。ADO 和 ODBC 数据库之间的连接。Co 闭数据库连接,并且发出查询请 | 提供 Connection 对象,可以使用 nnection 对象具有各种属性和方 求来更新信息。 |
| 要建立数据库连接,首先应创建 Con Connection 对象,接着打开数据库连接 | nection 对象的实例。例如,下面的脚本创建 : |
| <% |
| 'Create a connection object |
| Set cn = Server.Crea | teObject("ADODB.Connection") |
| 'Open a connection; | the string refers to the DSN |
| cn.Open "FILEDSN=MyDatabase.dsn" |
| %> |
| 注意无论在等号 (=) 之前还是之后,DSN 字符串都不能包含空格。 |
| 在这种情况下,Connection 对象的 库的位置和配置信息。也可以不引用 DSN 。有关建立连接的可选方法的详细信息, | Open 方法引用基于 DSN 的文件,其中包含关于数据 ,直接显式引用供应程序、数据源、用户 ID 和密码 请参阅 Microsoft ActiveX Data Objects (ADO)。 |
| 用 Connection 对象执行查询 |
| 用 Connection 对象的 源并检索结果。SQL 是用于 息。 | Execute 方法,您可以发出结 与数据库通讯的工业标准语言, | 构化查询语言 (SQL) 查询数据库 它有许多命令可用来检索和更新信 |
| 下面的脚本使用 Connection 对象的 询,该命令将数据插入特定的数据库表格 为 Customers 的数据库表中。 | Execute 方法在 SQL INSERT 命令的表格中发出查 。在下面的示例中,脚本将名称 Jose Lugo 插入名 |
| <% |
| 'Define file based DSN |
| strDSN = "FILEDSN=MyDatabase.dsn" |
| 'Instantiate the Con | nection object and open a da | tabase connection |
| Set cn = Server.Crea | teObject("ADODB.Connection") |
| cn.Open strDSN |
| 'Define SQL SELECT statement |
| strSQL = "INSERT INTO Customers | (FirstName, LastName) VALUES ('Jose','Lugo')" |
| 'Use the Execute met | hod to issue a SQL query to | database |
| cn.Execute(strSQL) |
| %> |
| 注意 基于 DSN 路径字符串的文件在等号(=)前后不应包含空格。 |
| 除了 SQL INSERT 命令以外,您也可 库信息。 | 以使用 SQL UPDATE 和 DELETE 命令更改和删除数据 |
| 用 SQL UPDATE 命令,您可以改变数 Customers 表中每个 LastName 字段包 | 据库表中各项目值。下面的脚本使用 UPDATE 命令将 含姓 Smith 记录的 FirstName 字段更改为 Jeff。 |
| <% |
| Set cn = Server.Crea | teObject("ADODB.Connection") |
| cn.Open "FILEDSN=MyDatabase.dsn" |
| cn.Execute "UPDATE C | ustomers SET FirstName = 'Je | ff' WHERE LastName = 'Smith' " |
| %> |
| 要想从数据库表中删除特定的记录, Customers 表中删除了所有姓 Smith 的 | 可使用 SQL DELETE 命令。下面的脚本从 行: |
| <% |
| Set cn = Server.CreateObject("AD | ODB.Connection") |
| cn.Open "FILEDSN=MyDatabase.dsn" |
| cn.Execute "DELETE F | ROM Customers WHERE LastName | = 'Smith'" |
| %> |
| 注意 在使用 SQL DELE 命令时,它将删除表中的所 | TE 命令时,必须谨慎从事。当 有行。一定要包含 SQL WHERE | 使用不带 WHERE 子句的 DELETE 子句来指定要删除的确切行。 |
| 使用 Recordset 对象处理结果 |
| 尽管 Connection 对象 。确切地说,检索和显示数 要对数据库作出的更改,然 | 简化了连接数据库和查询任务, 据库信息的 Connection 对象不 后才能使用查询实现更改。 | 但 Connection 对象仍有许多不足 能用于创建脚本;您必须确切知道 |
| 对于检索数据、检查结 暗示的那样,Recordset 对 组数据库行,即记录。 Rec 描结果。 | 果、更改数据库,ADO 提供了 R 象有许多您可以使用的特性,根 ordset 对象保持查询返回的记 | ecordset 对象。正如它的名称所 据您的查询限制,检索并且显示一 录的位置,允许您一次一项逐步扫 |
| 根据 Recordset 对象 您在一组记录中定位到特定 操作。Recordset 对象有一 能力。例如,您可以使用 C 给客户端应用程序(结果通 改。有关配置 Recordset (ADO)。 | 的指针类型属性设置,您可以滚 的项。指针还用于检索和检查记 些属性,可用于精确地控制指针 ursorType 和 CursorLocation 常保留在数据库服务器上)并显 对象指针的信息,请参阅 Micro | 动和更新记录。数据库指针可以让 录,然后在这些记录的基础上执行 的行为,提高您检查和更新结果的 属性设置指针的类型,将结果返回 示其他用户对数据库的最后一次更 soft ActiveX Data Objects |
| 检索记录 |
| 一个成功的数据库应用程序都使用 C 理返回的数据。通过“协调”两个对象的 任务的数据库应用程序。例如,下面的服 命令。SELECT 命令检索一组基于查询限 查询的范围。此例中,WHERE 子句将查询 Smith 的记录。 | onnection 对象建立链接并使用 Recordset 对象处 特定功能,您可以开发出几乎可以执行任何数据处理 务器端脚本使用 Recordset 对象执行 SQL SELECT 制的信息。查询也包含 SQL WHERE 子句,用来缩小 限制为所有的 Customers 数据库表中包含的姓 |
| <% |
| 'Establish a connect | ion with data source |
| strDSN = "FILEDSN=MyDatabase.dsn" |
| Set cn = Server.Crea | teObject("ADODB.Connection") |
| cn.Open strDSN |
| 'Instantiate a Recordset object |
| Set rsCustomers = Server.CreateO | bject("ADODB.Recordset") |
| 'Open a recordset using the Open method |
| ' and use the connec | tion established by the Conn | ection object |
| strSQL = "SELECT FirstName, Last | Name FROM Customers WHERE LastName = 'Smith' " |
| rsCustomers.Open strSQL, cn |
| 'Cycle through recor | d set and display the result | s |
| ' and increment reco | rd position with MoveNext me | thod |
| Set objFirstName = rsCustomers(" | FirstName") |
| Set objLastName = rs | Customers("LastName") |
| Do Until rsCustomers.EOF |
| Response.Write objFirstName & " " & objLastName & "<BR>" |
| rsCustomers.MoveNext |
| Loop |
| %> |
| 注意,在前面的例子中,用来建立数 用该连接从数据库中检索结果。当您需要 方法是非常有用的。例如,如果您需要在 Connection 对象去设置属性。但是,如 应该使用 Recordset 对象的 Open 方法 | 据库连接的 Connection 对象和 Recordset 对象使 精确地设置和数据库建立链接所采用的方式时,这个 连接尝试失败之前指定等待的时间,则需要使用 果您仅仅想使用 ADO 默认的连接属性建立连接,则 去建立链接: |
| <% |
| strDSN = "FILEDSN=MyDatabase.dsn" |
| strSQL = "SELECT FirstName, Last | Name FROM Customers WHERE LastName = 'Smith' " |
| Set rsCustomers = Se | rver.CreateObject("ADODB.Rec | ordset") |
| 'Open a connection using the Ope | n method |
| 'and use the connection establis | hed by the Connection object |
| rsCustomers.Open strSQL, strDSN |
| 'Cycle through the record set, d | isplay the results, |
| ' and increment record position | with MoveNext method |
| Set objFirstName = rsCustomers(" | FirstName") |
| Set objLastName = rs | Customers("LastName") |
| Do Until rsCustomers.EOF |
| Response.Write objFirstName & " " & objLastName & "<BR>" |
| rsCustomers.MoveNext |
| Loop |
| %> |
| 当使用 Recordset 对 证链接的安全。详细信息, | 象的 Open 方法建立一个连接时 请参阅 Microsoft ActiveX Dat | ,必须使用 Connection 对象去保 a Objects (ADO)。 |
| 用 Command 对象改善查询 |
| 通过 ADO Command 对象,可以象用 唯一的不同在于用 Command 对象您可以 不同的值来发出查询。这种方式的编译查 出修改的请求所需的时间。另外,您还可 SQL 查询保持局部未定义。 | Connection 对象和 Recordset 对象那样执行查询, 在数据库源上准备、编译您的查询并且反复使用一组 询的优点是您可以最大程度地减少向现有查询重复发 以在执行之前通过您的查询的可变部分的选项使 |
| Command 对象的 parameter 集合减 建立查询。例如,如果需要有规律地更新 以用下面的方法预先定义查询: | 少了您的麻烦,使您不必在每次重新发出查询时重新 基于库存清单的 Web 系统中的供应和价格信息,可 |
| <% |
| 'Open a connection using Connect | ion object Command object |
| 'does not have an Open method fo | r establishing a connection |
| strDSN = "FILEDSN=MyDatabase.dsn" |
| Set cn = Server.Crea | teObject("ADODB.Connection") |
| cn.Open strDSN |
| 'Instantiate Command object; use | ActiveConnection property to attach |
| 'connection to Command object |
| Set cm= Server.CreateObject("ADO | DB.Command") |
| Set cm.ActiveConnection = cn |
| 'Define SQL query |
| cm.CommandText = "IN | SERT INTO Inventory (Materia | l, Quantity) VALUES (?, ?)" |
| 'Save a prepared (or pre-compile CommandText | d) version of the query specified in |
| 'property before a C | ommand object's first execut | ion. |
| cm.Prepared = True |
| 'Define query parameter configur | ation information |
| cm.Parameters.Append cm.CreatePa | rameter("material_type",200, ,255 ) |
| cm.Parameters.Append | cm.CreateParameter("quantit | y",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 ('Robert','O'Hara')" | (FirstName, LastName) VALUES |
| 注意,姓 O'Hara 中包 冲突。通过将查询数值作为 | 含一个“'”,它与在 SQL VALU Command 对象参数绑定,可以 | ES 关键字中用来表示数据的“'” 避免此类问题。 |
| 结合 HTML 表格和数据库访问 |
| 包含 HTML 表格的 Web 页可使用户 以创建非常简单的脚本来收集用户表格信 。使用 ASP Request 对象,您可以检索 语句中。例如,下面的脚本模块将 HTML 象的 Form 集合收集用户信息。 | 远程查询数据库并且检索特定的信息。用 ADO 您可 息、创建自定义的数据库查询以及将信息返回给用户 输入到 HTML 表格的信息并将这些信息合并到 SQL 表格提供的信息插入表格中。此脚本用 Request 对 |
| <% |
| 'Open a connection u | sing Connection object. The | Command object |
| 'does not have an Open method fo | r establishing a connection |
| strDSN = "FILEDSN=MyDatabase.dsn" |
| Set cn = Server.CreateObject("AD | ODB.Connection") |
| cn.Open strDSN |
| 'Instantiate Command object |
| 'and use ActiveConne | ction property to attach |
| 'connection to Command object |
| Set cm= Server.Creat | eObject("ADODB.Command") |
| Set cm.ActiveConnection = cn |
| 'Define SQL query |
| cm.CommandText = "IN | SERT INTO MySeedsTable (Type | ) VALUES (?)" |
| 'Define query parameter configur | ation information |
| cm.Parameters.Append cm.CreatePa | rameter("type",200, ,255 ) |
| 'Define and execute insert |
| cm("type") = Request("SeedType") |
| cm.Execute |
| %> |
| 有关表格和使用 ASP R | equest 对象的详细信息,请参 | 阅 使用 HTML 表格。 |
| 管理数据库连接 |
| 设计一个能经得起考验 程序)的最大挑战,在于如 信息传输时,也会严重耗费 Web 数据库应用程序将回收 | 的 Web 数据库应用程序(例如 何合理地管理数据库连接。打开 数据库服务器的资源并且可能会 数据库连接并能够补偿由于网络 | 为几千个客户服务的联机购物应用 并且保持数据库连接,即使在没有 导致连接性问题。设计良好的 堵塞造成的延迟。 |
| 使连接超时 |
| 活动的突然增长可能使 果是,过长的连接延时将降 | 数据库服务器变得十分笨拙,大 低数据库的性能。 | 量增加建立数据库连接的时间。结 |
| 用 Connection 对象的 前应用程序等待的时间。例 之前等待 20 秒: | ConnectionTimeout,您可以限 如,下面的脚本设置 Connectio | 制放弃连接尝试并发出错误消息之 nTimeout 属性,在取消连接尝试 |
| Set cn = Server.CreateObject("AD | ODB.Connection") |
| cn.ConnectionTimeout = 20 |
| cn.Open "FILEDSN=MyDatabase.dsn" |
| 默认的 ConnectionTimeout 属性是 30 秒。 |
| 注意 在将 Connection 序和数据源支持该属性。 | Timeout 属性合并到数据库应用 | 程序之前,一定要确保连接提供程 |
| 共享连接 |
| 经常建立和中断数据库 ASP 支持用 ODBC 3.5 的共 的用户共享该连接,以维持 池中是否存在空闲的连接。 | 连接的 Web 数据库应用程序可 享特性有效管理连接。连接共享 其性能和减少空闲的连接数。对 如果存在,连接池返回连接而不 | 能会降低数据库服务器的性能。 维持打开的数据库连接并管理不同 每一个连接请求,连接池首先确定 是建立到数据库的新连接。 |
| 如果希望将 ODBC 驱动程序加入到连 Windows NT 注册表中设置驱动程序的 CP 中,而不是被断开。CPTimeout 属性决定 保留的时间比 CPTimeout 设置的时间长 认值是 60 秒。 | 接共享中,则必须配置数据库驱动程序并在 Timeout 属性。当 ODBC 断开连接时,连接被存入池 在连接池中的连接保留的时间长度。如果在池中连接 ,则连接将被关闭并且从池中删除。CPTimeout 的默 |
| 您可以通过创建如下设 ODBC 数据库驱动程序的连 | 置的注册表键来有选择地设置 C 接池: | PTimeout 的属性,从而启用特定 |
| HKEY_LOCAL_MACHINE | SOFTWAREODBCODBCINST.INId | river-nameCPTimeout = timeout |
| (REG_SZ, units are in seconds) |
| 例如,下面的键将 SQL | Server 驱动程序的连接池的超 | 时设置定为 180 秒(3 分钟)。 |
| HKEY_LOCAL_MACHINESOFTWAREODB | CODBCINST.INISQL ServerCPTimeout = 180 |
| 注意默认情况下,通过将 CPTimeout 连接池。 | 设置为 60 秒,Web 服务器将激活 SQL Server 的 |
| 使用跨页连接 |
| 尽管您可以通过存储 ASP 的 Applic 连接保持打开是不必要的,也没有充分利 ASP 数据库应用程序,一个好方法就是 中,重复使用数据库连接。例如,可以在 程中指定连接字符串,如下面的脚本所示 | ation 对象的连接重复使用跨页连接,但是,始终使 用连接池的优点。如果有许多用户需要连接到同一个 ,将跨页连接字符串置于 ASP 的 Application 对象 Global.asa 文件的 Application_OnStart 事件过 : |
| Application.lock |
| Application("ConnectionString") | = "FILEDSN=MyDatabase.dsn" |
| Application.unlock |
| 然后,在每一个访问数据库的 ASP 文件中写入: |
| <OBJECT RUNAT=Server ID=cn PROGID="ADODB.Connection"> </OBJECT> |
| 要想创建连接对象的实例,请使用以下脚本: |
| cn.Open Application("ConnectionString") |
| 对于打开的连接,可以在页尾写入以下脚本,关闭连接: |
| cn.Close |
| 在单个用户需要重复使用跨页连接的 Application 对象更好。 | 情况下,使用 Session 对象连接比使用 |
| 关闭连接 |
| 要想更好地使用连接池,就应尽快地 连接将被终止。当不再需要连接时将其关 用户能够使用该连接。 | 关闭数据库连接。默认情况下,当脚本执行完以后, 闭,就可以减少对数据库服务器的要求并可以使其他 |
| 可以使用 Connection 下面的脚本打开连接,然后 | 对象的 Close 方法终止 Connec 将其关闭: | tion 对象和数据库之间的连接。 |
| <% strDSN = "FILEDSN=MyDatabase.dsn" |
| Set cn = Server.CreateObject("AD | ODB.Connection") |
| cn.Open |
| cn.Close |
| %> |