下载第 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的构想示意图文档的形式存储,如金融系统、邮件系统等,而 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 高级编程 下载库中的一个表中,而另一个表可能包含第一个表所引用的所有文档。这两个表的概念在
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下载
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 高级编程 下载相应的 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下载在我的计算机里,查找,a d o”给出了如图 1 2 - 3所示的结果 (读者可能会得到与此不同的结果,这取决于被索引的目录,以及在那些目录中所包含的文档 )。
图 12-3 查找,a d o”的结果让我们来分析一下两段重要的代码:连接和查询。
3,用 A D O连接到 Indexing Service
与我们所见的其他 A D O连接字符串一样,用于 Indexing Service的连接字符串指定了 O L E
D B提供者的名称和数据的来源。
Data Source是要搜索的 Indexing Service目录的名称。可以在 Computer Management
C o n s o l e (在资源管理器中用鼠标右键单击 My Computer,选择 M a n a g e m e n t菜单项 )中找到目录名,如图 1 2 - 4所示。
4,用于 Indexing Service的搜索字符串搜索字符串类似于一个标准的 S Q L查询,但有特殊的关键字。这个概念与数据库中的搜索概念一致,首先选择需要看到的项目,然后指定数据从哪里来,接着加入一些条件来限制输出结果。
我们先快速看一下这个查询,然后再详细讲解它的语法。
380计计 ASP 3 高级编程 下载图 12-4 Computer Management Console窗口在 S E L E C T语句中出现的字段确定选取目录的哪些属性:
接下来是 F R O M子句,它表明数据来自哪里。在本例中 S C O P E没有任何参数,所以搜索的范围没有限制,因此会检查所有的目录条目 (在下面的,F R O M子句”小节对此做了详细的说明 ):
最后需要说明查找的内容,用 C O N TA I N S来查找包含特定字符串的文档:
5,字段名与属性如果你对 Indexing Service不熟悉,那么可能不知道哪些字段是可用的,实际上这个问题很容易解决,因为它们都列在 Indexing Service管理工具中,如图 1 2 - 5所示。
图 12-5 Indexing Service的管理工具可以使用友好名或属性名作为字段名。
注意,此项技术仅应用于 Indexing Service提供者,并不适用于其他 OLE DB提供者。
下面我们来看一下 Indexing Service SQL与标准 S Q L的区别。
6,SELECT子句
S E L E C T子句只用来从可用的属性名列表中选取字段名。
第 1 2章 通用数据访问 计计 381下载类别名称显示在
Indexing Services
下面可能你会倾向于使用 SELECT * 而不是分别指定单个列名。然而,如果在查询目录时这样做的话,OLE DB提供者就会提示出错。 *号选取仅对 Indexing Service目录的视图有效。
7,FROM子句
F r o m子句允许选择目录中的信息来源,这与一些标准 S Q L的 F R O M子句有一点区别。有三种不同的使用 F R O M子句的方法:
使用预定义视图。
使用定制视图。
使用一个范围。
(1) 预定义视图选择列的第一种方法是使用一个预定义视图名,这个视图只是一些字段的别名。例如:
表 1 2 - 1为预定义视图的列表。
表 12-1 预定义视图的列表预定义视图 字段 /属性
F I L E I N F O path,FileName,size,write,attrib
F I L E I N F O _ A B S T R A C T path,FileName,size,write,attrib,Characterization
E X T E N D E D _ F I L E I N F O path,FileName,size,write,attrib,DocTitle,DocAuthor,DocSub j e c t,
D o c K e y w o r d s,C h a r a c t e r i z a t i o n
W E B I N F O Vpath,path,FileName,size,write,attrib,Characterization,DocTi t l e
E X T E N D E D _ W E B I N F O Vpath,path,FileName,size,Characterization,write,D o c A t h o r,
DocSubject,DocKeywords,DocTi t l e
S S W E B I N F O URL,DocTitle,Rank,size,write
S S E X T E N D E D _ W E B I N F O URL,DocTitle,Rank,Hitcount,DocAuthor,Characterization,size,write
预定义视图确实是一个捷径,它允许从预定义的列集中选择所有的列。同样,也可以选择列名而不使用整个视图。
(2) 定制视图第二种方法是使用定制视图,它与预定义视图采用相同的格式:
在这里我们不打算讨论怎样创建定制视图,详细内容请参考 Indexing Service文档。
(3) 使用一个范围第三种方法是在搜索中包含搜索的范围。范围真正指出了要搜索的目录,以及搜索的目录深度。范围最简单的一种形式是空范围,即:
这表明搜索首先从根目录开始,它下面的所有目录都要被搜索。如果要限制搜索的目录,
那么可以加上相应的路径。
382计计 ASP 3 高级编程 下载这只返回选择的目录以及其下面的子目录中的条目。如果只需要搜索选择的目录而不搜索子目录,那么可以加入移动类型。
移动类型包括:
SHALLOW TRAVERSAL OF:表明只搜索指定的路径。
DEEP TRAVERSAL OF:表明搜索指定的路径及所有的子目录。
也可指定多个搜索范围:
如果没有指定搜索的深度,那么 DEEP TRAV E R S A L是缺省值。同时,可不受物理路径的限制,即,也可以使用虚拟路径。比如:
以上代码使用虚拟目录 P r o A S P作为搜索的根目录。
8,WHERE子句与标准的 W H E R E子句比较,这里的 W H E R E子句有一个配合搜索的谓词列表。
他们是:
A R R AY:使用逻辑操作符比较两个数组。这对那些基于数组的字段十分有用,比如一个文件的 a t t r i b u t e属性。
C O N TA I N S:允许匹配单词和短语。例如,下面这行代码能够匹配包括,A D O”或
,R D S”的文档:
下面的例子匹配,A D O”在,R D S”附近 5 0个单词内的文档:
下面的例子匹配含有,d r i n k”,,d r i n k i n g”,,d r u n k”等的文档:
FREETEXT:指定单词或短语的最佳匹配搜索,例如:
LIKE:使用通配符执行匹配,例如:
MAT C H E S:使用正规的表达式执行匹配,例如:
搜索 D o c A u t h o r的第一个字符为 a到 e之间的任一字符的所有条目。
NULL:允许匹配空值。例如:
所有这些选择方法使得搜索目录变得更为容易。
详细的信息请参考 Indexing Service文档。
12.2.2 活动目录对 Windows 2000来说,活动目录 (Active Directory,A D )的 OLE DB提供者并不是什么新第 1 2章 通用数据访问 计计 383下载东西,但只有在 Windows 2000中 A D才被完全实现。你可能对活动目录服务接口 ( A c t i v e
Directory services Interface,A D S I )这个术语更加熟悉。 A D S I是 A D的编程接口。
对 A D S I我们不加详述,因为在第 2 1章已经覆盖了这部分内容。在这里我们只想简单介绍一下 A D S I与 A D O是如何相互作用的。
A D是 Windows 2000的目录服务,它管理一个或多个机器的资源。这实际上意味着对于所有的资源信息只有一个源,并且 A D的 OLE DB提供者让你能够运用现有的知识来访问这个资源信息。
使用这个 OLE DB提供者相当简单,只要有一点 A D的知识。大多数例子显示了一种相当怪异的访问目录信息的语法,就像下面的例子一样:
上面这行代码列出了所有的本地用户,但很不直观。幸运的是,我们还可以使用 S Q L样式的语法:
这行代码输出的结果与上面的相同,但对那些不太了解目录查询语言的人来说更易于理解。
目录查询语言在 A D文档中有介绍。
1,路径需要用路径来唯一地确定一个 A D S I对象。路径的第一部分确定了目录服务提供者。例如:
LDAP:代表轻量目录访问协议 (Lightweight Directory Access Protocol)。
WINNT:代表 Windows NT。
NDS:代表 N e t Wa r e目录服务 ( N e t Ware Directory Services)。
NWCOMPAT:代表 N e t w a r e兼容路径的第二部分确定了名称空间,它因目录服务提供者的不同而不同。下面是一些完整的例子。
关于目录服务的特殊语法的详细内容请参考相应的文档。
2,使用针对 A D S的 OLE DB提供者
A D S的 OLE DB提供者由 Windows 2000自动完成安装,所以使用它时不需做什么其他工作。
尽管路径与查询字符串很复杂,但从目录中访问各项目却很容易。接下来我们来看一个允许用户选择一个目录中的用户、组或所有对象的例子。
首先创建 A c t i v e D i r e c t o r y,h t m l文件,它提供选择功能:
384计计 ASP 3 高级编程 下载现在创建产生结果的 A S P页面,即 A c t i v e D i r e c t o r y,a s p文件。首先创建 R e c o r d s e t对象和连接字符串:
现在我们可以建立查询。从本地机器上选择一般的名字和目录路径,但只选择那些与从选择窗体中挑选的目录相匹配的目录。
然后打开 R e c o r d s e t对象并显示结果。 R e c o r d s e t To Ta b l e函数在包含文件 R e c o r d s e t
To Ta b l e,a s p中,它把一个 ADO Recordset对象转换为一个 H T M L表格。
以上代码只是简单地打开了与 A D S提供者的一个连接,然后用选择的目录作为过滤器,
构建一个简单的查询。得到的结果如图 1 2 - 6所示。
图 12-6 查询结果第 1 2章 通用数据访问 计计 385下载图 1 2 - 7中显示了用户的一般名 (Common Name,c n ),以及目录中每个用户对应的唯一目录路径。如果看一下 Directory Service管理器,就能知道它们是怎样匹配的。
图 12-7 Directory Service管理器窗口
12.2.3 Exchange Server
许多人 (包括我在内 )一直都期望能用 A D O连接到 Exchange Server。但遗憾的是,在写本书的时候,还没有办法通过 OLE DB和 A D O来访问 Exchange Server。 M i c r o s o f t的 E x c h a n g e
Server 6(代码称为 P l a t i n u m )目前还在测试中,它将会有一个可用的 OLE DB提供者。虽然目前还没有对它的详细介绍,但它很有可能允许我们通过使用 A D O记录集来访问全部的 E x c h a n g e
存储 (包括邮箱、公用文件夹、新闻组等等 )。
用 A D O访问 E x c h a n g e目录的优点有以下两点:
已熟悉 A D O的程序员不必为访问 E x c h a n g e数据再学习另外的技术,例如 C D O。
使用 A D O对于某些情况会更方便,例如它可以快速访问数据存储。
确实有点遗憾,我们还不得不为此而等待。现在许多 We b站点已经提供了简单的邮件功能,但 E x c h a n g e提供者应该提供这种可能性,允许我们更容易地访问公用文件夹、联系信息等等。
12.2.4 定制的提供者如果有一些不能通过现有的 OLE DB提供者来访问的数据,那么有两种方法可以解决这个问题:
把数据转换成提供者支持的数据格式。
编写自己的 OLE DB提供者。
读者可能会认为第一种方案是最简单的解决方法,也许只要把数据转换成一种数据库格式就可以了。但如果数据来自于另一个实时应用程序,那么就必须频繁地进行这种转换,这也就意味着用户将看不到实时的数据。
第二种解决方案似乎有点不太好,但情况并非如此。如果数据相对简单,就能在很短的时间内编写出自己的提供者。例如,在查看 X M L数据时,只要 X M L文件符合 M i c r o s o f t的模式,
那么就能以一个记录集的形式打开 X M L文件。但如果 X M L数据带有元素格式怎么办?例如下面的代码:
386计计 ASP 3 高级编程 下载也许使用 X S L或一些 D O M代码,就可以很容易地把它们转换成模式版本的 X M L数据。但为什么不编写一个读这些数据的 OLE DB提供者呢?这比想象得要简单。
简易提供者这种类型的提供者被称为简易提供者 (Simple Provider),因为其数据只是一个简单的文本文件,并且它容易编写。实际编写一个这种类型的 X M L提供者要用去大约 1 0分钟的时间。这里不详细地介绍,但给出在 Visual Basic中怎样实现的简单指导。
要获得更多的细节请参考 OLE DB文档,可以从 M S D N得到最新的文档,其网址是 http,//msdn.microsoft.com。
用 V B创建一个 OLE DB简易提供者需要一个带有两个类和以下引用集的 ActiveX DLL工程:
Microsoft ADO 2.5库。
Microsoft数据源接口。
Microsoft OLE DB Simple Provider1.5库。
Microsoft OLE DB错误库。
在本例中,我们的提供者还需要 2,0版本的 Microsoft XML。
所需的第一个类是 X M L C o n n e c t i o n,需要把它的 Data Source Behavior属性设为
1 ( v b D a t a S o u r c e ),以告知 Visual Basic这是一个数据源,它是一个 OLE DB提供者的一个组成部分。
然后,用这个类的 G e t D a t a M e m b e r方法创建第二个类,X M L R e c o r d s e t,它读取 X M L文件数据。
这听起来很复杂,但实际上很简单。图 1 2 - 8显示了其工作方式。
图 12-8 创建一个 OLE DB简易提供者第 1 2章 通用数据访问 计计 387下载
XML提供者让我们来看一下怎样实现这两个类。
(1) XMLConnection类
X M L C o n n e c t i o n类提供了应用程序和实际获取数据的类之间的接口。主要任务是创建真正的数据提供者的实例:
(2) XMLRecordset类第二个类 X M L R e c o r d s e t是真正用来从文本文件中获取数据的类,它是提供者的真正内核。
编写自己的简易提供者意味着必须实现 OLE DB简易提供者的功能,因此应确保我们的类也能做到这一点。首先,声明几个全局变量:
读取 X M L数据的方法只是创建一个 XML DOM对象并装载数据文件。当然它也设置了几个对象的引用以备将来使用:
设置对象的引用也许看起来有些奇怪,但回想一下 X M L数据的结构及在前一章介绍的
D O M,也就没什么奇怪了。 D O M文档有一个根节点,在它的下面是 X M L,而且 X M L也有其自己的根节点 (在本例中为 A u t h o r s )。因此我们用 c h i l d N o d e s属性来索引树状结构的两层,并指向第一行。每一行都由列组成,所以我们再次用 c h i l d N o d e s属性索引下一层。
X M L R e c o r d s e t也实现了简易提供者的几个方法。有三个方法用于获取行数和列数:
388计计 ASP 3 高级编程 下载接下来是把数据返回给用户的方法:
当访问一个特定字段时这个函数将被自动调用,所以这里需要做的是从 XML DOM对象中返回适当的成员。
这就是简易提供者的全部内容。
当然除此之外,还要做一些其他事情,但这里不详细介绍了。全部代码,加上这个提供者和一个测试程序的现成版本都可以在 Wr o x的 We b站点上找到,其网址是
h t t p,/ / w w w,w r o x,c o m。
在使用一个定制的 OLE DB提供者之前必须注册。对于本例中的提供者,我们已经提供了一个,r e g文件来帮助完成注册工作。如果创建了自己的提供者,那么就需要自己创建,r e g文件
(或者手工编辑注册表 )。简易提供者的 OLE DB文档详细叙述了怎样创建注册表的条目。当然,
如果提供者是用 Visual Basic编写的,那么还需要将 Visual Basic运行期库安装在要使用定制的提供者的系统上。使用 Package and Deployment Wi z a r d可以创建所需要的安装文件。
12.3 半结构化的数据既然 U D A可以访问来自多个地方的数据,因此就需要能够访问那些非结构化的数据。例如,在一个记录集中,所有的行都包含相同数目的字段。即使在嵌套多层的记录集中,子记录集也呈现同样的特征。然而,现实中却确实存在着大量的非结构化形式的数据。
半结构化的数据介于结构化数据和二进制数据 (例如 B L O B类型的数据 )两者之间,也就是说它有一定的结构,但并不是每一行都有相同的结构。一个邮件系统就是一个很好的例子。
第 1 2章 通用数据访问 计计 389下载考虑图 1 2 - 9所示的结构。
这里存在着某种形式的结构。 Personal Folders包含其他的文件夹,因此可以把它看作是一个记录集。但是每一个子文件夹却存储着不同类型的信息,所以它们也就有不同的属性。如果我们想用记录集来表示它,实现起来的确很复杂。如果记录集中一行的字段与上一行不同怎么办?
解决的方法就是使用半结构化数据,因为它就是被特别设计用来处理这种情况的。可以创建一个包含所有通用属性的记录集,然后再创建一些其他对象来表示那些特殊的属性。
12.3.1 Record对象
R e c o r d对象用来处理半结构化数据的存储。当考虑这种类型的数据存储时,可以考虑一下带有节点和节点集合的树状结构,因为这很容易映射到 A D O对象上:
节点作为 R e c o r d建模。因此每个节点或文件夹就是一条记录。记录的属性是节点的那些独特的属性,这些属性构成了记录的字段。
节点集合作为 R e c o r d s e t建模。因此像文件夹集合这样的项目就成为记录集。尽管每个单独的文件夹也许不会和其他文件夹一样,但它们共享一系列通用的属性,比如名字、最近访问的时间等等。这些通用的属性就成为记录集的字段。
因此,在图 1 2 - 9所示的邮件系统中,Personal Folders是一条记录,因为它在树结构中是一个独特的节点。然而,它确实包含子节点,所以它有子代,那些子代构成了一个集合,所以可以把它们看作是一个记录集。在这个记录集中的每一行都可能会指向另一个节点,因此每一行可以是一条记录。这是需要的,因为 C o n t a c t s文件夹相对于 C a l e n d a r和 I n b o x文件夹而言有一套完全不同的属性。任何不是节点的项都被作为记录集的行来处理。
在邮箱的例子中,可能会有一个 1 0行的记录集,很有可能如表 1 2 - 2所示。
表 12-2 记录集内容
N a m e D e s c r i p t i o n Post Item As
C a l e n d a r Calendar Comment A p p o i n t m e n t
C o n t a c t s Contacts Comment C o n t a c t
Deleted Items Deleted Items folder P o s t
I n b o x Inbox folder P o s t
J o u r n a l Journal Comment Journal entry
N o t e s Notes Comment N o t e
O u t b o x Outbox folder P o s t
Sent Items Sent Items folder P o s t
Ta s k s Tasks Comment Ta s k
每一行都有一个相关联的记录,它代表这一行的独特属性。
12.3.2 Internet 发布半结构化数据的另一个新特性是 I n t e r n e t发布。 ADO 2.1版本通过装载 OLE DB提供者提供
I n t e r n e t发布,但其功能有限。现在已经出现了具有完全功能的 ADO 2.5版本,这令人相当兴奋。
390计计 ASP 3 高级编程 下载图 12-9 邮件系统示意图
I n t e r n e t发布允许通过 A D O来访问网络资源,这意味着可以建立定制的应用程序来管理
We b站点。这有什么优点呢?这就是如果你已懂得 A D O,那么就不需要再学习什么新东西了
(当然除了新的对象 ),因此可以运用已有的技巧。
为了搞得更明白一些,我们假设有如图 1 2 - 1 0所示的虚拟 We b目录。
图 12-10 虚拟 We b目录这只是一个普通的虚拟目录,没有为使用 Internet 发布提供者而建立什么特别的东西。
1,Record和 R e c o r d s e t对象许多人一直都分辨不清 R e c o r d对象和 R e c o r d s e t对象的区别。让我们来看一下图 1 2 - 11所示的示例 We b站点。
图 1 2 - 11 We b站点示意图第 1 2章 通用数据访问 计计 391下载记录 记录集 记录集 记录集在结构的顶端是 R e c o r d对象,表示树的一个节点。这个节点有子节点 (文件夹和文件 ),他们被建模为一个记录集,记录集的每一行要么是一个文件,要么是一个文件夹。如果它是一个文件夹,那么就表示树中还有另外一个节点,所以也就有一个记录。一开始就要理解这种概念有一点困难,但很容易记忆:
文件和文件夹的集合是一个记录集。
单独的文件或文件夹是一条记录。
(1) 打开一个 U R L
用 R e c o r d对象打开一个 U R L是非常容易的,只需要使用 R e c o r d对象的 O p e n方法就可以实现:
以上代码打开了位于 URL //localhost下的 P u b l i c文件夹。
需要注意是:这条语句的第一个参数确定了文件或文件夹,第二个参数则确定了连接字符串,即 U R L。对我们的操作而言,这实质上代表了范围或根。因此进一步的操作就可以在这个根目录下的任何地方执行了。让我们再来看一下下面这行代码:
这里第一个参数为空,我们想要打开的文件夹已被移到了连接字符串中。既然第一个参数为空,而打开了第二个参数中的文件夹,那么应该说它的效果和前面的例子是一样的。但是,随后的操作却受到了限制,此时所有的操作只能在 P u b l i c目录下进行。
所以,虽然这两种方法可以产生同样的初始结果,但它们对随后的操作有不同的影响。
O p e n方法还有其他几个参数,但这里就不详细叙述了。要获得更详细的说明,
可参阅 A D O文档。
(2) 一条记录的字段为了看得更清楚一些,我们介绍一个简单的例子。用一个 R e c o r d对象打开一个 U R L,然后查看记录的字段:
392计计 ASP 3 高级编程 下载以上代码给出图 1 2 - 1 2所示的结果。
图 12-12 目录记录的字段在这里,一个目录的属性映射到字段。那么,如果把以上代码中的 O p e n命令行改成下面的语句会发生什么情况呢?
它打开的是一个文件而不是一个目录。结果如图 1 2 - 1 3所示。
图 12-13 文件记录的字段显示的是相同的字段集,但它们的内容却不同。
表 1 2 - 3列出了一条记录的字段集。数据类型的描述参见附录 F,它们是数据类型常量,可在 D a t a Ty p e E n u m下找到。
表 12-3 记录的字段列表字 段 类 型 说 明
R E S O U R C E _ PA R S E N A M E a d Va r W C h a r 资源的 U R L
R E S O U R C E _ PA R E N T N A M E a d Va r W C h a r 父资源的 U R L
R E S O U R C E _ A B S O L U T E PA R S E N A M E a d Va r W C h a r 绝对 U R L地址,包含路径
R E S O U R C E _ I S H I D D E N a d B o o l e a n 指出资源是否隐藏
R E S O U R C E _ I S R E A D O N LY a d B o o l e a n 指出资源是否只读
R E S O U R C E _ C O N T E N T T Y P E a d Va r W C h a r 资源的 M I M E类型
R E S O U R C E _ C O N T E N T C L A S S a d Va r W C h a r 可能的资源用途
R E S O U R C E _ C O N T E N T L A N G U A G E a d Va r W C h a r 资源语言
R E S O U R C E _ C R E AT I O N T I M E a d F i l e Ti m e 创建资源的时间
R E S O U R C E _ L A S TA C C E S S T I M E a d F i l e Ti m e 资源最近被访问的时间
R E S O U R C E _ L A S T W R I T E T I M E a d F i l e Ti m e 资源更新的时间
R E S O U R C E _ S T R E A M S I Z E a d U n s i g n e d B i g I n t 缺省的流的大小第 1 2章 通用数据访问 计计 393下载
(续 )
字 段 类 型 说 明
R E S O U R C E _ I S C O L L E C T I O N a d B o o l e a n 指出资源是否是一个集合,即有没有子代
R E S O U R C E _ I S S T R U C T U R E D D O C U M N E T a d B o o l e a n 指出资源是否为一结构化文档,比如一个 Wo r d文档
R E S O U R C E _ D O C U M E N T a d Va r W C h a r 文件夹缺省文档的 U R L
R E S O U R C E _ D I S P L AY N A M E a d Va r W C h a r 资源的显示名称
R E S O U R C E _ I S R O O T a d B o o l e a n 指出资源是否为一个集合的根
R E S O U R C E _ I S M A R K E D F O R O F F L I N E a d B o o l e a n 指出资源是否被标记为离线使用应该注意 R E S O U R C E _ C O N T E N T T Y P E和 R E S O U R C E _ C O N T E N T C L A S S的值可能相反。在本书编写时仍是这种情况,也许会在后面的版本中得到纠正。
(3) DAV字段还有一些以 D AV开始的字段,它们用于 D AV中 (Distributed Authoring and Ve r s i o n i n g ),它们以表 1 2 - 4所示的方式映射到现有的字段上。
表 12-4 现有的字段与 D AV字段的映射关系现有的字段 D AV字段
R E S O U R C E _ PA R S E N A M E D AV,lastpathsegment
R E S O U R C E _ PA R E N T N A M E D AV,parentname
R E S O U R C E _ A B S O L U T E PA R S E N A M E D AV,href
R E S O U R C E _ I S H I D D E N D AV,ishidden
R E S O U R C E _ I S R E A D O N LY D AV,isreadonly
R E S O U R C E _ C O N T E N T T Y P E D AV,getcontenttype
R E S O U R C E _ C O N T E N T C L A S S D AV,getcontentclass
R E S O U R C E _ C O N T E N T L A N G U A G E D AV,getcontentlanguage
R E S O U R C E _ C R E AT I O N T I M E D AV,creationtime
R E S O U R C E _ L A S TA C C E S S T I M E D AV,lastaccessed
R E S O U R C E _ L A S T W R I T E T I M E D AV,getlastmodified
R E S O U R C E _ S T R E A M S I Z E D AV,getcontentlength
R E S O U R C E _ I S C O L L E C T I O N D AV,iscollection
R E S O U R C E _ I S S T R U C T U R E D D O C U M N E T D AV,isstructureddocument
D E FA U LT _ D O C U M E N T D AV,defaultdocument
R E S O U R C E _ D I S P L AY N A M E D AV,displayname
R E S O U R C E _ I S R O O T D AV,isroot
R E S O U R C E _ I S M A R K E D F O R O F F L I N E D AV,getetag
有两套属性的原因是因为 I n t e r n e t发布建立在名为 We b D AV的协议上,并且 IIS 5.0是一个
We b D AV服务器。因此可以用任何 We b D AV客户访问 IIS 5.0,所以它必须支持一套正规的 D AV
属性。
我们将在本章后面详细讨论基于 D AV的 We b。
(4) 遍历目录如果想遍历目录,需要获得一份 We b站点上的所有文件和文件夹的列表。例如,你可能正在建立一个允许自己管理自己的网站的基于前端的 We b。对大多数站点而言,可能仅有一
394计计 ASP 3 高级编程 下载个或两个目录 (例如广告、电子商务等等 ),但是现在可以把一个 We b站点作为一个文档库来使用。在这种情况下,它们就可能有一个相当深的树状结构以映射到文档的组织。我们的示例站点就像这样。
因为这个网站有好几个层次,所以可以使用一个递归过程来定位每个文件和文件夹。
下面我们来看一些具体实现它的代码:
第 1 2章 通用数据访问 计计 395下载上面的代码得到如图 1 2 - 1 4所示的输出。
下面来详细分析以上代码。该代码首先创建了一个
R e c o r d对象,它是树结构的根:
现在打开这个 R e c o r d对象。我们使用 L o c a l h o s t作为连接,
连接的是 L o c a l h o s t上的文件夹 P u b l i c:
然后,调用一个程序来遍历这个树结构:
我们使用了一个独立的过程来遍历这个树结构,这是因为树结构在本质上是递归的 (即,
文件夹可以包含其他的文件夹 )。因此,这个遍历函数接受一个记录作为它的起始点:
接下来,声明两个变量来存放这个记录的子代。记录集将为每个子代存放一行,记录将容纳一个文件夹:
现在就可以显示记录的名称了。别忘了记录的属性是怎样被映射到 F i e l d s集合的,
R E S O U R C E _ PA R S E N A M E是条目的名字。
接下来需要检查该节点是否有子节点 (文件夹或文件 ),因此调用记录的 G e t C h i l d r e n方法,
返回一个包含所有子节点的记录集:
增加缩进的层次,这纯粹是为了输出的格式化:
396计计 ASP 3 高级编程 下载图 12-14 示例的输出结果现在就可以遍历任何子节点了:
接下来需要检查该子节点是否还包含其他节点,也就是说,它自身是否为文件夹。为此,
检测 R E S O U R C E _ I S C O L L E C T I O N字段,因为一个包含其他节点的节点是一个集合:
如果该节点是一个集合,那么使用当前记录指针作为数据源创建一个新的 R e c o r d对象,
并打开它。这样就有了一个新节点,因此又可以把该新节点作为当前的根节点,并再次调用
Tr a v e r s e Tr e e例程。这是一种递归过程,因为对每一个节点 (文件夹 )都做一次遍历:
如果记录不是一个集合,则只需显示它的名字:
接下来就可移向这个记录集的下一条记录:
然后递减树的层次,并关闭这个记录集:
F o r m a t I t e m s函数仅是在得到的字符串的起始处加入一些非空空格,然后把编码空格 ( % 2 0 )
转化为空格字符。这只是使条目更加易读:
第 1 2章 通用数据访问 计计 397下载这就是全部过程。如果记住了以下这些要点,理解起来就会变得相当容易:
一个记录可能包含子记录,因此可用 G e t C h i l d r e n方法来返回一个包含那些子记录的记录集。
记录集中的一行可能是一个集合项,所以它也可能是一个记录的源。
以上内容似乎有些繁琐,但只要能理解它,总体上看还是比较简单的。
2,管理资源记录不仅可以用来访问 We b资源,而且可以用来管理这些资源,使用的方法如下:
CopyRecord:从一个位置复制一条记录或一个 U R L到另一个位置。
MoveRecord:从一个位置移动一条记录或一个 U R L到另一个位置。
DeleteRecord:删除一条记录或一个 U R L。
你会发现,仅用这三个方法就可以轻松地建立一个简单的远程管理 We b站点的系统。下面的程序显示了它们是怎样工作的:
尽管上面的例子只用了一个源和一个目标参数来调用 C o p y R e c o r d方法,但它也可以使用表 1 2 - 5所示的几个参数。
表 12-5 CopyRecord方法的参数参 数 说 明
S o u r c e 源文件的 U R L。如果不提供,或者为空字符串,那么 R e c o r d对象被作为源
D e s t i n a t i o n 目标文件的 U R L
U s e r N a m e 用于连接到目标资源的用户名
P a s s w o r d 用于连接到目标资源的口令
O p t i o n s 下面的值之一:
a d C o p y O v e r Wr i t e,覆盖现有的文件或目录
a d C o p y N o n e R e c u r s i v e,只拷贝一个目录,不包括子目录。
a d C o p y A l l o w D a t a L o s s,允许提供者为远程操作使用下载 /上载类型的拷贝
A s y n c Tr u e表明是异步操作,F a l s e则表明是同步操作由于提供了用户名和密码,你可以连接到安全的远程的 We b站点。
在使用 a d C o p y O v e r Wr i t e选项时,必须非常小心,因为该操作不同于一般的文件拷贝,它将覆盖目标。如果拷贝一个,并指定了一个目录作为目标,那么这个目录将会被该文件覆盖。
M o v e R e c o r d方法的使用情况类似:
398计计 ASP 3 高级编程 下载它的参数除了 O p t i o n s参数以外,与 C o p y R e c o r d方法的参数是相同的。它的 O p t i o n s参数可以是以下值:
adMoveOverWr i t e,覆盖已有的文件或目录。
a d M o v e D o n t U p d a t e L i n k s,确保文件上的超级文本链接不被更新。缺省的状态是只要提供者具有此功能则更新链接。
a d M o v e A l l o w E m u l a t i o n,如果 M o v e R e c o r d方法失败,使用下载 /上传和删除模拟这次移动。
资源的安全性对于那些看上去存在着很大安全漏洞的地方,不要感到惊慌。要认识到以下两点:
I n t e r n e t发布是 IIS 5.0的一个组成部分。 IIS 4的网上发布功能是非常有限的,它由
FrontPage Server Extensions 来提供。 IIS 5.0仍然支持这些功能,但同时也支持新的 D AV
扩展。
通过 OLE DB提供者访问的用于 I n t e r n e t发布的资源是标准的 We b资源,控制 We b资源访问的方式与其他 We b资源是相同的。
如果确定了自己的站点没有写或删除的权限,那么其他人就不会把你的文件搞得一团糟。
如果确实需要这些操作,那么可以授权给特定的用户,M o v e R e c o r d等方法需要得到访问权限,
这些都可作为方法调用的一部分来提供。
因此,网站仍然是安全的。如果它还不具有安全性,那么现在我们应该使之具有安全性。
3,Stream对象迄今为止,关于 We b资源我们一直没有提及怎样使用 S t r e a m对象。在 X M L的章节中,读者已经看到了 S t r e a m对象的一些使用情况,但也可从 We b资源获取这些数据。我们可以使用一个 A标记,并放进文件的 U R L,这样一旦 U R L被单击,
该文件就会被加载。
但是,如果要控制 We b上的资源,而不是直接将其加载到浏览器中,那又该怎么办呢?也许你想把它显示在页面内,看上去也许可能像图 1 2 - 1 5
所示。
同样,这也很容易做到。与以前一样,我们先包含连接的细节,然后建立一个文本域以供显示文件的内容:
下面是读取文件的 A S P代码。首先创建一个 S t r e a m对象:
第 1 2章 通用数据访问 计计 399下载图 12-15 访问 Stream 对象示意窗口然后打开这个 S t r e a m对象,同时指定一个文件作为 S t r e a m对象的源文件:
S t r e a m对象的 O p e n方法中的参数指定了要打开的文件的 U R L、文件的访问方式以及从哪里打开 S t r e a m对象。如果 S t r e a m的源 (第一个参数 )是一个 R e c o r d对象,那么后一个参数就可以是 a d O p e n S t r e a m F r o m R e c o r d。
一旦打开了 S t r e a m对象,就可以用 R e a d Te x t方法读取其内容,并简单地把它们显示出来:
最后,清理变量并关闭文本域:
必须承认这并不是一个特别令人激动的例子,也可以通过别的方法来实现它。但是,考虑一下围绕着文本域增加一个 F O R M对象,以及增加一对命令按钮,如图 1 2 - 1 6所示。
现在就可以更新这个文件了,这确实很令人兴奋。这个 Update Source按钮只是调用了一个 A S P文件 (StreamUpdate,asp),其代码也非常简单:
创建了 S t r e a m对象后,打开文件 (此时使用读 /写权限 ),
接下来,把 S t r e a m对象的当前位置移到 S t r e a m对象的开始,接着设置 S t r e a m对象的结尾为当前位置。这样能截短 S t r e a m对象,清除已存在的内容:
然后以调用 A S P页面的形式从文本域中取得文本,同时使用 Wr i t e Te x t方法向 S t r e a m对象中写入内容:
下面告诉用户发生了什么事:
最后关闭这个 S t r e a m对象:
400计计 ASP 3 高级编程 下载图 12-16 带有命令按钮的访问 S t r e a m
对象示意窗口这样仅用这几行代码就创建了两个可以读取和更新文本文件内容的 A S P页面。虽然这些例子使用的是固定的文件名,但建立一种允许用户选择文件名的窗体也是很容易的。
4,Record和 S t r e a m对象小结我们在前面几节看到的例子表明了管理 We b服务器上的资源是很容易的。但这也只是冰山的一角,因为它扩展的可能性是很大的。举个例子,作为测试,作者只用 A D O写了一个 Vi s u a l
B a s i c程序,它执行起来如同普通的 F T P客户一样。为什么这么做?主要有如下两条原因:
要了解能从仅有的几个 A D O方法中能获得哪些功能。
要证实 I n t e r n e t发布提供者的 A D O功能。它建立在 D AV上,即 H T T P。这意味着可使用 A D O
编写远程管理程序而不必担心打开防火墙。因为它使用 H T T P,它可以轻松地穿过防火墙。
当然,这也意味着必须确保你的 Web站点是安全的,至少也要降低其潜在的安全风险。
这种技术的真正的核心仅由几个方法处理。可以使用 R e c o r d对象的 C o p y R e c o r d和
M o v e R e c o r d方法来移动文件,同时 S t r e a m对象提供了访问文件内容的方法。这样就可以轻松地写出简单的远程管理工具了
12.3.3 We b D AV
在前述章节中我们已经数次提到了 D AV和 We b D AV,但一直没有真正解释过它到底是什么。基于分布式设计和版本 (Distributed Authoring and Ve r s i o n s,D AV )的 We b是 I n t e r n e t发布提供者涉及的全部内容。 We b D AV是专门为分布式创作 We b文档而设计的。
目前我们用 F r o n t P a g e和 FrontPage Server Extensions编辑和管理远程 We b服务器上的文档,
但这是一个专用的解决方案。多年来,W 3 C和 I E T F的工作组已经整理出 We b D AV的具体规范,
现已成为大家认可的标准。
We b D AV是一种基于 HTTP 1.1扩展的协议规范,因此它与平台是无关的。目前 F r o n t P a g e
是一个很好的解决方案,但它也仅是 M i c r o s o f t的解决方案。随着 IIS 5.0的出现,M i c r o s o f t已完全支持 We b D AV,并成为该工作组中的主体部分。
那么,We b D AV究竟能为我们做什么呢?如果我们告诉你 I n t e r n e t发布提供者是建立在
D AV之上的,那么你就会发现它的方便之处。你能远程管理文件,允许编辑、拷贝等等。
现在已有好几种包含 We b D AV功能的 We b服务器,并且各种客户也是层出不穷。这意味着用户可以在不损失功能的前提下,使用自己最为熟悉的工具。
1,We b D AV的未来
We b D AV仍旧是一个发展中的产品,并且目前版本仍在继续更新。这将带来真正意义上的合作开发,允许多次编辑且使用版本来控制资源。最终它可能替代现有的版本控制系统。
正在进行的其他方面的工作也影响了 We b D AV的发展,更多的细节问题请查看 We b站点:
w w w,w 3 c,o rg。虽然 M i c r o s o f t没有正式声明,但好像一旦 We b D AV的版本被认可,他们将在未来的某个时候更新 I I S。
12.4 企业数据在当今的企业中,选择 M i c r o s o f t并不是唯一的策略。除非这家企业决定只使用 M i c r o s o f t
第 1 2章 通用数据访问 计计 401下载工具和产品来实现标准化应用,否则你会看到一个应用程序必须与其他系统交互。许多这样的系统甚至不能在一个通用协议上相互通信。
数据是一个企业最有价值的资产,绝大部分数据被存储在大型数据库中,比如 O r a c l e和
I B M的 D B 2,以及非关系数据库中,或者是直接作为一组数据文件存储在文件系统中。小型计算机系统也大量使用于企业,大量的数据一般基于 D i g i t a l (现为 C o m p a q )的 VA X / V M S或
U N I X系统,并且主要是围绕着四大关系数据库管理系统 ( R D B M S )之一来建立的,它们是 I B M、
I n f o r m i x,O r a c l e和 S y b a s e。
12.4.1 Access和 SQL Server二者取一当 M i c r o s o f t决定进军数据库市场时,它把 SQL Server定位于服务于少数用户,即工作组,
主要是为了满足小规模到中等规模的数据存储需要。 M i c r o s o f t把 SQL Server作为一种必备的工具来帮助推销操作系统 O S / 2。因此 M i c r o s o f t的工程师同 S y b a s e的工程师合作将 S y b a s e的
U N I X数据库产品移到了 M i c r o s o f t的 O S / 2版本上。
当 M i c r o s o f t最终将 SQL Server定位于 Windows NT,并且在 SQL Sever 4.2版本之后从
S y b a s e手中接管其发展方向时,SQL Server仍然是一个工作组级的数据库产品。从我的观点看,其原因与其说是因为产品性能,还不如说是因为市场策略的缘故。无论什么原因,自始至终 SQL Server一直被认为是一种工作组级的数据库,只有在现在才开始被认为是一种企业级的数据库产品。而今,多处理器支持和较好的可扩展性已使 M i c r o s o f t的 SQL Server 7.0挤入了企业级数据库市场。
M i c r o s o f t进入桌面数据库市场稍晚了一些,但他们同样也使桌面市场的竞争者黯然失色。
虽然这个领域将涉及 A c c e s s和 SQL Server的取舍问题,但也不要完全抛弃 A c c e s s。我的意思是说对于 A S P数据访问应有可供选择的数据库,而不是在 Wi n d o w s环境下选择最好的前端数据库工具。我在 I n f o r m i x软件公司工作,这是一家主要的数据库供应商,但是我仍然选择 M i c r o s o f t
的 A c c e s s作为客户端工具。
今天的企业一般是围绕着 I B M,O r a c l e,I n f o r m i x或 S y b a s e四家公司的大型数据库系统来建立数据存储。事实上它们都是关系数据库产品。一家企业的大多数数据资产其实并不完全位于关系数据库中,另外在较老的层次或 C O D A S Y L数据库或在文件系统中也存在着。当然,
大部分早期系统里的数据已经移到关系数据库管理系统 (Relational Database Management
S y s t e m s,R D B M S )中了,因此我们集中介绍主要的数据库供应商的产品。
1,Oracle
当 M i c r o s o f t公司宣布其 SQL Server 7.0时,不久 O r a c l e就宣布出 $1 000 000.00对 M i c r o s o f t
SQL Sever 7.0提出挑战。从那以后在这两大软件业巨头之间就开始了不停的竞争。 O r a c l e想挫败 M i c r o s o f t的 C O M / D C O M及其系列产品,他们选择了使用 J a v a和 C O R B A作为主要战略来实现其分布式和 We b结构。
然而,他们实际上却不得不相互妥协,O r a c l e的确支持 M i c r o s o f t的 D N A,C O M / D C O M、
OLE DB,A D O和 A S P。事实上,M i c r o s o f t自己也觉得与 O r a c l e的协同工作能力是如此重要以致于还为 O r a c l e提供了一个强大的 Oracle OLE DB提供者,它使 O r a c l e运行在与 SQL Server 7.0
相同的功能层上。 O r a c l e也为 O L E提供了具有 A c t i v e X功能的 O r a c l e对象 ( O O 4 O )。 O O 4 O可在任何程序或脚本语言中 (包括 A S P )使用。
402计计 ASP 3 高级编程 下载使用 M i c r o s o f t的 OLE DB提供者来连接 O r a c l e数据库是比较容易的,它的功能与使用 S Q L
Server 7.0处于相同的级别上。然而,实际上,大多数 O r a c l e工作间仍在使用老版本的 O r a c l e引擎,比如 7,x或更早的版本。这就提出了一个问题,也就是说需要使用一种支持特定的 O r a c l e
引擎的 OLE DB ODBC提供者和一个 O D B C驱动程序。 OLE DB ODBC提供者交付的功能要比本地的 Oracle OLE DB提供者少得多,这主要是受所用的特定 O D B C驱动程序的限制。
然而,O r a c l e提供了最为广泛的多平台支持,但每一种操作平台可能会对 O r a c l e提出不同的要求。 OLE DB ODBC网关是最容易的访问方法,但也可能出现种种不希望有的限制。开发者必须仔细评估每一个折衷的办法。
2,IBM
I B M针对他们的 DB 2产品提供了五种不同的代码。 I B M基于不同的操作系统和平台,在公司内的不同地方开发了各种不同的 DB 2版本。有传言说 I B M正试图为其 DB 2关系数据库提供一种通用代码。但有一点可以确定,一致的功能会贯穿 DB 2产品线,这样就能为所有 DB 2
产品带来功能上的统一。
I B M的战略重点放在开发 J a v a,以及在他们的数据库产品中集成 X M L。通过与其他已经将这些技术转移到 I B M平台的供应商的合作,他们对 C O M,OLE DB 和 A S P提供了支持。有时这些解决方案是以很高的代价换来的,而且并不是所有提供的东西都能跨越全部 I B M平台。
在后面,我们将看到 C h i l i ! S o f t的 A S P技术,它已被移植到 I B M的 O S / 3 9 0和
A S / 4 0 0操作系统以及其他平台上。
据估计世界 5 0 0家最富有的公司中就有 4 7 0家使用 I B M的大型机环境之一来存储企业数据。
由 M i c r o s o f t的 SNA Server提供的 SNA OLE DB提供者提供了一个从外部进入 DB 2环境的网关。
把 IBM DB 2与 A S P应用程序结合起来的关键在于对 I B M的 S Q L / C L I标准的有力支持。
O D B C是最通用的 S Q L / C L I实现。这也常常引起用户的误解,因为通常用户并没把 S Q L / C L I的 A P I与 O D B C联系起来。 I B M最终放弃了 C L I这个称呼,而用 O D B C
代替。
自从 M i c r o s o f t似乎在 O D B C领域的开发已到了尽头,I B M就一直就扛着 O D B C的大旗。
3,Informix
I n f o r m i x的战略是成为一个“标准公司” 。他们支持所有主要的对象技术,C O M / D C O M、
C O R B A和 J a v a,同时他们也致力于将 X M L集成进其产品线的各个领域。 I n f o r m i x是唯一一家采用所有标准的公司。
I n f o r m i x甚至有自己的 Visual Basic工具,Visual Basic Data Director。它能帮助开发人员开发一个成功的 A S P策略。 I n f o r m i x也支持本地的 OLE DB提供者。
I n f o r m i x的 We b站点,w w w,i n f o r m i x,c o m,有好几个涉及使用 A D O来访问他的产品的 I n t e r n e t白页。
随着 I n f o r m i x收购了 I l l u s t r a,I n f o r m i x已将对象相关技术集成到 9,x版本的服务器产品中。
I l l u s t r a是 UC Berkeley 对象相关成果的商业化产品,增加了丰富的在其他相关产品中没有的功能。
I n f o r m i x也实现了最新的 S Q L - 9 9标准中某些先进的特性,同时由于收购了在数据存储系统中处于领导地位的 Red Brick公司,I n f o r m i x也相应加强了对数据存储的支持。
第 1 2章 通用数据访问 计计 403下载
C l o u d s c a p e是一家百分之百的 Java SQL数据库公司,已被 I n f o r m i x收购。他主要是通过提供桌面的和易于嵌入的数据库产品来推出其数据库系列产品。 I n f o r m i x的 C l o u d s c a p e数据库将会提供许多 M i c r o s o f t的 A c c e s s所拥有的优点。 C l o u d s c a p e将被集成到 I n f o r m i x的系列产品中,
也将支持其他 I n f o r m i x产品 ( C O R R B A,C O M和 J a v a )所支持的全部接口。也有可能包括 A S P脚本程序。
I n f o r m i x为 A S P开发提供了一个较好的平台,同时 I n f o r m i x,数据库产品又是一种工业强度系列的数据库,这是实现某些工业大容量数据库的基础。 I n f o r m i x的数据库分别提供了 U N I X
和 Windows NT环境下的两个版本。
4,Sybase
S y b a s e对 M i c r o s o f t早期开发 SQL Server是有帮助的,因此难怪 M i c r o s o f t的 SQL Server与
S y b a s e的产品很相似。然而,当 M i c r o s o f t与 S y b a s e最终决定分别以自己独立的方式开发产品时,他们的产品外观就显得不同了。
S y b a s e郑重承诺将把 J a v a集成到他们的产品中。 S y b a s e是 S Q L J标准制作的最初参与者之一。此外,S y b a s e的 P o w e r To o l s工具能直接生成 A S P代码,因此 S y b a s e的 We b数据库集成是其公司内的一个重要成果。
使用 S y b a s e的工具可以直接支持 A S P开发,也可以通过他们的 O D B C和 OLE DB提供者来支持 A S P开发。 S y b a s e对 A S P的支持以及 P o w e r To o l s产品生成 A S P代码的能力,使我们看到
S y b a s e在未来将会把 A S P的成果捆绑到其产品中。
5,结论总之,对于 A S P应用程序开发而言,来自主要数据库供应商的集成信息不应该是一个问题。所有主要数据库供应商都支持 S Q L / C L I标准和 O D B C规范,同时也可通过第三方支持,直接或间接地提供 O D B C和 OLE DB 提供者。许多厂商也提供本地的 OLE DB提供者,它们具有与 Microsoft SQL Server 7.0的 OLE DB提供者同样丰富的特性。
12.4.2 SNA Server和传统数据访问正如前面提及的那样,许多企业数据集中存储在公司的大型机数据中心上,在大型机技术市场上 I B M占据了主导地位。据估计目前全世界企业 8 0 %的关键数据都存放在 I B M大型机和
A S / 4 0 0系统中。
因此,在任何新应用程序中进行信息集成的策略是非常重要的,这些新应用程序需要开发企业的数据资源并将其完美地集成到 I B M的大型机技术中,比如 S N A ( I B M的网络体系结构 )。
M i c r o s o f t较早地认识到了这些问题,提供了一种系统网络体系结构 ( S N A ) S e r v e r。信息系统专家依靠 I B M的 S N A网络将终端连接到大型机,但现在他们必须把这些信息集成到基于 We b的应用程序中。
同时,大多数企业也配置了自己独立的 P C网络,它们也都是关键的,比如像企业的电子邮件、文件创建、工作组数据库和论坛支持系统。当前,把两个或更多的系统紧密结合起来已成为一个很重要的问题,这样终端用户才能将存储在主机系统上的数据结合到他们的通信、
分析和汇报中。因此终端用户使用比较简单的数据集成也就不足为奇了,例如:
从一个终端的仿真会话中拷贝和粘贴。
从打印报表中再次输入数据。
404计计 ASP 3 高级编程 下载
从文本文件转储中导入数据,这种转储必须涉及 E B C D I C到 A S C I I文件的转换。
E B C D I C和 A S C I I都是字符编码的标准。 I B M的大型机使用 E B C D I C (扩展二进制编码的十进制转换码 )作为字符编码字符集。与此相反,P C和大部其他系统使用
A S C I I (美国标准信息转换码 )字符集。所以,主要的问题在于如何实现不同字符编码之间的转换。
I T专业人士已要求提供一种直接将 P C系统、主机数据与运行数据库的大型机集成起来的方法。这是多年来一直存在的一个问题,现在由于 I n t e r n e t,I n t r a n e t和 E x t r a n e t应用程序的兴起,这个问题又有了新的内容,这些应用程序需要利用这些关键数据。数据存储的在线分析处理或论坛支持 (Online Analytical Processing or discussion support,O L A P )问题也进一步强化了对数据集成的要求。
M i c r o s o f t提供了一种在 I B M大型机上开发企业数据的简便方法:通过使用 M i c r o s o f t的
SNA Server以及 A S 4 0 0和 O S / 3 9 0的 OLE DB本地驱动程序。这就允许用 A S P脚本来开发大型机的数据库。
12.5 企业中的 A S P
从现在到 2 0 0 3年之间,多数开发和使用的应用程序将主要基于 I n t r a n e t,E x t r a n e t和
I n t e r n e t技术。所以,选择一种将当前企业资产和资源集成到新的基于 We b的应用程序中的中间件技术是有意义的。将当前的数据资产迁移到新的操作平台是不实际的,并且在经济上可行性也不高。增加一个额外的能访问资源或对当前企业的技术投资起决定作用的层次将会更有意义。
但不是使用 A I X上的 P e r l,N T上的 F r o n t P a g e以及 IBM OS/390和 A S / 4 0 0上的某些其他东西,
可以完全只用 A S P:通过使用相同的跨平台开发工具来“粘合”所有操作平台。这确实大大节省和缩短了开发时间和工作量。现在只需编写一次应用程序,而不用考虑使用什么平台,
因为 A S P开发不仅仅用于 Windows NT和 I I S。 A S P开发所提供的规模比 N T解决方案的规模要大得多。
Chili!Soft ASP
C h i l i ! S o f t研制了 U N I X和其他平台上使用的 A S P,它也同样广泛支持各种 We b服务器。这使 A S P技术看上去不仅仅是一个 M i c r o s o f t的中心中间件策略。例如,I B M和 C h i l i ! S o f t已经将
A S P引擎移植到 A S / 4 0 0和 O S / 3 9 0操作系统上。这也意味着 A S P应用程序同样可以运行在占据企业数据存储 8 0 %份额的 I B M平台上。 A S P对 U N I X的支持也将扩充驻留在基于 R D B M S系统的
U N I X上的企业数据资产,例如 O r a c l e,I n f o r m i x,D B 2,S y b a s e及其他供应商的产品。
事实上,由于 C h i l i ! S o f t研制出 C h i l i ! B e a n s,他们已经比 M i c r o s o f t领先了一步,
C h i l i ! B e a n s技术允许 o ff-the-shelf Java类和 Java Beans成为 COM ASP组件。如果 C h i l i ! S o f t在长时间内是成功的,那么他们将能为我们改善 A S P应用程序开发的环境。他们的 We b站点的 U R L
是,w w w,c h i l i s o f t,c o m,。
1,Chili!Soft的目标是 I S P
C h i l i ! S o f t产品的市场目标是 I S P,以提供更强大的 We b托管功能。他们相信这将为他们的技术开辟一个强大的市场,因为 A S P已逐渐被大众所接受,同时大多数 I S P运行在 U N I X或第 1 2章 通用数据访问 计计 405下载
U N I X的变种上,比如 F r e e B S D或 L i n u x。然而,我认为企业对同样的系统集成有一定的需要,
因此企业中的用户会对 C h i l i ! S o f t的 A S P技术持有坚定的信心。
2,在非 M i c r o s o f t平台上使用 A S P
正如前面所说的那样,大多数企业是由许多不同的平台和数据存储组成的。要知道把所有的鸡蛋都放进同一个篮子显然也不是一件好事。 I T部门会选择不同的供应商分担不同的任务。这样可以在单个供应商的解决方案不能解决问题的情况下有所选择。一名有头脑的 I T管理者不会想成为单个供应商的永久顾客。
除了上述观点以外,大多数企业都支持 ANSI/ISO SQL数据库语言标准,T C P / I P网络协议标准等工业标准,因此单个供应商特有的方案并没有考虑到一个开放的标准。随着把 A S P解决方案移植到其他的平台,A S P有可能成为一个实际的标准。如果不把 A S P移植到其他平台或
We b服务器上,A S P永远只能算是一个一流的 M i c r o s o f t解决方案。
3,Chili!Soft ASP和分布式对象技术分布式应用程序技术已经出现一段时间了,它在操作系统、网络操作系统和数据库引擎的开发中已经使用了一些时间。但只有在现在分布式应用程序才进入企业开发者的“武器库”
中。我们需要理解它,并使用它来开发今天和未来的企业应用程序。
分布式技术的发展主要有三个方向,C O M / D C O M,J a v a和 C O R B A。我们将对每一个技术方向做探讨,以便进一步了解 C h i l i ! S o f t在各个技术方向的发展状况。
(1) Chili!Soft ASP和 C O M / D C O M
M i c r o s o f t的 C O M是 Windows NT和 U N I X上的 Chili!Soft ASP的本地对象模型。 C h i l i ! S o f t
ASP 3.0版现在支持 D C O M,同时也允许 C O M对象作为本地 C O M对象出现,甚至 C O M对象也可以分布在另一台或好几台机器上。这就要考虑分布与负载平衡问题。
C h i l i ! S o f t的 U N I X支持也将 D C O M模型扩展成支持 U N I X平台,因此可以将分布式环境拓宽到具有沉重负荷的机器上。这也表明 A S P组件并不一定要驻留在 A S P服务器上。它们可以驻留在另外的数据资产和数据收集设备附近。数据收集设备可能是医疗仪器或任何与之同等复杂的设备。这种对分布式策略的广泛支持为我们带来了很大的希望。
(2) Chili!Soft ASP和企业 J a v a B e a n s ( E J B )
S u n的新的 E J B规范被认为是一个功能强大的可替代 C O M / D C O M的技术。 E J B号称是一个功能强大,与平台无关的,并能提供创建基于组件的分布式应用程序的体系结构。
Chili!Soft ASP 3.0版本能够让开发者立即使用 EJB Server去处理事务性的 A S P组件。 E J B
S e r v e r提供了许多与 Microsoft MTS和 C O M +在 C O M领域中提供的相同的服务。 EJB Server提供了事务管理、生存期管理、对象转储、线程管理以及其他自动管理服务等服务。
这种组合为开发工业强度的、可扩展的、安全的和面向事务的 We b应用程序提供了一个卓越的环境。这是对目前仅在 Microsoft ASP环境下可获得的功能的扩展。
(3) Chili!Soft ASP和 C O R B A
通用对象请求代理体系结构 (Common Object Request Broker Architecture,C O R B A )是承诺通过使用对象来实现真正的分布式应用程序开发的最重要的技术之一,它是由对象管理组
( O M G )开发的。
O M G正努力想通过其较为普遍的标准规范 ( C O R B A / I I I P、对象服务,I n t e r n e t工具和域接口规范 ),把 C O R B A建立成为到处都有的中间件。随着 C h i l i ! B e a n s技术与 Java IDL的结合,
406计计 ASP 3 高级编程 下载
A S P开发人员现在可以使用 C O R B A作为分布式应用程序开发的选择手段之一。 C O R B A对象可以通过 C h i l i ! B e a n s和 Java 2.0来访问。
有了 C h i l i ! S o f t的 A S P方法,我们相信未来的 A S P还要有显著的扩展。服务于更多基于标准和规范的非 M i c r o s o f t平台的供应商,会使 A S P成为实际的分布式 We b应用程序开发脚本标准。
12.6 小结本章探讨了 A D O大多数人倾向于支持关系数据库。但数据正以不同的方式被广泛利用,
因此,在讨论有关数据的问题时,我们需要拓宽视野,这就是 U D A策略所涉及的主要内容。
本章主要讨论了以下几个问题:
如何从 A D O来访问众多不同的数据存储。
半结构化数据的定义,如何使用新的 A D O对象来访问它。
Internet发布的定义,如何访问远程资源。
简要地概述了非 M i c r o s o f t企业。
这一章所讲述的内容仅是某些更复杂的内容的开始。 We b D AV等开发将会对我们管理 We b
数据的方式产生重大的影响,同时也证明它是协作开发的一个主要的转折点。目前众多的网页编辑工具似乎都着眼于单个作者,当我们进入工作组进行开发或多人编辑时,会出现大量需要解决的问题。
随着在 We b上发布的数据量逐渐增加,研究一种便于编辑、查看和发布这些信息的方法是明智的 (或者说是势在必行 )。也就是说 We b D AV领域正变得越来越大。
同样,随着 C h i l i ! S o f t这样的公司扩展了对非 M i c r o s o f t平台的 A S P支持,A S P将迅速成为企业中所有形式的基于 We b应用程序开发的一个标准。
现在结束了对数据访问内容的讨论,从下一章起将介绍怎样在 A S P应用程序中使用功能强大的组件。
第 1 2章 通用数据访问 计计 407下载
尤其是关系数据库,而这就是 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的构想示意图文档的形式存储,如金融系统、邮件系统等,而 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 高级编程 下载库中的一个表中,而另一个表可能包含第一个表所引用的所有文档。这两个表的概念在
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下载
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 高级编程 下载相应的 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下载在我的计算机里,查找,a d o”给出了如图 1 2 - 3所示的结果 (读者可能会得到与此不同的结果,这取决于被索引的目录,以及在那些目录中所包含的文档 )。
图 12-3 查找,a d o”的结果让我们来分析一下两段重要的代码:连接和查询。
3,用 A D O连接到 Indexing Service
与我们所见的其他 A D O连接字符串一样,用于 Indexing Service的连接字符串指定了 O L E
D B提供者的名称和数据的来源。
Data Source是要搜索的 Indexing Service目录的名称。可以在 Computer Management
C o n s o l e (在资源管理器中用鼠标右键单击 My Computer,选择 M a n a g e m e n t菜单项 )中找到目录名,如图 1 2 - 4所示。
4,用于 Indexing Service的搜索字符串搜索字符串类似于一个标准的 S Q L查询,但有特殊的关键字。这个概念与数据库中的搜索概念一致,首先选择需要看到的项目,然后指定数据从哪里来,接着加入一些条件来限制输出结果。
我们先快速看一下这个查询,然后再详细讲解它的语法。
380计计 ASP 3 高级编程 下载图 12-4 Computer Management Console窗口在 S E L E C T语句中出现的字段确定选取目录的哪些属性:
接下来是 F R O M子句,它表明数据来自哪里。在本例中 S C O P E没有任何参数,所以搜索的范围没有限制,因此会检查所有的目录条目 (在下面的,F R O M子句”小节对此做了详细的说明 ):
最后需要说明查找的内容,用 C O N TA I N S来查找包含特定字符串的文档:
5,字段名与属性如果你对 Indexing Service不熟悉,那么可能不知道哪些字段是可用的,实际上这个问题很容易解决,因为它们都列在 Indexing Service管理工具中,如图 1 2 - 5所示。
图 12-5 Indexing Service的管理工具可以使用友好名或属性名作为字段名。
注意,此项技术仅应用于 Indexing Service提供者,并不适用于其他 OLE DB提供者。
下面我们来看一下 Indexing Service SQL与标准 S Q L的区别。
6,SELECT子句
S E L E C T子句只用来从可用的属性名列表中选取字段名。
第 1 2章 通用数据访问 计计 381下载类别名称显示在
Indexing Services
下面可能你会倾向于使用 SELECT * 而不是分别指定单个列名。然而,如果在查询目录时这样做的话,OLE DB提供者就会提示出错。 *号选取仅对 Indexing Service目录的视图有效。
7,FROM子句
F r o m子句允许选择目录中的信息来源,这与一些标准 S Q L的 F R O M子句有一点区别。有三种不同的使用 F R O M子句的方法:
使用预定义视图。
使用定制视图。
使用一个范围。
(1) 预定义视图选择列的第一种方法是使用一个预定义视图名,这个视图只是一些字段的别名。例如:
表 1 2 - 1为预定义视图的列表。
表 12-1 预定义视图的列表预定义视图 字段 /属性
F I L E I N F O path,FileName,size,write,attrib
F I L E I N F O _ A B S T R A C T path,FileName,size,write,attrib,Characterization
E X T E N D E D _ F I L E I N F O path,FileName,size,write,attrib,DocTitle,DocAuthor,DocSub j e c t,
D o c K e y w o r d s,C h a r a c t e r i z a t i o n
W E B I N F O Vpath,path,FileName,size,write,attrib,Characterization,DocTi t l e
E X T E N D E D _ W E B I N F O Vpath,path,FileName,size,Characterization,write,D o c A t h o r,
DocSubject,DocKeywords,DocTi t l e
S S W E B I N F O URL,DocTitle,Rank,size,write
S S E X T E N D E D _ W E B I N F O URL,DocTitle,Rank,Hitcount,DocAuthor,Characterization,size,write
预定义视图确实是一个捷径,它允许从预定义的列集中选择所有的列。同样,也可以选择列名而不使用整个视图。
(2) 定制视图第二种方法是使用定制视图,它与预定义视图采用相同的格式:
在这里我们不打算讨论怎样创建定制视图,详细内容请参考 Indexing Service文档。
(3) 使用一个范围第三种方法是在搜索中包含搜索的范围。范围真正指出了要搜索的目录,以及搜索的目录深度。范围最简单的一种形式是空范围,即:
这表明搜索首先从根目录开始,它下面的所有目录都要被搜索。如果要限制搜索的目录,
那么可以加上相应的路径。
382计计 ASP 3 高级编程 下载这只返回选择的目录以及其下面的子目录中的条目。如果只需要搜索选择的目录而不搜索子目录,那么可以加入移动类型。
移动类型包括:
SHALLOW TRAVERSAL OF:表明只搜索指定的路径。
DEEP TRAVERSAL OF:表明搜索指定的路径及所有的子目录。
也可指定多个搜索范围:
如果没有指定搜索的深度,那么 DEEP TRAV E R S A L是缺省值。同时,可不受物理路径的限制,即,也可以使用虚拟路径。比如:
以上代码使用虚拟目录 P r o A S P作为搜索的根目录。
8,WHERE子句与标准的 W H E R E子句比较,这里的 W H E R E子句有一个配合搜索的谓词列表。
他们是:
A R R AY:使用逻辑操作符比较两个数组。这对那些基于数组的字段十分有用,比如一个文件的 a t t r i b u t e属性。
C O N TA I N S:允许匹配单词和短语。例如,下面这行代码能够匹配包括,A D O”或
,R D S”的文档:
下面的例子匹配,A D O”在,R D S”附近 5 0个单词内的文档:
下面的例子匹配含有,d r i n k”,,d r i n k i n g”,,d r u n k”等的文档:
FREETEXT:指定单词或短语的最佳匹配搜索,例如:
LIKE:使用通配符执行匹配,例如:
MAT C H E S:使用正规的表达式执行匹配,例如:
搜索 D o c A u t h o r的第一个字符为 a到 e之间的任一字符的所有条目。
NULL:允许匹配空值。例如:
所有这些选择方法使得搜索目录变得更为容易。
详细的信息请参考 Indexing Service文档。
12.2.2 活动目录对 Windows 2000来说,活动目录 (Active Directory,A D )的 OLE DB提供者并不是什么新第 1 2章 通用数据访问 计计 383下载东西,但只有在 Windows 2000中 A D才被完全实现。你可能对活动目录服务接口 ( A c t i v e
Directory services Interface,A D S I )这个术语更加熟悉。 A D S I是 A D的编程接口。
对 A D S I我们不加详述,因为在第 2 1章已经覆盖了这部分内容。在这里我们只想简单介绍一下 A D S I与 A D O是如何相互作用的。
A D是 Windows 2000的目录服务,它管理一个或多个机器的资源。这实际上意味着对于所有的资源信息只有一个源,并且 A D的 OLE DB提供者让你能够运用现有的知识来访问这个资源信息。
使用这个 OLE DB提供者相当简单,只要有一点 A D的知识。大多数例子显示了一种相当怪异的访问目录信息的语法,就像下面的例子一样:
上面这行代码列出了所有的本地用户,但很不直观。幸运的是,我们还可以使用 S Q L样式的语法:
这行代码输出的结果与上面的相同,但对那些不太了解目录查询语言的人来说更易于理解。
目录查询语言在 A D文档中有介绍。
1,路径需要用路径来唯一地确定一个 A D S I对象。路径的第一部分确定了目录服务提供者。例如:
LDAP:代表轻量目录访问协议 (Lightweight Directory Access Protocol)。
WINNT:代表 Windows NT。
NDS:代表 N e t Wa r e目录服务 ( N e t Ware Directory Services)。
NWCOMPAT:代表 N e t w a r e兼容路径的第二部分确定了名称空间,它因目录服务提供者的不同而不同。下面是一些完整的例子。
关于目录服务的特殊语法的详细内容请参考相应的文档。
2,使用针对 A D S的 OLE DB提供者
A D S的 OLE DB提供者由 Windows 2000自动完成安装,所以使用它时不需做什么其他工作。
尽管路径与查询字符串很复杂,但从目录中访问各项目却很容易。接下来我们来看一个允许用户选择一个目录中的用户、组或所有对象的例子。
首先创建 A c t i v e D i r e c t o r y,h t m l文件,它提供选择功能:
384计计 ASP 3 高级编程 下载现在创建产生结果的 A S P页面,即 A c t i v e D i r e c t o r y,a s p文件。首先创建 R e c o r d s e t对象和连接字符串:
现在我们可以建立查询。从本地机器上选择一般的名字和目录路径,但只选择那些与从选择窗体中挑选的目录相匹配的目录。
然后打开 R e c o r d s e t对象并显示结果。 R e c o r d s e t To Ta b l e函数在包含文件 R e c o r d s e t
To Ta b l e,a s p中,它把一个 ADO Recordset对象转换为一个 H T M L表格。
以上代码只是简单地打开了与 A D S提供者的一个连接,然后用选择的目录作为过滤器,
构建一个简单的查询。得到的结果如图 1 2 - 6所示。
图 12-6 查询结果第 1 2章 通用数据访问 计计 385下载图 1 2 - 7中显示了用户的一般名 (Common Name,c n ),以及目录中每个用户对应的唯一目录路径。如果看一下 Directory Service管理器,就能知道它们是怎样匹配的。
图 12-7 Directory Service管理器窗口
12.2.3 Exchange Server
许多人 (包括我在内 )一直都期望能用 A D O连接到 Exchange Server。但遗憾的是,在写本书的时候,还没有办法通过 OLE DB和 A D O来访问 Exchange Server。 M i c r o s o f t的 E x c h a n g e
Server 6(代码称为 P l a t i n u m )目前还在测试中,它将会有一个可用的 OLE DB提供者。虽然目前还没有对它的详细介绍,但它很有可能允许我们通过使用 A D O记录集来访问全部的 E x c h a n g e
存储 (包括邮箱、公用文件夹、新闻组等等 )。
用 A D O访问 E x c h a n g e目录的优点有以下两点:
已熟悉 A D O的程序员不必为访问 E x c h a n g e数据再学习另外的技术,例如 C D O。
使用 A D O对于某些情况会更方便,例如它可以快速访问数据存储。
确实有点遗憾,我们还不得不为此而等待。现在许多 We b站点已经提供了简单的邮件功能,但 E x c h a n g e提供者应该提供这种可能性,允许我们更容易地访问公用文件夹、联系信息等等。
12.2.4 定制的提供者如果有一些不能通过现有的 OLE DB提供者来访问的数据,那么有两种方法可以解决这个问题:
把数据转换成提供者支持的数据格式。
编写自己的 OLE DB提供者。
读者可能会认为第一种方案是最简单的解决方法,也许只要把数据转换成一种数据库格式就可以了。但如果数据来自于另一个实时应用程序,那么就必须频繁地进行这种转换,这也就意味着用户将看不到实时的数据。
第二种解决方案似乎有点不太好,但情况并非如此。如果数据相对简单,就能在很短的时间内编写出自己的提供者。例如,在查看 X M L数据时,只要 X M L文件符合 M i c r o s o f t的模式,
那么就能以一个记录集的形式打开 X M L文件。但如果 X M L数据带有元素格式怎么办?例如下面的代码:
386计计 ASP 3 高级编程 下载也许使用 X S L或一些 D O M代码,就可以很容易地把它们转换成模式版本的 X M L数据。但为什么不编写一个读这些数据的 OLE DB提供者呢?这比想象得要简单。
简易提供者这种类型的提供者被称为简易提供者 (Simple Provider),因为其数据只是一个简单的文本文件,并且它容易编写。实际编写一个这种类型的 X M L提供者要用去大约 1 0分钟的时间。这里不详细地介绍,但给出在 Visual Basic中怎样实现的简单指导。
要获得更多的细节请参考 OLE DB文档,可以从 M S D N得到最新的文档,其网址是 http,//msdn.microsoft.com。
用 V B创建一个 OLE DB简易提供者需要一个带有两个类和以下引用集的 ActiveX DLL工程:
Microsoft ADO 2.5库。
Microsoft数据源接口。
Microsoft OLE DB Simple Provider1.5库。
Microsoft OLE DB错误库。
在本例中,我们的提供者还需要 2,0版本的 Microsoft XML。
所需的第一个类是 X M L C o n n e c t i o n,需要把它的 Data Source Behavior属性设为
1 ( v b D a t a S o u r c e ),以告知 Visual Basic这是一个数据源,它是一个 OLE DB提供者的一个组成部分。
然后,用这个类的 G e t D a t a M e m b e r方法创建第二个类,X M L R e c o r d s e t,它读取 X M L文件数据。
这听起来很复杂,但实际上很简单。图 1 2 - 8显示了其工作方式。
图 12-8 创建一个 OLE DB简易提供者第 1 2章 通用数据访问 计计 387下载
XML提供者让我们来看一下怎样实现这两个类。
(1) XMLConnection类
X M L C o n n e c t i o n类提供了应用程序和实际获取数据的类之间的接口。主要任务是创建真正的数据提供者的实例:
(2) XMLRecordset类第二个类 X M L R e c o r d s e t是真正用来从文本文件中获取数据的类,它是提供者的真正内核。
编写自己的简易提供者意味着必须实现 OLE DB简易提供者的功能,因此应确保我们的类也能做到这一点。首先,声明几个全局变量:
读取 X M L数据的方法只是创建一个 XML DOM对象并装载数据文件。当然它也设置了几个对象的引用以备将来使用:
设置对象的引用也许看起来有些奇怪,但回想一下 X M L数据的结构及在前一章介绍的
D O M,也就没什么奇怪了。 D O M文档有一个根节点,在它的下面是 X M L,而且 X M L也有其自己的根节点 (在本例中为 A u t h o r s )。因此我们用 c h i l d N o d e s属性来索引树状结构的两层,并指向第一行。每一行都由列组成,所以我们再次用 c h i l d N o d e s属性索引下一层。
X M L R e c o r d s e t也实现了简易提供者的几个方法。有三个方法用于获取行数和列数:
388计计 ASP 3 高级编程 下载接下来是把数据返回给用户的方法:
当访问一个特定字段时这个函数将被自动调用,所以这里需要做的是从 XML DOM对象中返回适当的成员。
这就是简易提供者的全部内容。
当然除此之外,还要做一些其他事情,但这里不详细介绍了。全部代码,加上这个提供者和一个测试程序的现成版本都可以在 Wr o x的 We b站点上找到,其网址是
h t t p,/ / w w w,w r o x,c o m。
在使用一个定制的 OLE DB提供者之前必须注册。对于本例中的提供者,我们已经提供了一个,r e g文件来帮助完成注册工作。如果创建了自己的提供者,那么就需要自己创建,r e g文件
(或者手工编辑注册表 )。简易提供者的 OLE DB文档详细叙述了怎样创建注册表的条目。当然,
如果提供者是用 Visual Basic编写的,那么还需要将 Visual Basic运行期库安装在要使用定制的提供者的系统上。使用 Package and Deployment Wi z a r d可以创建所需要的安装文件。
12.3 半结构化的数据既然 U D A可以访问来自多个地方的数据,因此就需要能够访问那些非结构化的数据。例如,在一个记录集中,所有的行都包含相同数目的字段。即使在嵌套多层的记录集中,子记录集也呈现同样的特征。然而,现实中却确实存在着大量的非结构化形式的数据。
半结构化的数据介于结构化数据和二进制数据 (例如 B L O B类型的数据 )两者之间,也就是说它有一定的结构,但并不是每一行都有相同的结构。一个邮件系统就是一个很好的例子。
第 1 2章 通用数据访问 计计 389下载考虑图 1 2 - 9所示的结构。
这里存在着某种形式的结构。 Personal Folders包含其他的文件夹,因此可以把它看作是一个记录集。但是每一个子文件夹却存储着不同类型的信息,所以它们也就有不同的属性。如果我们想用记录集来表示它,实现起来的确很复杂。如果记录集中一行的字段与上一行不同怎么办?
解决的方法就是使用半结构化数据,因为它就是被特别设计用来处理这种情况的。可以创建一个包含所有通用属性的记录集,然后再创建一些其他对象来表示那些特殊的属性。
12.3.1 Record对象
R e c o r d对象用来处理半结构化数据的存储。当考虑这种类型的数据存储时,可以考虑一下带有节点和节点集合的树状结构,因为这很容易映射到 A D O对象上:
节点作为 R e c o r d建模。因此每个节点或文件夹就是一条记录。记录的属性是节点的那些独特的属性,这些属性构成了记录的字段。
节点集合作为 R e c o r d s e t建模。因此像文件夹集合这样的项目就成为记录集。尽管每个单独的文件夹也许不会和其他文件夹一样,但它们共享一系列通用的属性,比如名字、最近访问的时间等等。这些通用的属性就成为记录集的字段。
因此,在图 1 2 - 9所示的邮件系统中,Personal Folders是一条记录,因为它在树结构中是一个独特的节点。然而,它确实包含子节点,所以它有子代,那些子代构成了一个集合,所以可以把它们看作是一个记录集。在这个记录集中的每一行都可能会指向另一个节点,因此每一行可以是一条记录。这是需要的,因为 C o n t a c t s文件夹相对于 C a l e n d a r和 I n b o x文件夹而言有一套完全不同的属性。任何不是节点的项都被作为记录集的行来处理。
在邮箱的例子中,可能会有一个 1 0行的记录集,很有可能如表 1 2 - 2所示。
表 12-2 记录集内容
N a m e D e s c r i p t i o n Post Item As
C a l e n d a r Calendar Comment A p p o i n t m e n t
C o n t a c t s Contacts Comment C o n t a c t
Deleted Items Deleted Items folder P o s t
I n b o x Inbox folder P o s t
J o u r n a l Journal Comment Journal entry
N o t e s Notes Comment N o t e
O u t b o x Outbox folder P o s t
Sent Items Sent Items folder P o s t
Ta s k s Tasks Comment Ta s k
每一行都有一个相关联的记录,它代表这一行的独特属性。
12.3.2 Internet 发布半结构化数据的另一个新特性是 I n t e r n e t发布。 ADO 2.1版本通过装载 OLE DB提供者提供
I n t e r n e t发布,但其功能有限。现在已经出现了具有完全功能的 ADO 2.5版本,这令人相当兴奋。
390计计 ASP 3 高级编程 下载图 12-9 邮件系统示意图
I n t e r n e t发布允许通过 A D O来访问网络资源,这意味着可以建立定制的应用程序来管理
We b站点。这有什么优点呢?这就是如果你已懂得 A D O,那么就不需要再学习什么新东西了
(当然除了新的对象 ),因此可以运用已有的技巧。
为了搞得更明白一些,我们假设有如图 1 2 - 1 0所示的虚拟 We b目录。
图 12-10 虚拟 We b目录这只是一个普通的虚拟目录,没有为使用 Internet 发布提供者而建立什么特别的东西。
1,Record和 R e c o r d s e t对象许多人一直都分辨不清 R e c o r d对象和 R e c o r d s e t对象的区别。让我们来看一下图 1 2 - 11所示的示例 We b站点。
图 1 2 - 11 We b站点示意图第 1 2章 通用数据访问 计计 391下载记录 记录集 记录集 记录集在结构的顶端是 R e c o r d对象,表示树的一个节点。这个节点有子节点 (文件夹和文件 ),他们被建模为一个记录集,记录集的每一行要么是一个文件,要么是一个文件夹。如果它是一个文件夹,那么就表示树中还有另外一个节点,所以也就有一个记录。一开始就要理解这种概念有一点困难,但很容易记忆:
文件和文件夹的集合是一个记录集。
单独的文件或文件夹是一条记录。
(1) 打开一个 U R L
用 R e c o r d对象打开一个 U R L是非常容易的,只需要使用 R e c o r d对象的 O p e n方法就可以实现:
以上代码打开了位于 URL //localhost下的 P u b l i c文件夹。
需要注意是:这条语句的第一个参数确定了文件或文件夹,第二个参数则确定了连接字符串,即 U R L。对我们的操作而言,这实质上代表了范围或根。因此进一步的操作就可以在这个根目录下的任何地方执行了。让我们再来看一下下面这行代码:
这里第一个参数为空,我们想要打开的文件夹已被移到了连接字符串中。既然第一个参数为空,而打开了第二个参数中的文件夹,那么应该说它的效果和前面的例子是一样的。但是,随后的操作却受到了限制,此时所有的操作只能在 P u b l i c目录下进行。
所以,虽然这两种方法可以产生同样的初始结果,但它们对随后的操作有不同的影响。
O p e n方法还有其他几个参数,但这里就不详细叙述了。要获得更详细的说明,
可参阅 A D O文档。
(2) 一条记录的字段为了看得更清楚一些,我们介绍一个简单的例子。用一个 R e c o r d对象打开一个 U R L,然后查看记录的字段:
392计计 ASP 3 高级编程 下载以上代码给出图 1 2 - 1 2所示的结果。
图 12-12 目录记录的字段在这里,一个目录的属性映射到字段。那么,如果把以上代码中的 O p e n命令行改成下面的语句会发生什么情况呢?
它打开的是一个文件而不是一个目录。结果如图 1 2 - 1 3所示。
图 12-13 文件记录的字段显示的是相同的字段集,但它们的内容却不同。
表 1 2 - 3列出了一条记录的字段集。数据类型的描述参见附录 F,它们是数据类型常量,可在 D a t a Ty p e E n u m下找到。
表 12-3 记录的字段列表字 段 类 型 说 明
R E S O U R C E _ PA R S E N A M E a d Va r W C h a r 资源的 U R L
R E S O U R C E _ PA R E N T N A M E a d Va r W C h a r 父资源的 U R L
R E S O U R C E _ A B S O L U T E PA R S E N A M E a d Va r W C h a r 绝对 U R L地址,包含路径
R E S O U R C E _ I S H I D D E N a d B o o l e a n 指出资源是否隐藏
R E S O U R C E _ I S R E A D O N LY a d B o o l e a n 指出资源是否只读
R E S O U R C E _ C O N T E N T T Y P E a d Va r W C h a r 资源的 M I M E类型
R E S O U R C E _ C O N T E N T C L A S S a d Va r W C h a r 可能的资源用途
R E S O U R C E _ C O N T E N T L A N G U A G E a d Va r W C h a r 资源语言
R E S O U R C E _ C R E AT I O N T I M E a d F i l e Ti m e 创建资源的时间
R E S O U R C E _ L A S TA C C E S S T I M E a d F i l e Ti m e 资源最近被访问的时间
R E S O U R C E _ L A S T W R I T E T I M E a d F i l e Ti m e 资源更新的时间
R E S O U R C E _ S T R E A M S I Z E a d U n s i g n e d B i g I n t 缺省的流的大小第 1 2章 通用数据访问 计计 393下载
(续 )
字 段 类 型 说 明
R E S O U R C E _ I S C O L L E C T I O N a d B o o l e a n 指出资源是否是一个集合,即有没有子代
R E S O U R C E _ I S S T R U C T U R E D D O C U M N E T a d B o o l e a n 指出资源是否为一结构化文档,比如一个 Wo r d文档
R E S O U R C E _ D O C U M E N T a d Va r W C h a r 文件夹缺省文档的 U R L
R E S O U R C E _ D I S P L AY N A M E a d Va r W C h a r 资源的显示名称
R E S O U R C E _ I S R O O T a d B o o l e a n 指出资源是否为一个集合的根
R E S O U R C E _ I S M A R K E D F O R O F F L I N E a d B o o l e a n 指出资源是否被标记为离线使用应该注意 R E S O U R C E _ C O N T E N T T Y P E和 R E S O U R C E _ C O N T E N T C L A S S的值可能相反。在本书编写时仍是这种情况,也许会在后面的版本中得到纠正。
(3) DAV字段还有一些以 D AV开始的字段,它们用于 D AV中 (Distributed Authoring and Ve r s i o n i n g ),它们以表 1 2 - 4所示的方式映射到现有的字段上。
表 12-4 现有的字段与 D AV字段的映射关系现有的字段 D AV字段
R E S O U R C E _ PA R S E N A M E D AV,lastpathsegment
R E S O U R C E _ PA R E N T N A M E D AV,parentname
R E S O U R C E _ A B S O L U T E PA R S E N A M E D AV,href
R E S O U R C E _ I S H I D D E N D AV,ishidden
R E S O U R C E _ I S R E A D O N LY D AV,isreadonly
R E S O U R C E _ C O N T E N T T Y P E D AV,getcontenttype
R E S O U R C E _ C O N T E N T C L A S S D AV,getcontentclass
R E S O U R C E _ C O N T E N T L A N G U A G E D AV,getcontentlanguage
R E S O U R C E _ C R E AT I O N T I M E D AV,creationtime
R E S O U R C E _ L A S TA C C E S S T I M E D AV,lastaccessed
R E S O U R C E _ L A S T W R I T E T I M E D AV,getlastmodified
R E S O U R C E _ S T R E A M S I Z E D AV,getcontentlength
R E S O U R C E _ I S C O L L E C T I O N D AV,iscollection
R E S O U R C E _ I S S T R U C T U R E D D O C U M N E T D AV,isstructureddocument
D E FA U LT _ D O C U M E N T D AV,defaultdocument
R E S O U R C E _ D I S P L AY N A M E D AV,displayname
R E S O U R C E _ I S R O O T D AV,isroot
R E S O U R C E _ I S M A R K E D F O R O F F L I N E D AV,getetag
有两套属性的原因是因为 I n t e r n e t发布建立在名为 We b D AV的协议上,并且 IIS 5.0是一个
We b D AV服务器。因此可以用任何 We b D AV客户访问 IIS 5.0,所以它必须支持一套正规的 D AV
属性。
我们将在本章后面详细讨论基于 D AV的 We b。
(4) 遍历目录如果想遍历目录,需要获得一份 We b站点上的所有文件和文件夹的列表。例如,你可能正在建立一个允许自己管理自己的网站的基于前端的 We b。对大多数站点而言,可能仅有一
394计计 ASP 3 高级编程 下载个或两个目录 (例如广告、电子商务等等 ),但是现在可以把一个 We b站点作为一个文档库来使用。在这种情况下,它们就可能有一个相当深的树状结构以映射到文档的组织。我们的示例站点就像这样。
因为这个网站有好几个层次,所以可以使用一个递归过程来定位每个文件和文件夹。
下面我们来看一些具体实现它的代码:
第 1 2章 通用数据访问 计计 395下载上面的代码得到如图 1 2 - 1 4所示的输出。
下面来详细分析以上代码。该代码首先创建了一个
R e c o r d对象,它是树结构的根:
现在打开这个 R e c o r d对象。我们使用 L o c a l h o s t作为连接,
连接的是 L o c a l h o s t上的文件夹 P u b l i c:
然后,调用一个程序来遍历这个树结构:
我们使用了一个独立的过程来遍历这个树结构,这是因为树结构在本质上是递归的 (即,
文件夹可以包含其他的文件夹 )。因此,这个遍历函数接受一个记录作为它的起始点:
接下来,声明两个变量来存放这个记录的子代。记录集将为每个子代存放一行,记录将容纳一个文件夹:
现在就可以显示记录的名称了。别忘了记录的属性是怎样被映射到 F i e l d s集合的,
R E S O U R C E _ PA R S E N A M E是条目的名字。
接下来需要检查该节点是否有子节点 (文件夹或文件 ),因此调用记录的 G e t C h i l d r e n方法,
返回一个包含所有子节点的记录集:
增加缩进的层次,这纯粹是为了输出的格式化:
396计计 ASP 3 高级编程 下载图 12-14 示例的输出结果现在就可以遍历任何子节点了:
接下来需要检查该子节点是否还包含其他节点,也就是说,它自身是否为文件夹。为此,
检测 R E S O U R C E _ I S C O L L E C T I O N字段,因为一个包含其他节点的节点是一个集合:
如果该节点是一个集合,那么使用当前记录指针作为数据源创建一个新的 R e c o r d对象,
并打开它。这样就有了一个新节点,因此又可以把该新节点作为当前的根节点,并再次调用
Tr a v e r s e Tr e e例程。这是一种递归过程,因为对每一个节点 (文件夹 )都做一次遍历:
如果记录不是一个集合,则只需显示它的名字:
接下来就可移向这个记录集的下一条记录:
然后递减树的层次,并关闭这个记录集:
F o r m a t I t e m s函数仅是在得到的字符串的起始处加入一些非空空格,然后把编码空格 ( % 2 0 )
转化为空格字符。这只是使条目更加易读:
第 1 2章 通用数据访问 计计 397下载这就是全部过程。如果记住了以下这些要点,理解起来就会变得相当容易:
一个记录可能包含子记录,因此可用 G e t C h i l d r e n方法来返回一个包含那些子记录的记录集。
记录集中的一行可能是一个集合项,所以它也可能是一个记录的源。
以上内容似乎有些繁琐,但只要能理解它,总体上看还是比较简单的。
2,管理资源记录不仅可以用来访问 We b资源,而且可以用来管理这些资源,使用的方法如下:
CopyRecord:从一个位置复制一条记录或一个 U R L到另一个位置。
MoveRecord:从一个位置移动一条记录或一个 U R L到另一个位置。
DeleteRecord:删除一条记录或一个 U R L。
你会发现,仅用这三个方法就可以轻松地建立一个简单的远程管理 We b站点的系统。下面的程序显示了它们是怎样工作的:
尽管上面的例子只用了一个源和一个目标参数来调用 C o p y R e c o r d方法,但它也可以使用表 1 2 - 5所示的几个参数。
表 12-5 CopyRecord方法的参数参 数 说 明
S o u r c e 源文件的 U R L。如果不提供,或者为空字符串,那么 R e c o r d对象被作为源
D e s t i n a t i o n 目标文件的 U R L
U s e r N a m e 用于连接到目标资源的用户名
P a s s w o r d 用于连接到目标资源的口令
O p t i o n s 下面的值之一:
a d C o p y O v e r Wr i t e,覆盖现有的文件或目录
a d C o p y N o n e R e c u r s i v e,只拷贝一个目录,不包括子目录。
a d C o p y A l l o w D a t a L o s s,允许提供者为远程操作使用下载 /上载类型的拷贝
A s y n c Tr u e表明是异步操作,F a l s e则表明是同步操作由于提供了用户名和密码,你可以连接到安全的远程的 We b站点。
在使用 a d C o p y O v e r Wr i t e选项时,必须非常小心,因为该操作不同于一般的文件拷贝,它将覆盖目标。如果拷贝一个,并指定了一个目录作为目标,那么这个目录将会被该文件覆盖。
M o v e R e c o r d方法的使用情况类似:
398计计 ASP 3 高级编程 下载它的参数除了 O p t i o n s参数以外,与 C o p y R e c o r d方法的参数是相同的。它的 O p t i o n s参数可以是以下值:
adMoveOverWr i t e,覆盖已有的文件或目录。
a d M o v e D o n t U p d a t e L i n k s,确保文件上的超级文本链接不被更新。缺省的状态是只要提供者具有此功能则更新链接。
a d M o v e A l l o w E m u l a t i o n,如果 M o v e R e c o r d方法失败,使用下载 /上传和删除模拟这次移动。
资源的安全性对于那些看上去存在着很大安全漏洞的地方,不要感到惊慌。要认识到以下两点:
I n t e r n e t发布是 IIS 5.0的一个组成部分。 IIS 4的网上发布功能是非常有限的,它由
FrontPage Server Extensions 来提供。 IIS 5.0仍然支持这些功能,但同时也支持新的 D AV
扩展。
通过 OLE DB提供者访问的用于 I n t e r n e t发布的资源是标准的 We b资源,控制 We b资源访问的方式与其他 We b资源是相同的。
如果确定了自己的站点没有写或删除的权限,那么其他人就不会把你的文件搞得一团糟。
如果确实需要这些操作,那么可以授权给特定的用户,M o v e R e c o r d等方法需要得到访问权限,
这些都可作为方法调用的一部分来提供。
因此,网站仍然是安全的。如果它还不具有安全性,那么现在我们应该使之具有安全性。
3,Stream对象迄今为止,关于 We b资源我们一直没有提及怎样使用 S t r e a m对象。在 X M L的章节中,读者已经看到了 S t r e a m对象的一些使用情况,但也可从 We b资源获取这些数据。我们可以使用一个 A标记,并放进文件的 U R L,这样一旦 U R L被单击,
该文件就会被加载。
但是,如果要控制 We b上的资源,而不是直接将其加载到浏览器中,那又该怎么办呢?也许你想把它显示在页面内,看上去也许可能像图 1 2 - 1 5
所示。
同样,这也很容易做到。与以前一样,我们先包含连接的细节,然后建立一个文本域以供显示文件的内容:
下面是读取文件的 A S P代码。首先创建一个 S t r e a m对象:
第 1 2章 通用数据访问 计计 399下载图 12-15 访问 Stream 对象示意窗口然后打开这个 S t r e a m对象,同时指定一个文件作为 S t r e a m对象的源文件:
S t r e a m对象的 O p e n方法中的参数指定了要打开的文件的 U R L、文件的访问方式以及从哪里打开 S t r e a m对象。如果 S t r e a m的源 (第一个参数 )是一个 R e c o r d对象,那么后一个参数就可以是 a d O p e n S t r e a m F r o m R e c o r d。
一旦打开了 S t r e a m对象,就可以用 R e a d Te x t方法读取其内容,并简单地把它们显示出来:
最后,清理变量并关闭文本域:
必须承认这并不是一个特别令人激动的例子,也可以通过别的方法来实现它。但是,考虑一下围绕着文本域增加一个 F O R M对象,以及增加一对命令按钮,如图 1 2 - 1 6所示。
现在就可以更新这个文件了,这确实很令人兴奋。这个 Update Source按钮只是调用了一个 A S P文件 (StreamUpdate,asp),其代码也非常简单:
创建了 S t r e a m对象后,打开文件 (此时使用读 /写权限 ),
接下来,把 S t r e a m对象的当前位置移到 S t r e a m对象的开始,接着设置 S t r e a m对象的结尾为当前位置。这样能截短 S t r e a m对象,清除已存在的内容:
然后以调用 A S P页面的形式从文本域中取得文本,同时使用 Wr i t e Te x t方法向 S t r e a m对象中写入内容:
下面告诉用户发生了什么事:
最后关闭这个 S t r e a m对象:
400计计 ASP 3 高级编程 下载图 12-16 带有命令按钮的访问 S t r e a m
对象示意窗口这样仅用这几行代码就创建了两个可以读取和更新文本文件内容的 A S P页面。虽然这些例子使用的是固定的文件名,但建立一种允许用户选择文件名的窗体也是很容易的。
4,Record和 S t r e a m对象小结我们在前面几节看到的例子表明了管理 We b服务器上的资源是很容易的。但这也只是冰山的一角,因为它扩展的可能性是很大的。举个例子,作为测试,作者只用 A D O写了一个 Vi s u a l
B a s i c程序,它执行起来如同普通的 F T P客户一样。为什么这么做?主要有如下两条原因:
要了解能从仅有的几个 A D O方法中能获得哪些功能。
要证实 I n t e r n e t发布提供者的 A D O功能。它建立在 D AV上,即 H T T P。这意味着可使用 A D O
编写远程管理程序而不必担心打开防火墙。因为它使用 H T T P,它可以轻松地穿过防火墙。
当然,这也意味着必须确保你的 Web站点是安全的,至少也要降低其潜在的安全风险。
这种技术的真正的核心仅由几个方法处理。可以使用 R e c o r d对象的 C o p y R e c o r d和
M o v e R e c o r d方法来移动文件,同时 S t r e a m对象提供了访问文件内容的方法。这样就可以轻松地写出简单的远程管理工具了
12.3.3 We b D AV
在前述章节中我们已经数次提到了 D AV和 We b D AV,但一直没有真正解释过它到底是什么。基于分布式设计和版本 (Distributed Authoring and Ve r s i o n s,D AV )的 We b是 I n t e r n e t发布提供者涉及的全部内容。 We b D AV是专门为分布式创作 We b文档而设计的。
目前我们用 F r o n t P a g e和 FrontPage Server Extensions编辑和管理远程 We b服务器上的文档,
但这是一个专用的解决方案。多年来,W 3 C和 I E T F的工作组已经整理出 We b D AV的具体规范,
现已成为大家认可的标准。
We b D AV是一种基于 HTTP 1.1扩展的协议规范,因此它与平台是无关的。目前 F r o n t P a g e
是一个很好的解决方案,但它也仅是 M i c r o s o f t的解决方案。随着 IIS 5.0的出现,M i c r o s o f t已完全支持 We b D AV,并成为该工作组中的主体部分。
那么,We b D AV究竟能为我们做什么呢?如果我们告诉你 I n t e r n e t发布提供者是建立在
D AV之上的,那么你就会发现它的方便之处。你能远程管理文件,允许编辑、拷贝等等。
现在已有好几种包含 We b D AV功能的 We b服务器,并且各种客户也是层出不穷。这意味着用户可以在不损失功能的前提下,使用自己最为熟悉的工具。
1,We b D AV的未来
We b D AV仍旧是一个发展中的产品,并且目前版本仍在继续更新。这将带来真正意义上的合作开发,允许多次编辑且使用版本来控制资源。最终它可能替代现有的版本控制系统。
正在进行的其他方面的工作也影响了 We b D AV的发展,更多的细节问题请查看 We b站点:
w w w,w 3 c,o rg。虽然 M i c r o s o f t没有正式声明,但好像一旦 We b D AV的版本被认可,他们将在未来的某个时候更新 I I S。
12.4 企业数据在当今的企业中,选择 M i c r o s o f t并不是唯一的策略。除非这家企业决定只使用 M i c r o s o f t
第 1 2章 通用数据访问 计计 401下载工具和产品来实现标准化应用,否则你会看到一个应用程序必须与其他系统交互。许多这样的系统甚至不能在一个通用协议上相互通信。
数据是一个企业最有价值的资产,绝大部分数据被存储在大型数据库中,比如 O r a c l e和
I B M的 D B 2,以及非关系数据库中,或者是直接作为一组数据文件存储在文件系统中。小型计算机系统也大量使用于企业,大量的数据一般基于 D i g i t a l (现为 C o m p a q )的 VA X / V M S或
U N I X系统,并且主要是围绕着四大关系数据库管理系统 ( R D B M S )之一来建立的,它们是 I B M、
I n f o r m i x,O r a c l e和 S y b a s e。
12.4.1 Access和 SQL Server二者取一当 M i c r o s o f t决定进军数据库市场时,它把 SQL Server定位于服务于少数用户,即工作组,
主要是为了满足小规模到中等规模的数据存储需要。 M i c r o s o f t把 SQL Server作为一种必备的工具来帮助推销操作系统 O S / 2。因此 M i c r o s o f t的工程师同 S y b a s e的工程师合作将 S y b a s e的
U N I X数据库产品移到了 M i c r o s o f t的 O S / 2版本上。
当 M i c r o s o f t最终将 SQL Server定位于 Windows NT,并且在 SQL Sever 4.2版本之后从
S y b a s e手中接管其发展方向时,SQL Server仍然是一个工作组级的数据库产品。从我的观点看,其原因与其说是因为产品性能,还不如说是因为市场策略的缘故。无论什么原因,自始至终 SQL Server一直被认为是一种工作组级的数据库,只有在现在才开始被认为是一种企业级的数据库产品。而今,多处理器支持和较好的可扩展性已使 M i c r o s o f t的 SQL Server 7.0挤入了企业级数据库市场。
M i c r o s o f t进入桌面数据库市场稍晚了一些,但他们同样也使桌面市场的竞争者黯然失色。
虽然这个领域将涉及 A c c e s s和 SQL Server的取舍问题,但也不要完全抛弃 A c c e s s。我的意思是说对于 A S P数据访问应有可供选择的数据库,而不是在 Wi n d o w s环境下选择最好的前端数据库工具。我在 I n f o r m i x软件公司工作,这是一家主要的数据库供应商,但是我仍然选择 M i c r o s o f t
的 A c c e s s作为客户端工具。
今天的企业一般是围绕着 I B M,O r a c l e,I n f o r m i x或 S y b a s e四家公司的大型数据库系统来建立数据存储。事实上它们都是关系数据库产品。一家企业的大多数数据资产其实并不完全位于关系数据库中,另外在较老的层次或 C O D A S Y L数据库或在文件系统中也存在着。当然,
大部分早期系统里的数据已经移到关系数据库管理系统 (Relational Database Management
S y s t e m s,R D B M S )中了,因此我们集中介绍主要的数据库供应商的产品。
1,Oracle
当 M i c r o s o f t公司宣布其 SQL Server 7.0时,不久 O r a c l e就宣布出 $1 000 000.00对 M i c r o s o f t
SQL Sever 7.0提出挑战。从那以后在这两大软件业巨头之间就开始了不停的竞争。 O r a c l e想挫败 M i c r o s o f t的 C O M / D C O M及其系列产品,他们选择了使用 J a v a和 C O R B A作为主要战略来实现其分布式和 We b结构。
然而,他们实际上却不得不相互妥协,O r a c l e的确支持 M i c r o s o f t的 D N A,C O M / D C O M、
OLE DB,A D O和 A S P。事实上,M i c r o s o f t自己也觉得与 O r a c l e的协同工作能力是如此重要以致于还为 O r a c l e提供了一个强大的 Oracle OLE DB提供者,它使 O r a c l e运行在与 SQL Server 7.0
相同的功能层上。 O r a c l e也为 O L E提供了具有 A c t i v e X功能的 O r a c l e对象 ( O O 4 O )。 O O 4 O可在任何程序或脚本语言中 (包括 A S P )使用。
402计计 ASP 3 高级编程 下载使用 M i c r o s o f t的 OLE DB提供者来连接 O r a c l e数据库是比较容易的,它的功能与使用 S Q L
Server 7.0处于相同的级别上。然而,实际上,大多数 O r a c l e工作间仍在使用老版本的 O r a c l e引擎,比如 7,x或更早的版本。这就提出了一个问题,也就是说需要使用一种支持特定的 O r a c l e
引擎的 OLE DB ODBC提供者和一个 O D B C驱动程序。 OLE DB ODBC提供者交付的功能要比本地的 Oracle OLE DB提供者少得多,这主要是受所用的特定 O D B C驱动程序的限制。
然而,O r a c l e提供了最为广泛的多平台支持,但每一种操作平台可能会对 O r a c l e提出不同的要求。 OLE DB ODBC网关是最容易的访问方法,但也可能出现种种不希望有的限制。开发者必须仔细评估每一个折衷的办法。
2,IBM
I B M针对他们的 DB 2产品提供了五种不同的代码。 I B M基于不同的操作系统和平台,在公司内的不同地方开发了各种不同的 DB 2版本。有传言说 I B M正试图为其 DB 2关系数据库提供一种通用代码。但有一点可以确定,一致的功能会贯穿 DB 2产品线,这样就能为所有 DB 2
产品带来功能上的统一。
I B M的战略重点放在开发 J a v a,以及在他们的数据库产品中集成 X M L。通过与其他已经将这些技术转移到 I B M平台的供应商的合作,他们对 C O M,OLE DB 和 A S P提供了支持。有时这些解决方案是以很高的代价换来的,而且并不是所有提供的东西都能跨越全部 I B M平台。
在后面,我们将看到 C h i l i ! S o f t的 A S P技术,它已被移植到 I B M的 O S / 3 9 0和
A S / 4 0 0操作系统以及其他平台上。
据估计世界 5 0 0家最富有的公司中就有 4 7 0家使用 I B M的大型机环境之一来存储企业数据。
由 M i c r o s o f t的 SNA Server提供的 SNA OLE DB提供者提供了一个从外部进入 DB 2环境的网关。
把 IBM DB 2与 A S P应用程序结合起来的关键在于对 I B M的 S Q L / C L I标准的有力支持。
O D B C是最通用的 S Q L / C L I实现。这也常常引起用户的误解,因为通常用户并没把 S Q L / C L I的 A P I与 O D B C联系起来。 I B M最终放弃了 C L I这个称呼,而用 O D B C
代替。
自从 M i c r o s o f t似乎在 O D B C领域的开发已到了尽头,I B M就一直就扛着 O D B C的大旗。
3,Informix
I n f o r m i x的战略是成为一个“标准公司” 。他们支持所有主要的对象技术,C O M / D C O M、
C O R B A和 J a v a,同时他们也致力于将 X M L集成进其产品线的各个领域。 I n f o r m i x是唯一一家采用所有标准的公司。
I n f o r m i x甚至有自己的 Visual Basic工具,Visual Basic Data Director。它能帮助开发人员开发一个成功的 A S P策略。 I n f o r m i x也支持本地的 OLE DB提供者。
I n f o r m i x的 We b站点,w w w,i n f o r m i x,c o m,有好几个涉及使用 A D O来访问他的产品的 I n t e r n e t白页。
随着 I n f o r m i x收购了 I l l u s t r a,I n f o r m i x已将对象相关技术集成到 9,x版本的服务器产品中。
I l l u s t r a是 UC Berkeley 对象相关成果的商业化产品,增加了丰富的在其他相关产品中没有的功能。
I n f o r m i x也实现了最新的 S Q L - 9 9标准中某些先进的特性,同时由于收购了在数据存储系统中处于领导地位的 Red Brick公司,I n f o r m i x也相应加强了对数据存储的支持。
第 1 2章 通用数据访问 计计 403下载
C l o u d s c a p e是一家百分之百的 Java SQL数据库公司,已被 I n f o r m i x收购。他主要是通过提供桌面的和易于嵌入的数据库产品来推出其数据库系列产品。 I n f o r m i x的 C l o u d s c a p e数据库将会提供许多 M i c r o s o f t的 A c c e s s所拥有的优点。 C l o u d s c a p e将被集成到 I n f o r m i x的系列产品中,
也将支持其他 I n f o r m i x产品 ( C O R R B A,C O M和 J a v a )所支持的全部接口。也有可能包括 A S P脚本程序。
I n f o r m i x为 A S P开发提供了一个较好的平台,同时 I n f o r m i x,数据库产品又是一种工业强度系列的数据库,这是实现某些工业大容量数据库的基础。 I n f o r m i x的数据库分别提供了 U N I X
和 Windows NT环境下的两个版本。
4,Sybase
S y b a s e对 M i c r o s o f t早期开发 SQL Server是有帮助的,因此难怪 M i c r o s o f t的 SQL Server与
S y b a s e的产品很相似。然而,当 M i c r o s o f t与 S y b a s e最终决定分别以自己独立的方式开发产品时,他们的产品外观就显得不同了。
S y b a s e郑重承诺将把 J a v a集成到他们的产品中。 S y b a s e是 S Q L J标准制作的最初参与者之一。此外,S y b a s e的 P o w e r To o l s工具能直接生成 A S P代码,因此 S y b a s e的 We b数据库集成是其公司内的一个重要成果。
使用 S y b a s e的工具可以直接支持 A S P开发,也可以通过他们的 O D B C和 OLE DB提供者来支持 A S P开发。 S y b a s e对 A S P的支持以及 P o w e r To o l s产品生成 A S P代码的能力,使我们看到
S y b a s e在未来将会把 A S P的成果捆绑到其产品中。
5,结论总之,对于 A S P应用程序开发而言,来自主要数据库供应商的集成信息不应该是一个问题。所有主要数据库供应商都支持 S Q L / C L I标准和 O D B C规范,同时也可通过第三方支持,直接或间接地提供 O D B C和 OLE DB 提供者。许多厂商也提供本地的 OLE DB提供者,它们具有与 Microsoft SQL Server 7.0的 OLE DB提供者同样丰富的特性。
12.4.2 SNA Server和传统数据访问正如前面提及的那样,许多企业数据集中存储在公司的大型机数据中心上,在大型机技术市场上 I B M占据了主导地位。据估计目前全世界企业 8 0 %的关键数据都存放在 I B M大型机和
A S / 4 0 0系统中。
因此,在任何新应用程序中进行信息集成的策略是非常重要的,这些新应用程序需要开发企业的数据资源并将其完美地集成到 I B M的大型机技术中,比如 S N A ( I B M的网络体系结构 )。
M i c r o s o f t较早地认识到了这些问题,提供了一种系统网络体系结构 ( S N A ) S e r v e r。信息系统专家依靠 I B M的 S N A网络将终端连接到大型机,但现在他们必须把这些信息集成到基于 We b的应用程序中。
同时,大多数企业也配置了自己独立的 P C网络,它们也都是关键的,比如像企业的电子邮件、文件创建、工作组数据库和论坛支持系统。当前,把两个或更多的系统紧密结合起来已成为一个很重要的问题,这样终端用户才能将存储在主机系统上的数据结合到他们的通信、
分析和汇报中。因此终端用户使用比较简单的数据集成也就不足为奇了,例如:
从一个终端的仿真会话中拷贝和粘贴。
从打印报表中再次输入数据。
404计计 ASP 3 高级编程 下载
从文本文件转储中导入数据,这种转储必须涉及 E B C D I C到 A S C I I文件的转换。
E B C D I C和 A S C I I都是字符编码的标准。 I B M的大型机使用 E B C D I C (扩展二进制编码的十进制转换码 )作为字符编码字符集。与此相反,P C和大部其他系统使用
A S C I I (美国标准信息转换码 )字符集。所以,主要的问题在于如何实现不同字符编码之间的转换。
I T专业人士已要求提供一种直接将 P C系统、主机数据与运行数据库的大型机集成起来的方法。这是多年来一直存在的一个问题,现在由于 I n t e r n e t,I n t r a n e t和 E x t r a n e t应用程序的兴起,这个问题又有了新的内容,这些应用程序需要利用这些关键数据。数据存储的在线分析处理或论坛支持 (Online Analytical Processing or discussion support,O L A P )问题也进一步强化了对数据集成的要求。
M i c r o s o f t提供了一种在 I B M大型机上开发企业数据的简便方法:通过使用 M i c r o s o f t的
SNA Server以及 A S 4 0 0和 O S / 3 9 0的 OLE DB本地驱动程序。这就允许用 A S P脚本来开发大型机的数据库。
12.5 企业中的 A S P
从现在到 2 0 0 3年之间,多数开发和使用的应用程序将主要基于 I n t r a n e t,E x t r a n e t和
I n t e r n e t技术。所以,选择一种将当前企业资产和资源集成到新的基于 We b的应用程序中的中间件技术是有意义的。将当前的数据资产迁移到新的操作平台是不实际的,并且在经济上可行性也不高。增加一个额外的能访问资源或对当前企业的技术投资起决定作用的层次将会更有意义。
但不是使用 A I X上的 P e r l,N T上的 F r o n t P a g e以及 IBM OS/390和 A S / 4 0 0上的某些其他东西,
可以完全只用 A S P:通过使用相同的跨平台开发工具来“粘合”所有操作平台。这确实大大节省和缩短了开发时间和工作量。现在只需编写一次应用程序,而不用考虑使用什么平台,
因为 A S P开发不仅仅用于 Windows NT和 I I S。 A S P开发所提供的规模比 N T解决方案的规模要大得多。
Chili!Soft ASP
C h i l i ! S o f t研制了 U N I X和其他平台上使用的 A S P,它也同样广泛支持各种 We b服务器。这使 A S P技术看上去不仅仅是一个 M i c r o s o f t的中心中间件策略。例如,I B M和 C h i l i ! S o f t已经将
A S P引擎移植到 A S / 4 0 0和 O S / 3 9 0操作系统上。这也意味着 A S P应用程序同样可以运行在占据企业数据存储 8 0 %份额的 I B M平台上。 A S P对 U N I X的支持也将扩充驻留在基于 R D B M S系统的
U N I X上的企业数据资产,例如 O r a c l e,I n f o r m i x,D B 2,S y b a s e及其他供应商的产品。
事实上,由于 C h i l i ! S o f t研制出 C h i l i ! B e a n s,他们已经比 M i c r o s o f t领先了一步,
C h i l i ! B e a n s技术允许 o ff-the-shelf Java类和 Java Beans成为 COM ASP组件。如果 C h i l i ! S o f t在长时间内是成功的,那么他们将能为我们改善 A S P应用程序开发的环境。他们的 We b站点的 U R L
是,w w w,c h i l i s o f t,c o m,。
1,Chili!Soft的目标是 I S P
C h i l i ! S o f t产品的市场目标是 I S P,以提供更强大的 We b托管功能。他们相信这将为他们的技术开辟一个强大的市场,因为 A S P已逐渐被大众所接受,同时大多数 I S P运行在 U N I X或第 1 2章 通用数据访问 计计 405下载
U N I X的变种上,比如 F r e e B S D或 L i n u x。然而,我认为企业对同样的系统集成有一定的需要,
因此企业中的用户会对 C h i l i ! S o f t的 A S P技术持有坚定的信心。
2,在非 M i c r o s o f t平台上使用 A S P
正如前面所说的那样,大多数企业是由许多不同的平台和数据存储组成的。要知道把所有的鸡蛋都放进同一个篮子显然也不是一件好事。 I T部门会选择不同的供应商分担不同的任务。这样可以在单个供应商的解决方案不能解决问题的情况下有所选择。一名有头脑的 I T管理者不会想成为单个供应商的永久顾客。
除了上述观点以外,大多数企业都支持 ANSI/ISO SQL数据库语言标准,T C P / I P网络协议标准等工业标准,因此单个供应商特有的方案并没有考虑到一个开放的标准。随着把 A S P解决方案移植到其他的平台,A S P有可能成为一个实际的标准。如果不把 A S P移植到其他平台或
We b服务器上,A S P永远只能算是一个一流的 M i c r o s o f t解决方案。
3,Chili!Soft ASP和分布式对象技术分布式应用程序技术已经出现一段时间了,它在操作系统、网络操作系统和数据库引擎的开发中已经使用了一些时间。但只有在现在分布式应用程序才进入企业开发者的“武器库”
中。我们需要理解它,并使用它来开发今天和未来的企业应用程序。
分布式技术的发展主要有三个方向,C O M / D C O M,J a v a和 C O R B A。我们将对每一个技术方向做探讨,以便进一步了解 C h i l i ! S o f t在各个技术方向的发展状况。
(1) Chili!Soft ASP和 C O M / D C O M
M i c r o s o f t的 C O M是 Windows NT和 U N I X上的 Chili!Soft ASP的本地对象模型。 C h i l i ! S o f t
ASP 3.0版现在支持 D C O M,同时也允许 C O M对象作为本地 C O M对象出现,甚至 C O M对象也可以分布在另一台或好几台机器上。这就要考虑分布与负载平衡问题。
C h i l i ! S o f t的 U N I X支持也将 D C O M模型扩展成支持 U N I X平台,因此可以将分布式环境拓宽到具有沉重负荷的机器上。这也表明 A S P组件并不一定要驻留在 A S P服务器上。它们可以驻留在另外的数据资产和数据收集设备附近。数据收集设备可能是医疗仪器或任何与之同等复杂的设备。这种对分布式策略的广泛支持为我们带来了很大的希望。
(2) Chili!Soft ASP和企业 J a v a B e a n s ( E J B )
S u n的新的 E J B规范被认为是一个功能强大的可替代 C O M / D C O M的技术。 E J B号称是一个功能强大,与平台无关的,并能提供创建基于组件的分布式应用程序的体系结构。
Chili!Soft ASP 3.0版本能够让开发者立即使用 EJB Server去处理事务性的 A S P组件。 E J B
S e r v e r提供了许多与 Microsoft MTS和 C O M +在 C O M领域中提供的相同的服务。 EJB Server提供了事务管理、生存期管理、对象转储、线程管理以及其他自动管理服务等服务。
这种组合为开发工业强度的、可扩展的、安全的和面向事务的 We b应用程序提供了一个卓越的环境。这是对目前仅在 Microsoft ASP环境下可获得的功能的扩展。
(3) Chili!Soft ASP和 C O R B A
通用对象请求代理体系结构 (Common Object Request Broker Architecture,C O R B A )是承诺通过使用对象来实现真正的分布式应用程序开发的最重要的技术之一,它是由对象管理组
( O M G )开发的。
O M G正努力想通过其较为普遍的标准规范 ( C O R B A / I I I P、对象服务,I n t e r n e t工具和域接口规范 ),把 C O R B A建立成为到处都有的中间件。随着 C h i l i ! B e a n s技术与 Java IDL的结合,
406计计 ASP 3 高级编程 下载
A S P开发人员现在可以使用 C O R B A作为分布式应用程序开发的选择手段之一。 C O R B A对象可以通过 C h i l i ! B e a n s和 Java 2.0来访问。
有了 C h i l i ! S o f t的 A S P方法,我们相信未来的 A S P还要有显著的扩展。服务于更多基于标准和规范的非 M i c r o s o f t平台的供应商,会使 A S P成为实际的分布式 We b应用程序开发脚本标准。
12.6 小结本章探讨了 A D O大多数人倾向于支持关系数据库。但数据正以不同的方式被广泛利用,
因此,在讨论有关数据的问题时,我们需要拓宽视野,这就是 U D A策略所涉及的主要内容。
本章主要讨论了以下几个问题:
如何从 A D O来访问众多不同的数据存储。
半结构化数据的定义,如何使用新的 A D O对象来访问它。
Internet发布的定义,如何访问远程资源。
简要地概述了非 M i c r o s o f t企业。
这一章所讲述的内容仅是某些更复杂的内容的开始。 We b D AV等开发将会对我们管理 We b
数据的方式产生重大的影响,同时也证明它是协作开发的一个主要的转折点。目前众多的网页编辑工具似乎都着眼于单个作者,当我们进入工作组进行开发或多人编辑时,会出现大量需要解决的问题。
随着在 We b上发布的数据量逐渐增加,研究一种便于编辑、查看和发布这些信息的方法是明智的 (或者说是势在必行 )。也就是说 We b D AV领域正变得越来越大。
同样,随着 C h i l i ! S o f t这样的公司扩展了对非 M i c r o s o f t平台的 A S P支持,A S P将迅速成为企业中所有形式的基于 We b应用程序开发的一个标准。
现在结束了对数据访问内容的讨论,从下一章起将介绍怎样在 A S P应用程序中使用功能强大的组件。
第 1 2章 通用数据访问 计计 407下载