hinapub.com 下载 第12章通用数据访问 通用数据访问( Universal data access,UDA)是对 Microsoft访问多种数据源数据的策略的 称呼。不必担心,它并不是那些新的将改变我们所做的每项工作的开发技术。事实上,此时 也许我们正在使用着UDA的一部分。前面的几章已经向读者介绍了怎样用ADO来访问数据库, 尤其是关系数据库,而这就是UDA的一部分。数据以不同的形式出现,而UDA的思想就是通 过使用 OLE DB和ADO实现对数据的访问 本章将介绍什么是UDA,以及为什么要集中介绍UDA。我们将介绍以下内容: UDA如何与全球的web开发人员相适应 可访问通用数据的 OLE DB提供者 半结构化的数据的定义,如何使用这些数据 Internet发布怎样改变人们的生活。 企业界中的数据存储和ASP 实际上,本章所涉及的内容相当多且相当广泛,我们只能用较少的篇幅进行介绍。 121UDA的构想 UDA实际上就是使用相同技术来访问不同类型数据的能力。这并不是一种新思想,而是 对现有的ODBC技术的扩展。ODBC提供了一种访问关系数据库的方法,并成为跨数据库访问 的标准 虽然ODBC很成功,但也有其自身的缺点,那就是无法访问非关系数据库中的数据。当使 用ODBC访问文本文件或电子表格时,确实受到较大范围的限制。当前越来越多的数据正以 应用程序 ADO OLE DB RDBMS 目录服务 据存储 图12-1UDA的构想示意图
下载 第12章 通用数据访问 通用数据访问(Universal Data Access,U D A )是对M i c r o s o f t访问多种数据源数据的策略的 称呼。不必担心,它并不是那些新的将改变我们所做的每项工作的开发技术。事实上,此时 也许我们正在使用着U D A的一部分。前面的几章已经向读者介绍了怎样用 A D O来访问数据库, 尤其是关系数据库,而这就是 U D A的一部分。数据以不同的形式出现,而 U D A的思想就是通 过使用OLE DB和A D O实现对数据的访问。 本章将介绍什么是U D A,以及为什么要集中介绍U D A。我们将介绍以下内容: • UDA如何与全球的We b开发人员相适应。 • 可访问通用数据的OLE DB提供者。 • 半结构化的数据的定义,如何使用这些数据。 • Internet发布怎样改变人们的生活。 • 企业界中的数据存储和A S P。 实际上,本章所涉及的内容相当多且相当广泛,我们只能用较少的篇幅进行介绍。 12.1 UDA的构想 U D A实际上就是使用相同技术来访问不同类型数据的能力。这并不是一种新思想,而是 对现有的O D B C技术的扩展。O D B C提供了一种访问关系数据库的方法,并成为跨数据库访问 的标准。 虽然O D B C很成功,但也有其自身的缺点,那就是无法访问非关系数据库中的数据。当使 用O D B C访问文本文件或电子表格时,确实受到较大范围的限制。当前越来越多的数据正以 VC++ VB 脚本 应用程序 ADO RDBMS E-mail 目录服务 数据存储 OLE DB Java 图12-1 UDA的构想示意图
376Ap;高编程 Chinapub.com 下载 文档的形式存储,如金融系统、邮件系统等,而ODBC恰恰不是为访问这些数据而设计的。 同时,还有大量的传统数据不是精确符合关系数据库的格式 为了解决这个问题, Microsoft推出了UDA。实际上,UDA只是对 Microsoft多年努力的成 果的一个称呼。如果没有记错的话,我是在1994年初识 OLE DB的,即访问ODBC数据的第 个测试版本(不是很完善)。从那时起, Microsoft就开始注意扩展 OLE DB所访问的数据范围, 不仅是关系数据库,还有其他数据提供者。 使用ADO2.5可以访问不同形式的数据,但所有的数据访问都是通过相同的简单对象来实 现的。这使得数据访问变得通用化了,即同样的技术可用不同的语言实现,只要稍做修改就 可以了。 UDA的核心是 OLE DB。而 OLE DB基于ODBC,但比它更进一步。在前面第一次讨论 ADO时,我们就是利用 OLE DE提供者来访问数据存储的。为了进一步理解,看一下图12-1 这里,我们可以看到 OLE DE不仅可用于访问数据库,而且可用于访问所有不同类型的数 据。虽然现在 OLE DE大多用于访问关系数据库,但访问其他类型的数据也毫无问题 122 OLE DB提供者 是否有 OLE DB提供者是唯一限制用户访问数据的因素。如果有,那么通过一般的OLE DB或ADO命令就可以访问数据。如果产品的供应商没有编写数据提供者,那么将来设计OLE DB提供者的可能性就会很大。这是一个很简单的事情。如果想让别人使用自己的产品,必须 提供一种简易的访问数据的方法 OLE DB和ADO是为了满足多种数据类型的需要,以及为在Web方案中使用数据而开发设 计的。Web仍在不断扩展,ASP正成为Web应用程序中间层的一个重要组成部分,所以我们必 须考虑web服务器中数据的不同存储方式。 使用 OLE DB提供者可以扩展Web应用程序而不必学习新的技术,我们只需为不同类型的 数据使用不同的提供者。提供者是很多的,但这里需要研究的是那些可用来访问非关系数据 库数据的提供者。特别是,将研究集成了多种 Microsoft技术的提供者,并介绍如何在Web应 用程序中使用它们 12.2.1 Indexing Service 如果web站点为用户提供信息访问功能,那么很有可能需要为用户提供某种形式的搜索 功能。 Indexing service(索引服务)与IS集成在一起,并且有一个 OLE DB提供者可对 Indexing Service目录进行只读访问。 本书对 Indexing service的安装、使用及其高级功能不做介绍 1. Indexing Service分析 Indexing service可以说与数据库管理服务器相似。它们都拥有信息,并允许通过查询访 问信息。两者的本质区别在于数据库管理服务器,比如 SQL Server必须需要某些人往表中填 写数据,而 Indexing service自动地做了这项工作。对大多数开发人员来说,很难完全理解这 个工作过程,但至少应理解以下几点 Indexing service的最基本的组成部分是 Index条目。如果这是数据库表中的一条记录, 那么它仅是一个关键字或一个对已建立的关键字的文档的引用。这些记录可能会在数据
文档的形式存储,如金融系统、邮件系统等,而 O D B C恰恰不是为访问这些数据而设计的。 同时,还有大量的传统数据不是精确符合关系数据库的格式。 为了解决这个问题,M i c r o s o f t推出了U D A。实际上,U D A只是对M i c r o s o f t多年努力的成 果的一个称呼。如果没有记错的话,我是在 1 9 9 4年初识OLE DB的,即访问O D B C数据的第一 个测试版本(不是很完善)。从那时起,M i c r o s o f t就开始注意扩展 OLE DB所访问的数据范围, 不仅是关系数据库,还有其他数据提供者。 使用ADO 2.5可以访问不同形式的数据,但所有的数据访问都是通过相同的简单对象来实 现的。这使得数据访问变得通用化了,即同样的技术可用不同的语言实现,只要稍做修改就 可以了。 U D A的核心是 OLE DB。而OLE DB基于O D B C,但比它更进一步。在前面第一次讨论 A D O时,我们就是利用OLE DB提供者来访问数据存储的。为了进一步理解,看一下图 1 2 - 1。 这里,我们可以看到OLE DB不仅可用于访问数据库,而且可用于访问所有不同类型的数 据。虽然现在OLE DB大多用于访问关系数据库,但访问其他类型的数据也毫无问题。 12.2 OLE DB提供者 是否有OLE DB提供者是唯一限制用户访问数据的因素。如果有,那么通过一般的 O L E D B或A D O命令就可以访问数据。如果产品的供应商没有编写数据提供者,那么将来设计 O L E D B提供者的可能性就会很大。这是一个很简单的事情。如果想让别人使用自己的产品,必须 提供一种简易的访问数据的方法。 OLE DB和A D O是为了满足多种数据类型的需要,以及为在 We b方案中使用数据而开发设 计的。We b仍在不断扩展,A S P正成为We b应用程序中间层的一个重要组成部分,所以我们必 须考虑We b服务器中数据的不同存储方式。 使用OLE DB提供者可以扩展We b应用程序而不必学习新的技术,我们只需为不同类型的 数据使用不同的提供者。提供者是很多的,但这里需要研究的是那些可用来访问非关系数据 库数据的提供者。特别是,将研究集成了多种 M i c r o s o f t技术的提供者,并介绍如何在 We b应 用程序中使用它们。 12.2.1 Indexing Service 如果We b站点为用户提供信息访问功能,那么很有可能需要为用户提供某种形式的搜索 功能。Indexing Service(索引服务)与I I S集成在一起,并且有一个 OLE DB提供者可对I n d e x i n g S e r v i c e目录进行只读访问。 本书对Indexing Service的安装、使用及其高级功能不做介绍。 1. Indexing Service分析 Indexing Service可以说与数据库管理服务器相似。它们都拥有信息,并允许通过查询访 问信息。两者的本质区别在于数据库管理服务器,比如 SQL Server必须需要某些人往表中填 写数据,而Indexing Service自动地做了这项工作。对大多数开发人员来说,很难完全理解这 个工作过程,但至少应理解以下几点: • Indexing Service的最基本的组成部分是 I n d e x条目。如果这是数据库表中的一条记录, 那么它仅是一个关键字或一个对已建立的关键字的文档的引用。这些记录可能会在数据 376计计ASP 3 高级编程 下载
第2章湖用数访377 下载 库中的一个表中,而另一个表可能包含第一个表所引用的所有文档。这两个表的概念在 Indexing Service中表示为 Word List和 Saved Index 有了 Indexing Service,离散数据库就是我们所知的目录( catalog)。正如 SQL Server能处 理多个数据库一样, Indexing service也可以处理多个目录。目录一般被捆绑在主机所提 供的基于 Internet的服务上。因此,假如你有一个Web站点并用NNTP服务提供新闻组, 可以为它们提供一个目录。如果使用虚拟Web站点,它们中的每一个也可以有一个目 录 当服务启动时,他知道从哪里开始搜索索引的条目,因此他建立了一个被索引的文件列 表。我们把这项工作称为扫描。被索引的条目可以是存储于文件夹中的任何文件。文件夹通 常被设置为服务环境中的虚拟路径。这就是我们所知的作用范围。 旦扫描过程完成,过滤过程就开始了。在过滤期间, Indexing service将试图打开一个 候选文件。一旦打开该文件, Indexing service就会对此文件进行解析,并为每个关键字构 个索引条目。同时,也为文件计算其他的键参数。解析一个文件需要了解文件的结构。这 个信息收集在被称为过滤器的库文件中。 Microsoft t经开发了大多数在 Internet和 Internet服 务中常见的内容类型的过滤器 使用非标准或非 Microsoft文件格式的厂商也提供自己的过滤器。例如, Adobe公 司就为PDF文档标准提供了过滤器。因此,如果你创建了自己的文件格式,那么应该 为它定义一个过滤器。 “特征”和“文档属性”是两个需要理解的重要概念。 在某种意义上,特征( characterization)指的是文档的摘要(或执行概要)。特征通常是文档 中可表示部分的前n个字符。可表示部分一般是显示的(或表现的)文档的部分内容。比如一个 HTML页面的特征一般是指位于<BODY>标记之间的内容(自然,也有例外)。 Indexing Service 允许用户决定文档的特征有多大。一般来说,250~500个词足够了。当从 Indexing Service返回 查询结果时,特征是经常显示的信息。文本的开头部分通常是显示的最佳选择,因为他可使 用户很快就能决定这个文档是否需要进行深入研究 然而,文档的大量附加信息也可以从 Indexing service的文档属性中获得。这些属性是正 式的 ActiveX文档属性。 Indexing Service说明了40多种这样的属性。文件大小、数据的创建时 间、最近访问时间、最近修改时间以及文件的位置是,ASP应用程序中对 Indexing service查 询起决定作用的最重要的属性。 Indexing Service3.0与 Index server的对比 如果你在IS3.0或40环境下开发ASP程序,也许想知道为什么要使用 Indexing service而 不是 Index server,他们不是一回事吗? 可以说是,也可以说不是。 Indexing service与 Index server完成了相同的工作,即创建了 引用文档的查询数据库。但 Indexing service带来了一些新的以及改进过的功能 那些抱怨 Microsoft在IS40环境下的 NT Workstation中删除了 Index server的人,现在可 以放心了,因为在 Windows2000 Professiona中包含 Indexing service。事实上在 Windows2000家族中,当查找文件夹或文件时, Start菜单中的査找选项就使用了 Indexing Service 现在结果集可以由 Query对象获得。利用这种方法,可以通过使用某个属性向 Indexing
库中的一个表中,而另一个表可能包含第一个表所引用的所有文档。这两个表的概念在 Indexing Service中表示为Word List和Saved Index。 • 有了Indexing Service,离散数据库就是我们所知的目录 ( c a t a l o g )。正如SQL Server能处 理多个数据库一样,Indexing Service也可以处理多个目录。目录一般被捆绑在主机所提 供的基于I n t e r n e t的服务上。因此,假如你有一个 We b站点并用N N T P服务提供新闻组, 可以为它们提供一个目录。如果使用虚拟 We b站点,它们中的每一个也可以有一个目 录。 当服务启动时,他知道从哪里开始搜索索引的条目,因此他建立了一个被索引的文件列 表。我们把这项工作称为扫描。被索引的条目可以是存储于文件夹中的任何文件。文件夹通 常被设置为服务环境中的虚拟路径。这就是我们所知的作用范围。 一旦扫描过程完成,过滤过程就开始了。在过滤期间, Indexing Service将试图打开一个 候选文件。一旦打开该文件, Indexing Service就会对此文件进行解析,并为每个关键字构建 一个索引条目。同时,也为文件计算其他的键参数。解析一个文件需要了解文件的结构。这 个信息收集在被称为过滤器的库文件中。 M i c r o s o f t已经开发了大多数在 I n t e r n e t和Internet 服 务中常见的内容类型的过滤器。 使用非标准或非M i c r o s o f t文件格式的厂商也提供自己的过滤器。例如, A d o b e公 司就为P D F文档标准提供了过滤器。因此,如果你创建了自己的文件格式,那么应该 为它定义一个过滤器。 “特征”和“文档属性”是两个需要理解的重要概念。 在某种意义上,特征 ( c h a r a c t e r i z a t i o n )指的是文档的摘要 (或执行概要)。特征通常是文档 中可表示部分的前 n个字符。可表示部分一般是显示的 (或表现的)文档的部分内容。比如一个 H T M L页面的特征一般是指位于< B O D Y >标记之间的内容(自然,也有例外)。Indexing Service 允许用户决定文档的特征有多大。一般来说, 2 5 0 ~ 5 0 0个词足够了。当从Indexing Service返回 查询结果时,特征是经常显示的信息。文本的开头部分通常是显示的最佳选择,因为他可使 用户很快就能决定这个文档是否需要进行深入研究。 然而,文档的大量附加信息也可以从 Indexing Service的文档属性中获得。这些属性是正 式的A c t i v e X文档属性。Indexing Service说明了4 0多种这样的属性。文件大小、数据的创建时 间、最近访问时间、最近修改时间以及文件的位置是, A S P应用程序中对 Indexing Service查 询起决定作用的最重要的属性。 Indexing Service 3.0与Index Server的对比 如果你在IIS 3.0或4 . 0环境下开发A S P程序,也许想知道为什么要使用 Indexing Service而 不是Index Server,他们不是一回事吗? 可以说是,也可以说不是。 Indexing Service与Index Server完成了相同的工作,即创建了 引用文档的查询数据库。但 Indexing Service带来了一些新的以及改进过的功能。 • 那些抱怨M i c r o s o f t在IIS 4.0环境下的NT Wo r k s t a t i o n中删除了Index Server的人,现在可 以放心了,因为在 Windows 2000 Professional 中包含 Indexing Service。事实上在 Windows 2000 家族中,当查找文件夹或文件时, S t a r t菜单中的查找选项就使用了 Indexing Service。 • 现在结果集可以由 Q u e r y对象获得。利用这种方法,可以通过使用某个属性向 I n d e x i n g 第1 2章 通用数据访问计计377 下载
378 ASP3高级编程 Chinapub.com 下载 Service请求返回结果集 多种语言用于建立查询。 随同Web内容, Indexing service也维护本地文件系统中的文件的一个目录。这有点类似 于 Microsoft office中的快速查找程序 在 Index server的早期版本中,文件系统在内容索引服务开始时就被彻底扫描一次。现 在被索引的内容放在新的NTFS5文件系统中,只有改变过的文件才会被再次扫描。 协助维护 Indexing Service的三个新对象与 Query和 Utility对象协同工作,它们分别是 AdminIndex Server、 CatEd和 ScopeD对象 2.搜索索引目录 使用ADO查找目录最为不方便之处在于需要经常不断地分析用户的输入,以使查询正常 工作。分析一下查找“ ASP ADO”的工作情况。它可能有以下三种含义: 找出所有既包含ASP又包含ADO的文档。 ·找出所有包含ASP,或者包含ADO,或者包含两者的文档。 找出所有包含ASP,并且ASP后面跟有字符ADO的页面 通常,用户会假定某一种行为,除非你明确表明程序将做某些不同的事。而用户的假定 可能各不相同。更糟的是仅仅传递一个“ ASP ADO”,在ADO查询技术中会产生下面的错误 Microsoft OLE DB Provider for Microsoft Indexiing Service error 80040e 14 Incorrect Syntax near 'ADO. Expected". SQLSTATE= 42000 这就是问题的所在。多数情况下,在把查找项目包括进SQL查询之前,要把它们分解为 单个的条目和操作符。这要付出时间,如果不能达到目的,可能还需要另外的时间。在介绍 Indexing Server中的SQL语言时,我们会详细分析怎样分解输入的词组 由于 Indexing Service不是数据库,因此有两点需加以注意 Indexing Service目录是连接的数据源 Indexing Service提供者使用SQL语言的扩展。 为了显示查询 Indexing Service是多么容易,下面来创建一个web页面的例子。首先,以 搜索窗体 Searchfor html开始,如图12-2所示 service.M 和的+中·②团s由rtmw Searching The Indexing Service Using ADO Searth For: PerormSearchClear Form 1999 or Pres-PnotesgonoLA923n(sk1-651002+610) aDone 图12-2 SearchForm. html搜索窗体
S e r v i c e请求返回结果集。 • 多种语言用于建立查询。 • 随同We b内容,Indexing Service也维护本地文件系统中的文件的一个目录。这有点类似 于Microsoft Off i c e中的快速查找程序。 • 在Index Server的早期版本中,文件系统在内容索引服务开始时就被彻底扫描一次。现 在被索引的内容放在新的N T F S 5文件系统中,只有改变过的文件才会被再次扫描。 • 协助维护 Indexing Service的三个新对象与 Q u e r y和U t i l i t y对象协同工作,它们分别是 A d m i n I n d e x S e r v e r、C a t A d m和S c o p e A d m对象。 2. 搜索索引目录 使用A D O查找目录最为不方便之处在于需要经常不断地分析用户的输入,以使查询正常 工作。分析一下查找“ASP ADO”的工作情况。它可能有以下三种含义: • 找出所有既包含A S P又包含A D O的文档。 • 找出所有包含A S P,或者包含A D O,或者包含两者的文档。 • 找出所有包含A S P,并且A S P后面跟有字符A D O的页面。 通常,用户会假定某一种行为,除非你明确表明程序将做某些不同的事。而用户的假定 可能各不相同。更糟的是仅仅传递一个“ ASP ADO”,在A D O查询技术中会产生下面的错误: Microsoft OLE DB Provider for Microsoft Indexiing Service error '80040e14' Incorrect Syntax near 'ADO'. Expected '''. SQLSTATE = 42000 这就是问题的所在。多数情况下,在把查找项目包括进 S Q L查询之前,要把它们分解为 单个的条目和操作符。这要付出时间,如果不能达到目的,可能还需要另外的时间。在介绍 Indexing Server中的S Q L语言时,我们会详细分析怎样分解输入的词组。 由于Indexing Service不是数据库,因此有两点需加以注意: • Indexing Service目录是连接的数据源。 • Indexing Service提供者使用S Q L语言的扩展。 为了显示查询Indexing Service是多么容易,下面来创建一个 We b页面的例子。首先,以 搜索窗体S e a r c h F o r m . h t m l开始,如图1 2 - 2所示。 图12-2 SearchForm.html搜索窗体 378计计ASP 3 高级编程 下载
第12章通用数据访问 379 下载 相应的HTML脚本相当简单: <FORM Name='frmsearchACTION='QueryIn rver. asp METHOD="POST'> Search For: <INPUT TYPE= TEX archOn·> <P> TYPE=SUBMIT VALUE="Perform Search> TYPE=RESET VALUE="Clear Form"> 以上代码提供一个文本框,可以在其中输入搜索条件。按下 Perform Search按钮将调用 SP页面 QueryIndexServer. asp。现在分析一下该ASP页面的代码。 首先,包含文件 Connection. asp: <se LANGUAGe VbScRIPt <!--#工 NCLUDE FILE /Include/Connection. asp.--> 这包含了对ADO类型库的引用,这样就可以使用ADO常数了。 <!-- METADATA TYPE="typelib FILE="C: \ Program Files\Common Files\System\ado\msado15dll.--> 接下来,定义一些CSS样式。这些不是必须的,但这样可以比较容易地格式化输出结果 <TITLE>The Indexing Service</TITLE> YLE TYPE=t BODY ifont-family: Tahoma, Arial, sans-serif; font-size: 1opt) heading ( font-Eamily: Tahoma, Arial, sans-serif: font-size: 14pt; font-weight: bold) cite (font-family: Tahoma, Arial, sans-serif; font-size: 8pt) document (font-size: 10pt: font-weight: bold background-color: lightgrey; width: 10081 </ BGC Results of search for sEarchfOr·)8></I> </SPAN><HR> 现在是真正的ASP代码。我们创建 Recordset对象,并设置连接字符串。稍后,我们将解 释确切的连接字符串 m strsearch Set reSearch Server Createobject(" ADODB. Recordset) Create the connection string strconn =Provider=MSIDXS: Data Source=Web 接下来构造查询字符串,它是SQL语言的扩展集。在后面我们也会详细介绍 instruct the search string strSearch ."SELEcT DocTitle, Path, FileName, Characterization, Size& WHERE CONTAINs ('. Request Form('txtsearchFor)&.') 下一步打开 Recordset对象,遍历记录,并显示结果。 Open the recordset on the search reSearch. Open strSearch, strconn
相应的H T M L脚本相当简单: 以上代码提供一个文本框,可以在其中输入搜索条件。按下 Perform Search按钮将调用 A S P页面Q u e r y I n d e x S e r v e r. a s p。现在分析一下该A S P页面的代码。 首先,包含文件C o n n e c t i o n . a s p: 这包含了对A D O类型库的引用,这样就可以使用 A D O常数了。 接下来,定义一些C S S样式。这些不是必须的,但这样可以比较容易地格式化输出结果。 现在是真正的A S P代码。我们创建 R e c o r d s e t对象,并设置连接字符串。稍后,我们将解 释确切的连接字符串。 接下来构造查询字符串,它是 S Q L语言的扩展集。在后面我们也会详细介绍。 下一步打开R e c o r d s e t对象,遍历记录,并显示结果。 第1 2章 通用数据访问计计379 下载