下载 第8章ADO基础 在本书前7章中,已经讲述了ASP的有关内容,以及ASP如何为Web站点带来动态的内容。 已经见到其脚本程序允许自定义Web页面,使我们能够构建功能更为强大的ASP页面 现在,将研究ASP和数据的集成。虽然对用于网页中的脚本数量并无任何限制,但如果 没有某种形式的数据,很快就会进入一个死胡同。数据构成了Web站点的实际内容,或者指 出了如何设置web站点,因此总的说来数据是非常重要的。如果围绕数据存储建立Web站点 改变Web站点时只需要改变相应的数据即可。 ActiveX数据对象(ADO)是允许用户与数据存储进行交互的组件。这意味着只要基于某些 数据就可建立一个网页,或一种完全交互的电子商务系统。不论那种方式,都是ADO使我们 能与数据进行通信。我们将讨论从数据存储获取和传送数据的主要内容,以及得到数据后的 数据处理方法 首先研究什么是ADO及其所包括的组件,然后讨论如何访问数据存储。在下一章,将进 步学习ADO更先进的一些特性,如命令、存储过程和优化应用程序的一些操作技巧。下 步研究Web服务器和浏览器之间的交互过程,以及数据处理过程。然后研究数据存取领域中 极具潜力的XML。XML是什么?如何使用?因为XML代表着未来发展的一种趋势,我们将介 绍微软关于通用数据存取的构想。在这个构想中,数据不只是从数据库中获得的。最后,看 下标准的微软数据库(如 Access与 SQL Server)以及在其中如何使用ADO 本章从ADO开始,主要内容有: 研究ADO如何与数据进行交互 了解ADO的组件 如何与数据存储连接和创建数据集 ·如何处理和修改数据。 ·如何处理ADO错误。 8.1ADO的定义 ADO是一个相当简单的思想,一种让你仅用一种方式去访问数据的思想。ADO不算一个 新思想,仅是采用现有的数据库访问技术,并将其融合而形成的一种适应现在和未来需要的 新东西。适应未来的需求是一件十分重要的事。许多其他的技术,比如DAO和ODBC,在 些应用程序的开发过程中是可以接受的,然而随着 Internet的兴起也出现了其自身的一些问题 在许多情况下,传统的数据存取方法看上去能解决一些关于两层客户/服务器系统的问题 但要求与数据之间要保持一种永久性的连接,并要提供强大的功能,比如快速响应的查询、 数据容易修改等。在 Internet领域,现在必须考虑到Web无状态性本质,和潜在的众多可以访 问web站点的用户。要与数据建立永久的连接是不现实的,因此必须在设计应用程序时考虑 这些因素 那么, OLE DB和ADO确切地讲到底是什么?让我们与一些已有的数据存取技术做比较
下载 第8章 ADO 基 础 在本书前7章中,已经讲述了A S P的有关内容,以及A S P如何为We b站点带来动态的内容。 已经见到其脚本程序允许自定义 We b页面,使我们能够构建功能更为强大的 A S P页面。 现在,将研究 A S P和数据的集成。虽然对用于网页中的脚本数量并无任何限制,但如果 没有某种形式的数据,很快就会进入一个死胡同。数据构成了 We b站点的实际内容,或者指 出了如何设置We b站点,因此总的说来数据是非常重要的。如果围绕数据存储建立 We b站点, 改变We b站点时只需要改变相应的数据即可。 A c t i v e X数据对象( A D O )是允许用户与数据存储进行交互的组件。这意味着只要基于某些 数据就可建立一个网页,或一种完全交互的电子商务系统。不论那种方式,都是 A D O使我们 能与数据进行通信。我们将讨论从数据存储获取和传送数据的主要内容,以及得到数据后的 数据处理方法。 首先研究什么是 A D O及其所包括的组件,然后讨论如何访问数据存储。在下一章,将进 一步学习A D O更先进的一些特性,如命令、存储过程和优化应用程序的一些操作技巧。下一 步研究We b服务器和浏览器之间的交互过程,以及数据处理过程。然后研究数据存取领域中 极具潜力的X M L。X M L是什么?如何使用?因为X M L代表着未来发展的一种趋势,我们将介 绍微软关于通用数据存取的构想。在这个构想中,数据不只是从数据库中获得的。最后,看 一下标准的微软数据库(如A c c e s s与SQL Server)以及在其中如何使用A D O。 本章从A D O开始,主要内容有: • 研究A D O如何与数据进行交互。 • 了解A D O的组件。 • 如何与数据存储连接和创建数据集。 • 如何处理和修改数据。 • 如何处理A D O错误。 8.1 ADO的定义 A D O是一个相当简单的思想,一种让你仅用一种方式去访问数据的思想。 A D O不算一个 新思想,仅是采用现有的数据库访问技术,并将其融合而形成的一种适应现在和未来需要的 新东西。适应未来的需求是一件十分重要的事。许多其他的技术,比如 D A O和O D B C,在一 些应用程序的开发过程中是可以接受的,然而随着 I n t e r n e t的兴起也出现了其自身的一些问题。 在许多情况下,传统的数据存取方法看上去能解决一些关于两层客户 /服务器系统的问题, 但要求与数据之间要保持一种永久性的连接,并要提供强大的功能,比如快速响应的查询、 数据容易修改等。在 I n t e r n e t领域,现在必须考虑到 We b无状态性本质,和潜在的众多可以访 问We b站点的用户。要与数据建立永久的连接是不现实的,因此必须在设计应用程序时考虑 这些因素。 那么,OLE DB和A D O确切地讲到底是什么?让我们与一些已有的数据存取技术做比较
第章AD0基245 下载 后再来回答这个问题。如果读者曾经接触过数据库编程,或许比较熟悉ODBC和RDO。开放 数据库连接(ODBC)是允许访问关系数据库(比如 Access和 SQL Server)的应用程序编程接口 (API)。正因为是一个API,许多程序员,特别是Ⅴ isual basic领域的程序员,发现它使用起来 很复杂。远程数据对象(RDO是位于ODBC上层的 ActiveX对象,可以提供ODBC的所有功能, 并且使用起来比较简单。 可以将 OLE DB等同于ODBC,ADO等同于RDO OLE DB是应用程序与数据源交互的一种基本技术。 这相当复杂,确实也只有C和C++程序员能够使用。正如ADO的名字所暗示的,它是易于 访问 OLE DB功能的 Activex对象 你或许发现术语 Activex与COM对象经常混用。对于ASP程序员来说它们并没有 本质上的区别,因为两者都基于COM系统结构,只不过 ActiveX是组件的一个跨平台 标准,而COM是 Windows专有的。 虽然微软已经引入了一种新的存取数据的技术,但并没有立即取消旧的技术。ODBC工作 起来仍然很有效,并同 OLE DB和ADO紧密地一起工作着。事实上,ODBC并不只是微软的产 品,也受到国际组织的控制。并且由于广泛的使用,ODBC也不会突然消亡。隐藏在 OLE DB 背后的思想不是摒弃现有的技术,而是不断地改进它们 8.1.1 OLE DB和ADO的体系结构 前面已经给出了 OLE DB与ADO在一些主要方面的简要解释。图8-1显示了这两项技术与 应用程序和数据存储相互关系。 应用程序 脚本 Java OLE DB E-mail 目录服务 数据存储 图8-1 OLE DB、ADO与应用程序和数据存储的关系 从图8-1中可以看出整体思路。图的顶端是应用程序(wWeb或常规的应用程序,这是无关紧 要的),下面是提供对数据的访问的ADO和减或 OLE DB。ADO和 OLE DB两者兼有是因为OLE
后再来回答这个问题。如果读者曾经接触过数据库编程,或许比较熟悉 O D B C和R D O。开放 数据库连接 ( O D B C )是允许访问关系数据库 (比如A c c e s s和SQL Server)的应用程序编程接口 ( A P I )。正因为是一个A P I,许多程序员,特别是 Visual Basic领域的程序员,发现它使用起来 很复杂。远程数据对象 ( R D O )是位于O D B C上层的A c t i v e X对象,可以提供O D B C的所有功能, 并且使用起来比较简单。 可以将OLE DB等同于O D B C,A D O等同于R D O。 OLE DB是应用程序与数据源交互的一种基本技术。 这相当复杂,确实也只有 C和C + +程序员能够使用。正如 A D O的名字所暗示的,它是易于 访问OLE DB功能的A c t i v e X对象。 你或许发现术语A c t i v e X与C O M对象经常混用。对于 A S P程序员来说它们并没有 本质上的区别,因为两者都基于 C O M系统结构,只不过A c t i v e X是组件的一个跨平台 标准,而C O M是Wi n d o w s专有的。 虽然微软已经引入了一种新的存取数据的技术,但并没有立即取消旧的技术。 O D B C工作 起来仍然很有效,并同OLE DB和A D O紧密地一起工作着。事实上, O D B C并不只是微软的产 品,也受到国际组织的控制。并且由于广泛的使用, O D B C也不会突然消亡。隐藏在 OLE DB 背后的思想不是摒弃现有的技术,而是不断地改进它们。 8.1.1 OLE DB和A D O的体系结构 前面已经给出了OLE DB与A D O在一些主要方面的简要解释。图 8 - 1显示了这两项技术与 应用程序和数据存储相互关系。 图8-1 OLE DB、A D O与应用程序和数据存储的关系 从图8 - 1中可以看出整体思路。图的顶端是应用程序 ( We b或常规的应用程序,这是无关紧 要的),下面是提供对数据的访问的 A D O和/或OLE DB。A D O和OLE DB两者兼有是因为O L E 第8章 ADO 基 础计计245 下载 应用程序 脚本 数据存储 目录服务
246Asp;高箱程 Chinaopub.com 下载 DB是一项基本技术。然而, OLE DB并不适用于所有语言,所以ADO位于 OLE DB的上层, 为那些不能直接访问 OLE DB的语言(如 Visual basic和脚本语言)提供编程接口。ADO提供了比 OLE DB更容易的编程接口,因此即使那些可以直接使用 OLE DB的编程语言,如C++或Java, 也可使用ADO以简化对数据的访问。 图8-1显示的是微软的编程语言,而ADO是一个COM组件,因此可用于任何与COM兼容 的编程语言,比如 Delphi或支持 Active Scripting接口的脚本语言。所以,虽然ADO与平台有 关,但与开发的语言是无关的。当然,对于ASP主要使用Ⅴ SCript和 JScript,在组件中使用 ADO时,有一些Ⅴ isual basic代码。 现在知道了 OLE DB和ADO允许访问数据,可是为什么需要它们?老方法出问题了吗? 这里有两个主要原因: 首先, OLE DE和ADO是用来访问数据存储的。注意这里指“数据存储”而不是“数据 库”。尽管数据库仍旧是数据存储最为广泛的形式,但并不一定含有全部的数据。一些消息系 统,如 Microsoft Exchange Server,也普遍地用于存储数据。目录服务( Directory Service)正开 始在初露端倪,它们包含着有关用户、机器等的数据:Web服务器中存有大量的信息。可以 继续罗列下去,很明显需要一种能访问所有这些不同类型数据的方法 其次,源于 Internet应用程序的兴起与Web的状态性本质。过去的访问数据的方法主要考 虑与数据存储保持永久连接的情况下处理数据。而 OLE DB和ADO正是为解决这个问题而设 计的,提供断开连接的记录集,我们将会在后面看到有关这方面的内容 8.1.2消费者与提供者 ADO系统结构图展示了ADO是如何在应用程序和真实数据存储之间发挥作用的。在微软 的文献中,会看到两个易懂的术语:消费者( Comsumer)和提供者( Provider),但搞清它们的确 切定义至关重要 提供者是提供数据的物体,消费者是使用(消耗)这些数据的物体。 在编程中,经常会发现应用程序是数据的消费者。但提供者呢?一般是数据存储,并且 由于 OLE DB被设计成用于与不同的数据存储对话,因此对于每一个独特类型的数据存储都有 个 OLE DE提供者。 这种单独提供者的思想并不新,但使编程变得容易了。编写程序与ADO或 OLE DB对话 LEDB再与提供者对话。这意味着只需学会一套访问数据的方法,无论数据如何存储,在某 些情况下确实可以完全不改变任何代码而只更换提供者。这就是ADO和 OLE DB真正优越的 地方,为数据存储提供了一套常用的编程接口 要连接到数据存储,必须使用 OLE DB提供者。提供给ADO25的初始设置为 Jet ole db40:用于微软 Access数据库 DTS Packages:用于 SQL Server的数据转换服务( Data Transformation Services)e Internet publishing:用于访问web服务器 Indexing services:用于索引目录( Index Catalogs) Site Server Search:用于站点服务器查找目录。 ODBC Drivers:用于ODBC数据源
D B是一项基本技术。然而, OLE DB并不适用于所有语言,所以 A D O位于OLE DB的上层, 为那些不能直接访问OLE DB的语言(如Visual Basic和脚本语言)提供编程接口。A D O提供了比 OLE DB更容易的编程接口,因此即使那些可以直接使用 OLE DB的编程语言,如C + +或J a v a, 也可使用A D O以简化对数据的访问。 图8 - 1显示的是微软的编程语言,而 A D O是一个C O M组件,因此可用于任何与 C O M兼容 的编程语言,比如 D e l p h i或支持Active Scripting接口的脚本语言。所以,虽然 A D O与平台有 关,但与开发的语言是无关的。当然,对于 A S P主要使用V B S c r i p t和J S c r i p t,在组件中使用 A D O时,有一些Visual Basic代码。 现在知道了OLE DB和A D O允许访问数据,可是为什么需要它们?老方法出问题了吗? 这里有两个主要原因: 首先,OLE DB和A D O是用来访问数据存储的。注意这里指“数据存储”而不是“数据 库”。尽管数据库仍旧是数据存储最为广泛的形式,但并不一定含有全部的数据。一些消息系 统,如Microsoft Exchange Server,也普遍地用于存储数据。目录服务 (Directory Service)正开 始在初露端倪,它们包含着有关用户、机器等的数据; We b服务器中存有大量的信息。可以 继续罗列下去,很明显需要一种能访问所有这些不同类型数据的方法。 其次,源于I n t e r n e t应用程序的兴起与 We b的状态性本质。过去的访问数据的方法主要考 虑与数据存储保持永久连接的情况下处理数据。而 OLE DB和A D O正是为解决这个问题而设 计的,提供断开连接的记录集,我们将会在后面看到有关这方面的内容。 8.1.2 消费者与提供者 A D O系统结构图展示了 A D O是如何在应用程序和真实数据存储之间发挥作用的。在微软 的文献中,会看到两个易懂的术语:消费者 ( C o m s u m e r )和提供者( P r o v i d e r ),但搞清它们的确 切定义至关重要。 提供者是提供数据的物体,消费者是使用 (消耗)这些数据的物体。 在编程中,经常会发现应用程序是数据的消费者。但提供者呢?一般是数据存储,并且 由于OLE DB被设计成用于与不同的数据存储对话,因此对于每一个独特类型的数据存储都有 一个OLE DB提供者。 这种单独提供者的思想并不新,但使编程变得容易了。编写程序与 A D O或OLE DB对话, OLE DB再与提供者对话。这意味着只需学会一套访问数据的方法,无论数据如何存储,在某 些情况下确实可以完全不改变任何代码而只更换提供者。这就是 A D O和OLE DB真正优越的 地方,为数据存储提供了一套常用的编程接口。 要连接到数据存储,必须使用 OLE DB提供者。提供给ADO 2.5的初始设置为: • Jet OLE DB 4.0:用于微软A c c e s s数据库。 • DTS Packages:用于SQL Server的数据转换服务(Data Transformation Services)。 • Internet Publishing:用于访问We b服务器。 • Indexing Services:用于索引目录(Index Catalogs)。 • Site Server Search:用于站点服务器查找目录。 • ODBC Drivers:用于O D B C数据源。 246计计ASP 3 高级编程 下载
第章AD0基247 下载 OLAP Services:用于微软OLAP服务器。 · Oracle:用于 Oracle数据库。 SQL Server:用于微软 SQL Server数据库 Simple provider:用于简单的文本文件。 MSDataShape:用于层次数据。 Microsoft Directory Services:用于 Windows2000的目录服务。 · DtS Flat File:用于 SQL Server的数据转换服务的平面文件管理。 这只是微软提供的初始列表,并取决于安装在服务器上的服务及软件。以 Oracle 数据提供者为例,要求在客户机上安装 Oracle的客户端软件。 可以从别的制造商那里获得 OLE DE提供者,用于其他数据存储。甚至还可以编写自己的 提供者。在第11章,将演示如何编写简单的 OLE DB提供者。 要想知道系统中安装了哪些提供者,可以使用 Data Link properties对话框。在本章后面, 将介绍如何使用它。 8.1.3提供者和驱动程序 值得注意的是, OLE DB对ODBC的兼容性,允许 OLE DE访问现有的ODBC数据源。其 优点很明显,由于ODBC相对 OLE DB来说使用得更为普遍,因此可以获得的ODBC驱动程序 相应地要比 OLE DB的要多。这样不一定要得到 OLE DB的驱动程序,就可以立即访问原有的 数据系统。 避免混淆提供者与驱动程序是重要的,图8-2明确了它们之间的区别。 OLE DB oLED8层 Oracle ODBC层 图8-2提供者与驱动程序之间的区别 提供者位于 OLE DB层,而驱动程序位于ODBC层。如果想使用一个ODBC数据源,需要 使用针对ODBC的 OLE DB提供者,它会接着使用相应的ODBC驱动程序。如果不需要使用 ODBC数据源,那么可以使用相应的 OLE DB提供者,这些通常称为本地提供者( native provider) 可以清楚地看出使用ODBC提供者意味着需要一个额外的层。因此,当访问相同的数据时
• OLAP Services:用于微软O L A P服务器。 • Oracle:用于O r a c l e数据库。 • SQL Server:用于微软SQL Server数据库。 • Simple Provider:用于简单的文本文件。 • MSDataShape:用于层次数据。 • Microsoft Directory Services:用于Windows 2000的目录服务。 • DTS Flat File:用于SQL Server的数据转换服务的平面文件管理。 这只是微软提供的初始列表,并取决于安装在服务器上的服务及软件。以 O r a c l e 数据提供者为例,要求在客户机上安装 O r a c l e的客户端软件。 可以从别的制造商那里获得 OLE DB提供者,用于其他数据存储。甚至还可以编写自己的 提供者。在第11章,将演示如何编写简单的 OLE DB提供者。 要想知道系统中安装了哪些提供者,可以使用 Data Link properties对话框。在本章后面, 将介绍如何使用它。 8.1.3 提供者和驱动程序 值得注意的是, OLE DB对O D B C的兼容性,允许 OLE DB访问现有的O D B C数据源。其 优点很明显,由于O D B C相对OLE DB来说使用得更为普遍,因此可以获得的 O D B C驱动程序 相应地要比OLE DB的要多。这样不一定要得到 OLE DB的驱动程序,就可以立即访问原有的 数据系统。 避免混淆提供者与驱动程序是重要的,图 8 - 2明确了它们之间的区别。 图8-2 提供者与驱动程序之间的区别 提供者位于OLE DB层,而驱动程序位于 O D B C层。如果想使用一个 O D B C数据源,需要 使用针对 O D B C的OLE DB提供者,它会接着使用相应的 O D B C驱动程序。如果不需要使用 O D B C数据源,那么可以使用相应的 OLE DB 提供者,这些通常称为本地提供者 ( n a t i v e p r o v i d e r )。 可以清楚地看出使用O D B C提供者意味着需要一个额外的层。因此,当访问相同的数据时, 第8章 ADO 基 础计计247 下载 层 层
248Asp高箱程 Chinapub.com 下载 针对ODBC的 OLE DB提供者可能会比本地的 OLE DB提供者的速度慢一些 82ADO2.5对象模型 虽然在ADO2.5对象模型中出现了两个新对象,但与以前的版本基本上是类似的。图8-3 显示了这些对象以及每个对象之间的关系 Errors Connection Active Con nection Execute( Active Connection Recordset Record Source Collection Save() OpenD Open Stream 图8-3对象之间的相互关系 如果以前曾使用过ADO,你会发现在这个新版本中出现了两个新对象: Stream和 Record 对象。在第11、12章将详细地介绍它们 Properties:集合已经被有意地排除在图8-3外,这样你对几个主要对象之间的交互 关系就一目了然了。在本章的后面,有显示 Properties集合的简化对象模型 让我们更详细地考察这几个对象 nnection对象 Connection对象是使我们能与数据存储相连的对象。只有 Connection对象才能指定希望使 用的 OLE DB提供者、连接到数据存储的安全细节以及其他任何连接到数据存储特有的细节 应该注意的是,不必显式创建一个 Connection对象以连接到数据存储。尽管确实需要指定 连接细节,但没有 Connection对象,一样可以创建 Command、 Recordset和 Record对象。如果 不创建自己的 Connection对象,ADO将会隐含地为你创建一个 Connection对象。如果要对提供 者运行多条命令,应该显式地创建一个 Connection对象,这比每运行一条命令就创建一个连接 更有效。 除了为数据存储提供连接以外, Connection对象允许针对数据存储执行命令操作。这些命 令可以是结构化的或存储的命令(例如,SQL命令或一个存储过程),并且可以有选择地从数据 存储中返回一些数据
针对O D B C的OLE DB提供者可能会比本地的OLE DB提供者的速度慢一些。 8.2 ADO 2.5对象模型 虽然在ADO 2.5对象模型中出现了两个新对象,但与以前的版本基本上是类似的。图 8 - 3 显示了这些对象以及每个对象之间的关系。 图8-3 对象之间的相互关系 如果以前曾使用过 A D O,你会发现在这个新版本中出现了两个新对象: S t r e a m和R e c o r d 对象。在第11、1 2章将详细地介绍它们。 P r o p e r t i e s集合已经被有意地排除在图 8 - 3外,这样你对几个主要对象之间的交互 关系就一目了然了。在本章的后面,有显示 P r o p e r t i e s集合的简化对象模型。 让我们更详细地考察这几个对象。 8.2.1 Connection对象 C o n n e c t i o n对象是使我们能与数据存储相连的对象。只有 C o n n e c t i o n对象才能指定希望使 用的OLE DB提供者、连接到数据存储的安全细节以及其他任何连接到数据存储特有的细节。 应该注意的是,不必显式创建一个 C o n n e c t i o n对象以连接到数据存储。尽管确实需要指定 连接细节,但没有 C o n n e c t i o n对象,一样可以创建 C o m m a n d、R e c o r d s e t和R e c o r d对象。如果 不创建自己的C o n n e c t i o n对象,A D O将会隐含地为你创建一个 C o n n e c t i o n对象。如果要对提供 者运行多条命令,应该显式地创建一个 C o n n e c t i o n对象,这比每运行一条命令就创建一个连接 更有效。 除了为数据存储提供连接以外, C o n n e c t i o n对象允许针对数据存储执行命令操作。这些命 令可以是结构化的或存储的命令 (例如,S Q L命令或一个存储过程),并且可以有选择地从数据 存储中返回一些数据。 248计计ASP 3 高级编程 下载
第8章ADO基础 249 下载 82.2 Command对象 Command对象是对数据存储执行命令的对象。看到这里读者可能会产生疑问 Connection对象不也能这样做吗?是的,但是 Connection对象在处理命令的功能上受到一定的 制,而 Command对象是特别为处理命令的各方面问题而创建的。实际上,当从 Connection 对象中运行一条命令时,已经隐含地创建了一个 Command对象 有时其他对象允许向命令传入参数,但在 Connection对象中不能指定参数的任何细节。使 用 Command对象允许指定参数(以及输出参数和命令执行后的返回值)的精确细节(比如,数据 类型和长度)。 因此,除了执行命令和得到一系列返回记录,也可能得到一些由命令提供的附加信息 对于那些不返回任何记录的命令,如插入新数据或更新数据的SQL查询, Command对象 也是有用的。 823 Recordset对象 Recordset对象是ADO中使用最为普遍的对象,因为它含有从数据存储中提取的数据集 我们经常运行不返回数据的命令,比如那些增加或更新数据的命令,但在大多数情况下很有 可能会取得一系列记录。 Recordset对象是拥有这些记录的对象。可以更改(增加、更新和删除)记录集中的记录,上 下移动记录,过滤记录并只显示部分内容等等。 Recordset对象也包含 Fields集合, Fields集合 中有记录集中每一个字段(列)的 Filed对象 无论是在ASP页面中处理数据,还是利用远程数据服务(RDS)远程使用数据, Recordset对 象是必须处理的对象 824 Record对象 ADO2.5以前的版本在处理结构化数据上是很有效的,比如从数据库中取出记录集,但无 处理每一行的列(也就是列数和数据类型)可能不同的数据。对于SQL数据这不是一个问题, 但对于文件和邮件系统,Web服务器和别的诸如此类的数据存储会如何呢?我们把这些数据 看作是半结构化的数据,与记录集相比结构性较差,但与那些常用来代表文本或图像的二进 制数据相比更具有结构性 通常,半结构化数据的存储采用树状结构来组织,有节点、子节点和文件。例如,设想 个有文件夹、子文件夹和文件的Web站点。图8-4所示的屏幕图显示了一台机器的Web站点, 特别是还有一个名为 public的虚拟目录。 如果一定要在ADO中进行建模,会觉得这非常适合记录集,可能是嵌套的记录集。然而 注意高亮显示的目录,该目录含有不同类型的文件,里面有几个目录、一个ASP文件、一个 文本文件和一个WORD文档。你会很容易地将其映射到一个拥有名称、类型、上次存取时间 等字段的记录集,遗憾的是并不是这样简单。对于访问权限而言,在文件和目录之间就有区 别。对于目录,需要的是能访问目录下的文件:而对于文件,却可能是需要访问其内容 由于其复杂性,引入了 Record对象。在上面的情况下,存在有一些相同属性的条目的一个 集合,但是每个条目也有独特的属性,因此需要使用别的方法去处理这些数据。把一个集合映 射到一个记录集,一个单独的文件映射成一条记录,相应的文件属性就映射成 Fields集合
8.2.2 Command对象 C o m m a n d 对象是对数据存储执行命令的对象。看到这里读者可能会产生疑问, C o n n e c t i o n对象不也能这样做吗?是的,但是 C o n n e c t i o n对象在处理命令的功能上受到一定的 限制,而C o m m a n d对象是特别为处理命令的各方面问题而创建的。实际上,当从 C o n n e c t i o n 对象中运行一条命令时,已经隐含地创建了一个 C o m m a n d对象。 有时其他对象允许向命令传入参数,但在 C o n n e c t i o n对象中不能指定参数的任何细节。使 用C o m m a n d对象允许指定参数(以及输出参数和命令执行后的返回值 )的精确细节(比如,数据 类型和长度)。 因此,除了执行命令和得到一系列返回记录,也可能得到一些由命令提供的附加信息。 对于那些不返回任何记录的命令,如插入新数据或更新数据的 S Q L查询,C o m m a n d对象 也是有用的。 8.2.3 Recordset对象 R e c o r d s e t对象是A D O中使用最为普遍的对象,因为它含有从数据存储中提取的数据集。 我们经常运行不返回数据的命令,比如那些增加或更新数据的命令,但在大多数情况下很有 可能会取得一系列记录。 R e c o r d s e t对象是拥有这些记录的对象。可以更改 (增加、更新和删除)记录集中的记录,上 下移动记录,过滤记录并只显示部分内容等等。 R e c o r d s e t对象也包含F i e l d s集合,F i e l d s集合 中有记录集中每一个字段(列)的F i l e d对象。 无论是在A S P页面中处理数据,还是利用远程数据服务 ( R D S )远程使用数据,R e c o r d s e t对 象是必须处理的对象。 8.2.4 Record对象 ADO 2.5以前的版本在处理结构化数据上是很有效的,比如从数据库中取出记录集,但无 法处理每一行的列 (也就是列数和数据类型 )可能不同的数据。对于 S Q L数据这不是一个问题, 但对于文件和邮件系统, We b服务器和别的诸如此类的数据存储会如何呢?我们把这些数据 看作是半结构化的数据,与记录集相比结构性较差,但与那些常用来代表文本或图像的二进 制数据相比更具有结构性。 通常,半结构化数据的存储采用树状结构来组织,有节点、子节点和文件。例如,设想 一个有文件夹、子文件夹和文件的 We b站点。图8 - 4所示的屏幕图显示了一台机器的 We b站点, 特别是还有一个名为p u b l i c的虚拟目录。 如果一定要在A D O中进行建模,会觉得这非常适合记录集,可能是嵌套的记录集。然而 注意高亮显示的目录,该目录含有不同类型的文件,里面有几个目录、一个 A S P文件、一个 文本文件和一个 W O R D文档。你会很容易地将其映射到一个拥有名称、类型、上次存取时间 等字段的记录集,遗憾的是并不是这样简单。对于访问权限而言,在文件和目录之间就有区 别。对于目录,需要的是能访问目录下的文件;而对于文件,却可能是需要访问其内容。 由于其复杂性,引入了R e c o r d对象。在上面的情况下,存在有一些相同属性的条目的一个 集合,但是每个条目也有独特的属性,因此需要使用别的方法去处理这些数据。把一个集合映 射到一个记录集,一个单独的文件映射成一条记录,相应的文件属性就映射成 F i e l d s集合。 第8章 ADO 基 础计计249 下载
250 ASP3高级编程 Chinapub.com 下载 的入日吗显· oo 2.5 object Model orang wth XM Data 1. Working wth xM Data +12- The Dream of LOA , a2750-Professiond ADo 2.5 图8-4显示了一台机器的web站点的界面 这意味着有了一个含有九行记录的记录集。访问记录集中单独的一行就会得到该文件的 属性(字段),但是提供给我们的仅仅是属性。为了访问文件或目录的内容,需要使用 Record对 象,该对象包含文件或目录的独特属性。习惯于这个概念有一定的困难,但不必担心,在第 11、12章你会看到更多的有关 Record对象的例子 Windows2000初始版本发布以来,只有用于 Internet发布的 OLE DE提供者使用 Record对象。一旦微软 Exchange6.0发布,将成为以类似方法利用记录集和记录提供 对 Exchange信息库访问的 OLE DB提供者。 82.5 Strean对象 Stream对象用于访问节点的内容,比如一个EMai消息,或一个Web页面。利用 Stream对 象可以访问文件或资源的真实内容。因此,结合 Record和 Recordset对象,不仅可以访问Web 服务器上的文件或emai消息,还可以访问相应的内容。这样,就可以创建一个只使用ADO去 访问邮件系统的邮件客户。这也许不会有太多的优点,但意味着可不必了解邮件系统的API或 对象模型,减少了学习上的弯路。 Stream的另一个用途是XML,可以访问一系列作为XML流的数据(结构化或半结 构化)。 Stream对象用来处理二进制数据,所以,可以用来处理BLOB类型的数据,比如数据库中 的图像或大文本数据。 同样,在本书第11、12章中你会看到更多的有关 Stream对象的例子。 82.6集合 ADO对象库中有一些集合,每个集合都有零个或更多个与其关联的对象的拷贝。可以使 用相同的代码结构去遍历这些集合 在 SCript中的语法是 For Each Object In collection Do something with Object
图8-4 显示了一台机器的We b站点的界面 这意味着有了一个含有九行记录的记录集。访问记录集中单独的一行就会得到该文件的 属性(字段),但是提供给我们的仅仅是属性。为了访问文件或目录的内容,需要使用 R e c o r d对 象,该对象包含文件或目录的独特属性。习惯于这个概念有一定的困难,但不必担心,在第 11、1 2章你会看到更多的有关R e c o r d对象的例子。 Windows 2000初始版本发布以来,只有用于 I n t e r n e t发布的OLE DB提供者使用 R e c o r d对象。一旦微软Exchange 6.0发布,将成为以类似方法利用记录集和记录提供 对E x c h a n g e信息库访问的OLE DB提供者。 8.2.5 Stream对象 S t r e a m对象用于访问节点的内容,比如一个 E - M a i l消息,或一个We b页面。利用S t r e a m对 象可以访问文件或资源的真实内容。因此,结合 R e c o r d和R e c o r d s e t对象,不仅可以访问 We b 服务器上的文件或 e m a i l消息,还可以访问相应的内容。这样,就可以创建一个只使用 A D O去 访问邮件系统的邮件客户。这也许不会有太多的优点,但意味着可不必了解邮件系统的 A P I或 对象模型,减少了学习上的弯路。 S t r e a m的另一个用途是X M L,可以访问一系列作为 X M L流的数据(结构化或半结 构化)。 S t r e a m对象用来处理二进制数据,所以,可以用来处理 B L O B类型的数据,比如数据库中 的图像或大文本数据。 同样,在本书第11、1 2章中你会看到更多的有关S t r e a m对象的例子。 8.2.6 集合 A D O对象库中有一些集合,每个集合都有零个或更多个与其关联的对象的拷贝。可以使 用相同的代码结构去遍历这些集合: 在V B S c r i p t中的语法是: 250计计ASP 3 高级编程 下载 Collection
第章AD0基c251 下载 例如,遍历一个 Recordset对象的 fields集: For Each objField In rs Fields Response. Write objField Name&. 如果选择 JScript,那么可以使用 Enumerator对象 for (ob]Field new Enumerator(rs Fields) lobjField atEnd() objField moveNext()) Response. Write (ob]Field item(). Name +'') 1. Fields集合 ields集合拥有与记录集或记录关联的 Field对象。对基于结构化数据的记录集,比如SQL 数据,字段相应于数据中的列,并含有列的详细内容,比如名称、数据类型、长度等等。在 以后几章看到大量的关于 Fields集合的例子。 对于半结构化的数据,对象的属性相应于字段。在第12章会看到更多的相关的介绍 2. Parameters集合 Parameters集合仅被 Command对象使用,确定在存储命令中的参数。SQL数据库中的存 储过程频繁地使用参数,并允许数据传入和传出预先定义的SQL语句。如果拥有向ADO返回 信息的参数,则会十分有用,因为这样从存储过程中返回的就不只是一个记录集。例如,考 虑一个更新多个表然后返回一个记录集的复杂存储过程,可以用一个输出参数显示更新了多 少条记录 另一个使用参数的理由是性能问题,特别是在仅仅需要从存储过程返回单个值的时候。 在这种情况下,没有创建记录集的必要,只需要保存一个值即可,因而不需要返回记录集, 而返回输出参数的值是更为有效的方法。 在第9章会看到有关 Parameters集合的详细介绍 3. Errors集合 Errors集合包含因运行命令而引起的上一次ADO或 OLE DB提供者错误的详细内容,只能 被 Connection对象访问。可能会觉得这是个限制,因为不必显式定义 Connection对象,但可以 过 Command、 Recordset和 Record对象的 Active Connection属性访问隐含的 Connection对象。 For Each objError In reConnection Erro 在本章后面,将详细讨论 Errors集合。 Connection 4. Properties集合 为了避免混乱, Properties集合没有在前 面的对象模型图上加以显示。它与对象模型的 Properties 关系显示在图8-5中。 I command Record Properties集合存在的原因是因为ADO是 用来处理许多不同的数据存储,都有不同的特 征。将属性( Property)组成一个集合,可以使 Recordset 能够动态地根据不同的数据提供者而随时改 变。例如,Jet的 OLE DB提供者允许访问Jet特 图8-5 Property与对象之间的关系
例如,遍历一个R e c o r d s e t对象的F i e l d s集: 如果选择J S c r i p t,那么可以使用E n u m e r a t o r对象: 1. Fields集合 F i e l d s集合拥有与记录集或记录关联的 F i e l d对象。对基于结构化数据的记录集,比如 S Q L 数据,字段相应于数据中的列,并含有列的详细内容,比如名称、数据类型、长度等等。在 以后几章看到大量的关于F i e l d s集合的例子。 对于半结构化的数据,对象的属性相应于字段。在第 1 2章会看到更多的相关的介绍。 2. Parameters集合 P a r a m e t e r s集合仅被Command 对象使用,确定在存储命令中的参数。 S Q L数据库中的存 储过程频繁地使用参数,并允许数据传入和传出预先定义的 S Q L语句。如果拥有向 A D O返回 信息的参数,则会十分有用,因为这样从存储过程中返回的就不只是一个记录集。例如,考 虑一个更新多个表然后返回一个记录集的复杂存储过程,可以用一个输出参数显示更新了多 少条记录。 另一个使用参数的理由是性能问题,特别是在仅仅需要从存储过程返回单个值的时候。 在这种情况下,没有创建记录集的必要,只需要保存一个值即可,因而不需要返回记录集, 而返回输出参数的值是更为有效的方法。 在第9章会看到有关P a r a m e t e r s集合的详细介绍。 3. Errors集合 E r r o r s集合包含因运行命令而引起的上一次 A D O或OLE DB提供者错误的详细内容,只能 被C o n n e c t i o n对象访问。可能会觉得这是个限制,因为不必显式定义 C o n n e c t i o n对象,但可以 通过C o m m a n d、R e c o r d s e t和R e c o r d对象的A c t i v e C o n n e c t i o n属性访问隐含的C o n n e c t i o n对象。 例如: 在本章后面,将详细讨论E r r o r s集合。 4. Properties集合 为了避免混乱, P r o p e r t i e s集合没有在前 面的对象模型图上加以显示。它与对象模型的 关系显示在图8 - 5中。 P r o p e r t i e s集合存在的原因是因为 A D O是 用来处理许多不同的数据存储,都有不同的特 征。将属性 ( P r o p e r t y )组成一个集合,可以使 之能够动态地根据不同的数据提供者而随时改 变。例如,J e t的OLE DB提供者允许访问J e t特 第8章 ADO 基 础计计251 下载 图8-5 Property 与对象之间的关系
252 ASP3高级编程 Chinapub.com 下载 殊的安全属性: et coni ver. CreateObject("ADODB Connection") onDB op =Win conDB. Properties(Jet OLEDB: Database Password")-.LetMeIn 其他的提供者没有这个属性,因此把它加到 Connection对象中作为一个静态属性是不明智 的。ADO根据所使用的 OLE DB提供者,会用提供者缺省值填充属性集合。 虽然这里有关于 Properties集合的使用说明,但在本书中不准备详细叙述 Properties集合。要获得更多的关于该集合的介绍,请参阅《 Professional ado2.5 Programming》或《ADO25 Programmings Reference》,两者都由Wrox出版 827ADO常数 当使用ADO时,会发现有许多预先定义的用于众多选项的常数,比如定义光标类型和锁 类型的常数。使用像 Visual basic或Ⅴ Visual c++这样的语言,一旦引用了ADO类型库,自然会 用到这些常数。在ASP中情况不同,有两种选择 引用常数的第一种方法是把它们包含进ASP文件: 可以将包含文件拷入本地目录,或者从安装目录引用它,其缺省路径为C:\ Program Files\Common Files\System \ado(以上文件包含用于Ⅴ SCript的ADO常数——对于 JScript,应 该使用 adojavas.Inc)。使用这个方法的一点不足是会使ASP页面变得过大,因为包含了全部的 常数,而其中许多是不需要使用的 可以创建自己的只含有所需要的常数的包含文件,但越来越多地使用ADO的功 能时,很可能会发现需要不断地编辑、维护这个文件。 个比较好的解决的方法是创建一个对类型库的引用,这种方法不需要将常数包含进 ASP文件而直接可以引用常数 不要怀疑这个DLL的名字 mado l5d这是一个正确的名字,包含最新版本的 ADO。 可以在需要的地方把这个 METADATA语句包含进每一个ASP文件,或者放入 global.asa文 件,这样应用程序中的每个Web页面都可以引用这些常数 8.3连接到数据存储 如果需要访问一个数据存储,应该创建一个到数据存储的连接。前面已经提到过:可以 显式地创建一个 Connection对象,或者让ADO隐含地创建一个连接。对于任何一种方式,都 必须知道数据存储的详细内容 虽然用于连接的实际细节不尽相同,但对于所有类型的数据存储,其连接的实际方法是 相同的。这并不令人惊奇,因为不同的提供者需要不同类型的信息。在允许用户访问数据存
殊的安全属性: 其他的提供者没有这个属性,因此把它加到 C o n n e c t i o n对象中作为一个静态属性是不明智 的。A D O根据所使用的OLE DB提供者,会用提供者缺省值填充属性集合。 虽然这里有关于 P r o p e r t i e s集合的使用说明,但在本书中不准备详细叙述 P r o p e r t i e s集合。要获得更多的关于该集合的介绍,请参阅 《Professional ADO 2.5 P r o g r a m m i n g》或《ADO 2.5 Programming's Reference》,两者都由Wr o x出版。 8.2.7 ADO常数 当使用A D O时,会发现有许多预先定义的用于众多选项的常数,比如定义光标类型和锁 类型的常数。使用像 Visual Basic或Visual C++这样的语言,一旦引用了 A D O类型库,自然会 用到这些常数。在A S P中情况不同,有两种选择。 引用常数的第一种方法是把它们包含进 A S P文件: 可以将包含文件拷入本地目录,或者从安装目录引用它,其缺省路径为 C:\ P r o g r a m Files\Common Files\System\ado(以上文件包含用于 V B S c r i p t的A D O常数—对于J S c r i p t,应 该使用a d o j a v a s . I n c )。使用这个方法的一点不足是会使 A S P页面变得过大,因为包含了全部的 常数,而其中许多是不需要使用的。 可以创建自己的只含有所需要的常数的包含文件,但越来越多地使用 A D O的功 能时,很可能会发现需要不断地编辑、维护这个文件。 一个比较好的解决的方法是创建一个对类型库的引用,这种方法不需要将常数包含进 A S P文件而直接可以引用常数: 不要怀疑这个 D L L的名字m s a d o 1 5 . d l l,这是一个正确的名字,包含最新版本的 A D O。 可以在需要的地方把这个 M E TA D ATA语句包含进每一个A S P文件,或者放入g l o b a l . a s a文 件,这样应用程序中的每个 We b页面都可以引用这些常数。 8.3 连接到数据存储 如果需要访问一个数据存储,应该创建一个到数据存储的连接。前面已经提到过:可以 显式地创建一个 C o n n e c t i o n对象,或者让A D O隐含地创建一个连接。对于任何一种方式,都 必须知道数据存储的详细内容。 虽然用于连接的实际细节不尽相同,但对于所有类型的数据存储,其连接的实际方法是 相同的。这并不令人惊奇,因为不同的提供者需要不同类型的信息。在允许用户访问数据存 252计计ASP 3 高级编程 下载
第章AD0基c253 下载 储之前,一些提供者需要用户的证书,而别的提供者却接受默认的安全证书 连接到数据源有好几种方法: ·连接字符串。在字符串中放入连接的细节,或在打开数据存储时,直接将连接细节加入 到命令中。这种方法的优点是连接细节将保留在ASP页面中。不足之处,如果你有较多 的页面,在改变了连接细节时,将陷于繁重的维护工作当中。解决的方法是创建一个包 含连接细节的字符串变量,并放进一个ASP包含文件,这样的话仅仅有一个连接字符串 的实例,但能保持与其他的ASP页面相符。另一个常用的技术就是将应用程序中的连接 字符串存储到状态变量中,这样可以被应用程序中的所有页面使用。 ·数据链接文件。这是一个含有连接细节的文件(扩展名为udl)。优点是对于任何数量的 ASP页面只需要一个数据链接文件。要创建一个数据链接文件,只需创建一个新的文本 文件,并重新命名(要确保 Windows资源管理器显示文件扩展名)。一旦重新命名了该文 件,就可以打开它(双击)以显示 Data Link Properties对话框。以前版本的ADO允许从 Windows资源管理器的New菜单建立数据链接文件。我们将在本章稍后看到有关数据链 接文件的内容。 ODBC数据源,或DSN。有点类似于数据链接文件,但只适用于ODBC数据源。它们集 中起来用于ASP页面,数据源必须是系统数据源。ODBC数据源从ODBC数据源管理器 ( ODBC Data Source Administrator)中创建,这个工具可在 Administrative tools文件夹中 找到 这三种方法无论那一种都可以使用,使用那一种只是一种偏爱而已。直接的连接字符串 可能速度快一些,因为提供所有的连接细节。数据链接文件需要从文件中读出连接细节 ODBC数据源需要从注册表中读取连接细节。当然,速度的差异是很小的,每种方法各有优 3.1连接字符串 连接字符串依赖于提供者,因为每个数据提供者可能需要不同的细节 值得注意的重要一点是,ODBC的 OLE DE提供者是缺省的,所以,如果不使用 Provide=部分,系统将自动地使用ODBC。 下面为不同的提供者列举了连接字符串的例子,在本书的后面将会看到更多的例子 1.微软 Access 如果使用ODBC,而没有DSN: Driver=(Microsoft Access Driver ( mab)): DBQ=C: \wrox\database name. mdb 对于本地的 OLE DE提供者 Provider=Microsoft Jet OLEDB, 4.0: Data Source= C: \wrox\ database name. mdb 上面的例子说明了 Access数据库存放于C: \wrox目录下。虽然读者可能会尝试将数据库作 为web文件存放于相同的目录下,但不要这样做,否则任何人都可以下载整个数据库文件。 将数据库存放于Web目录外永远是明智的,没有人可以从外面访问该文件 2.微软 SQL Server 对于微软 SQL Server,使用针对ODBC的提供者:
储之前,一些提供者需要用户的证书,而别的提供者却接受默认的安全证书。 连接到数据源有好几种方法: • 连接字符串。在字符串中放入连接的细节,或在打开数据存储时,直接将连接细节加入 到命令中。这种方法的优点是连接细节将保留在 A S P页面中。不足之处,如果你有较多 的页面,在改变了连接细节时,将陷于繁重的维护工作当中。解决的方法是创建一个包 含连接细节的字符串变量,并放进一个 A S P包含文件,这样的话仅仅有一个连接字符串 的实例,但能保持与其他的 A S P页面相符。另一个常用的技术就是将应用程序中的连接 字符串存储到状态变量中,这样可以被应用程序中的所有页面使用。 • 数据链接文件。这是一个含有连接细节的文件 (扩展名为. u d l )。优点是对于任何数量的 A S P页面只需要一个数据链接文件。要创建一个数据链接文件,只需创建一个新的文本 文件,并重新命名 (要确保Wi n d o w s资源管理器显示文件扩展名 )。一旦重新命名了该文 件,就可以打开它 (双击)以显示 Data Link Properties对话框。以前版本的 A D O允许从 Wi n d o w s资源管理器的N e w菜单建立数据链接文件。我们将在本章稍后看到有关数据链 接文件的内容。 • O D B C数据源,或D S N。有点类似于数据链接文件,但只适用于 O D B C数据源。它们集 中起来用于A S P页面,数据源必须是系统数据源。 O D B C数据源从O D B C数据源管理器 (ODBC Data Source Administrator)中创建,这个工具可在Administrative To o l s文件夹中 找到。 这三种方法无论那一种都可以使用,使用那一种只是一种偏爱而已。直接的连接字符串 可能速度快一些,因为提供所有的连接细节。数据链接文件需要从文件中读出连接细节, O D B C数据源需要从注册表中读取连接细节。当然,速度的差异是很小的,每种方法各有优 缺点。 8.3.1 连接字符串 连接字符串依赖于提供者,因为每个数据提供者可能需要不同的细节。 值得注意的重要一点是, O D B C的OLE DB提供者是缺省的,所以,如果不使用 Provide = 部分,系统将自动地使用 O D B C。 下面为不同的提供者列举了连接字符串的例子,在本书的后面将会看到更多的例子。 1. 微软A c c e s s 如果使用O D B C,而没有D S N: 对于本地的OLE DB提供者: 上面的例子说明了 A c c e s s数据库存放于C : \ w r o x目录下。虽然读者可能会尝试将数据库作 为We b文件存放于相同的目录下,但不要这样做,否则任何人都可以下载整个数据库文件。 将数据库存放于We b目录外永远是明智的,没有人可以从外面访问该文件。 2. 微软SQL Server 对于微软SQL Server,使用针对O D B C的提供者: 第8章 ADO 基 础计计253 下载