访问数据源
activex 数据对象 (ado) 是一种既易于使用又可扩充的技术,用来将数据库访问添加到您的 web 页可以使用 ado 编写简洁和可升级的脚本以连接到与 ole db 兼容的数据源,如数据库、电子表格、顺序数据文件或电子邮件目录。ole db 是一个系统级的编程接口,它提供一套标准的 com 接口,用来展示数据库管理系统的功能。使用 ado 的对象模型,您可以轻松地(使用 vbscript 或 jscript 等脚本语言)访问这些接口并将数据库功能添加到您的 web 应用程序中。另外,您还可以使用 ado 访问与开放式数据库互连 (odbc) 兼容的数据库。
如果您是一位对数据库互连知识有一定了解的脚本编写者,您将会发现 ado 的命令语法很简单,而且很容易使用。如果您是一位经验丰富的开发人员,您将会非常欣赏 ado 提供的这种可升级的对各种数据源的高性能访问。
关于 ado 的详细信息,请访问 microsoft 通用数据访问 (uda) web 站点 http://www.microsoft.com/data/。
创建连接字符串
创建 web 应用程序的第一步是给 ado 提供一种定位并识别数据源的方法。这是通过“连接字符串”来完成的,连接字符串是一系列用分号分隔的参数,用来定义诸如数据源提供者和数据源位置等参数。ado 使用连接字符串来识别 ole db “提供者”并将提供者指向数据源。提供者是一个组件,用来描述数据源并以行集合的形式将信息展示给应用程序。
下表列出了几个通用数据源的 ole db 连接字符串:数据源 ole db 连接字符串
microsoft access provider=microsoft.jet.oledb.4.0;source=指向 .mdb 文件的物理路径
microsoft sql server provider=sqloledb.1;source=指向服务器上数据库的路径
oracle provider=msdaora.1;source=指向服务器上数据库的路径
microsoft indexing service provider=msidxs.1;source=指向文件的路径
为了提供向后兼容,odbc 的 ole db 提供者支持 odbc 连接字符串语法。下表列出了通常使用的 odbc 连接字符串: 数据源驱动程序 odbc 连接字符串
microsoft access driver={microsoft access driver (*.mdb)};dbq=指向 .mdb 文件的物理路径
sql serverr driver={sql server};server=指向服务器的路径
oracle driver={microsoft odbc for oracle};server=指向服务器的路径
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®(带有一个数据库容器) driver={microsoft visual foxpro driver};sourcetype=dbc;sourcedb=指向 .dbc 文件的物理路径
microsoft visual foxpro(不带数据库容器) driver={microsoft visual foxpro driver};sourcetype=dbf;sourcedb=指向 .dbf 文件的物理路径
注意 (使用 unc 路径引用位于远程计算机上的数据源的)连接字符串可能造成潜在的安全问题。要禁止对您的数据源进行未授权访问,可为需要访问数据的计算机创建 windows 帐号,然后对数据源应用适当的 ntfs 权限。详细信息,请参阅使用 ntfs 保护文件。
设计 web 数据应用程序时应考虑的高级问题
由于性能和可靠性的原因,我们强烈推荐,在配置数据驱动 web 应用程序(需要能满足大约 10 个以上并发用户同时进行高要求的访问)时,使用客户端服务器数据库引擎。虽然 ado 适用于与 ole db 兼容的任何数据源,但经过广泛的测试,主要设计为与客户端服务器数据库(如 microsoft sql server 或 oracle)一起工作。
asp 支持共享文件数据库(microsoft access 或 microsoft foxpro)作为有效的数据源。虽然在 asp 文档中有些示例使用了“共享文件”数据库,但我们还是建议这些类型的数据库引擎只用于开发目的或有限的开发方案中。共享文件数据库可能不如客户端服务器数据库更适合于高要求和高质量的 web 应用程序。
如果正在开发 asp 数据库应用程序,并且该程序将连接到远程 sql server 数据库,您还应该注意以下几点:
选择 sql server 连接方案 要访问远程 sql server 数据库,可以选择 tcp/ip 套接字方法或已命名管道方法。使用已命名管道,必须在建立连接之前由 windows 对数据库客户加以验证,以防止运行已命名管道的远程计算机拒绝那些在该计算机上具有适当 sql server 访问证书、但没有 windows 用户帐号的用户的访问。作为另一个选择,使用 tcp/ip 套接字的连接将直接连到数据库服务器,而不通过中间计算机进行连接。如果通过中间计算机,则与使用已命名管道类似。而且由于使用 tcp/ip 套接字的连接会直接连到数据库服务器,所以用户可以通过 sql server 验证而不是 windows 验证来获得访问。
odbc 80004005 错误 如果访问 sql server 的连接方案没有正确设置,则正在查看数据库应用程序的用户可能会收到 odbc 80004005 错误的消息。要纠正这种情况,可使用本地的已命名管道连接代替网络的已命名管道连接,但 sql server 与 iis 需在同一计算机上运行。windows 2000 安全规则不会受到影响,因为此管道是本地连接而不是网络连接,它可以由匿名用户帐号来模拟。同样,在 sql server 连接字符串(在 global.asa 文件或网页级脚本中)中,将参数 server=server name 更改为 server=(local)。关键字 (local) 是由 sql server odbc 驱动程序识别的特殊参数。如果该解决方案无法工作,那么请在 iis 和 sql server 之间尝试使用非验证协议,如 tcp/ip 套接字。当 sql server 在本地或远程计算机上运行时,该协议将能够工作。
注意 为了在连接到远程数据库时提高性能,请使用 tcp/ip 套接字。
sql server 安全 如果使用 sql server 的“集成”或“混合”安全特性,并且 sql server 数据库驻留在远程服务器上,那么您将无法使用集成的 windows 验证。特别地,您无法将集成的 windows 验证证书发送给远程计算机。这意味着您不得不使用基本验证,该验证需要用户提供用户名和密码信息。
有关这些问题的详细信息,请访问位于 http://www.microsoft.com/china/support/ 的 microsoft 产品支持服务 web 站点。
连接到数据源
ado 提供了“connection”对象,用于建立与管理应用程序和 ole db 兼容数据源或 odbc 兼容数据库之间的连接。“connection”对象的属性和方法可以用来打开和关闭数据库连接,并发布对更新信息的查询。
要建立数据库连接,首先必须创建“connection”对象实例。例如,下面的脚本创建“connection”对象实例,接着打开一个连接:
<%创建 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 对象执行 sql 查询
使用“connection”对象的“execute”方法可以将命令发布到数据源,如结构化查询语言 (sql) 查询。(sql 是与数据库进行通信的工业标准语言,定义了用来检索和更新信息的命令。)“execute”方法可以接收参数,用来指定命令(或查询)、受影响的数据记录数和所使用命令的类型。
下面脚本使用“execute”方法以 sql “insert”命令的形式发布查询,该命令用来将数据插入指定的数据库表中。在这种情况下,脚本块将名字“jose lugo”插入到名为“customers”的数据库表中。
<%定义 ole db 连接字符串。strconnectionstring = "provider=microsoft.jet.oledb.4.0;data source=c:\data\employees.mdb"例示 connection 对象并打开数据库连接。set cnn = server.createobject("adodb.connection")cnn.open strconnectionstring定义 sql select 语句。strsql = "insert into customers (firstname, lastname) values (jose,lugo)"使用 execute 方法将 sql 查询发布到数据库。cnn.execute strsql,,adcmdtext + adexecutenorecords%>
注意,在用来执行查询的语句中指定了两个参数:adcmdtext 和 adexecutenorecords。可选参数 adcmdtext 指定命令类型,说明提供者必须将此查询语句(这里是 sql 查询语句)评估为命令的文本定义。adexecutenorecords 参数指示 ado 在没有结果返回到应用程序时不要创建数据记录集。此参数只用于定义为文本定义(如 sql 查询)的命令类型,或已存储的数据库过程。虽然 adcmdtext 和 adexecutenorecords 是可选参数,但在使用“execute”方法增强数据应用程序性能时应指定这两个参数。
要点 ado 参数,如 adcmdtext,需要在脚本中先定义然后再使用。一个方便的定义参数的方法是使用“组件类型库”,它是包含所有 ado 参数定义的文件。要实施组件类型库,首先应声明它。将下面的 <metadata> 标记添加到 .asp 文件或 global.asa 文件中以声明 ado 类型库:
<!–metadata name="microsoft activex data objects 2.5 library" type="typelib" uuid="{00000205-0000-0010-8000-00aa006d2ea4}"–>
有关实施组件类型库的详细信息,请参阅使用变量和常量主题中的使用常量部分。
除了 sql 的 insert 命令外,还可以使用 sql 的 update 和 delete 命令来更改和删除数据库信息。
使用 sql 的 update 命令可以更改数据库表中各个项目的值。下面的脚本使用 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%>
要删除数据库表中指定的记录,可使用 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 命令时务必小心谨慎。不带 where 子句的 delete 命令将删除表中的所有行。确保包括 sql where 子句,以便明确指定要删除的行。
