日期:2012-03-12  浏览次数:21012 次


    虽然在ADO 2.5对象模型中出现了两个新对象,但与以前的版本基本上是类似的。图8-3显示了这些对象以及每个对象之间的关系:

       如果以前使用过ADO,你会发现在这个新版本中出现了两个新对象:Stream和Record对象。在第11、12章将详细介绍它们。
    Properties集合已经被有意地排除在图8-3外,这样你对几个主要对象之间的交互关系就一目了然了。在本章的后面,有显示Properties集合的简化对象模型。
       让我们更详细地考察这几个对象。

8.2.1 Connection对象
       Connection对象是使我们能与数据存储相连的对象。只有Connection对象才能指定希望使用的OLE DB提供者、连接到数据存储的安全细节以及其他任何连接到数据存储特有的细节。
       应用注意的是,不必显式创建一个Connection对象以连接到数据存储。尽管确实需要指定连接细节,但没有Connection对象,一样可以创建Command、Recordset和Record对象。如果不创建自己的Connection对象,ADO将会隐含地为你创建一个Connection对象。如果要对提供者运行多条命令,应该显式地创建一个Connection对象,这比每运行一条命令就创建一个连接更有效。
       除了为数据存储提供连接以外,Connection对象允许针对数据存储执行命令操作。这些命令可以是结构化的或存储的命令(例如,SQL命令或一个存储过程),并且可以有选择地从数据存储中返回一些数据。

8.2.2 Command对象
       Command对象是对数据存储执行命令的对象。看到这里读者可能会产生疑问,Connection对象不也能这样做吗?是的,但是Connection对象在处理命令的功能上受到一定的限制,而Command对象是特别为处理命令的各方面问题而创建的。实际上,当从Connection对象中运行一条命令时,已经隐含地创建一个Command对象。
       有时其他对象允许向命令传入参数,但在Connection对象中不能指定参数的任何细节。使用Command对象允许指定参数(以及输出参数和命令执行后的返回值)的精确细节(比如,数据类型和长度)。
       因此,除了执行命令和得到一系列返回记录,也可能得到一些由命令提供的附加信息。
       对于那些不返回任何记录的命令,如插入新数据或更新数据的SQL查询,Command对象也是有用的。

8.2.3 Recordset对象
       Recordset对象是ADO中使用最为普遍的对象,因为它含有从数据存储中提取的数据集。我们经常运行不返回数据的命令,比如那些增加或更新数据的命令,但在大多数情况下很有可能会取得一系列记录。
       Recordset对象是拥有这些记录的对象。可以更改(增加、更新和删除)记录集中的记录,上下移动记录,过滤记录并只显示部分内容等等。Recordset对象也包含Fields集合,Fields集合中有记录集中每一个字段(列)的Filed对象。
       无论是在ASP页面中处理数据,还是利用远程数据服务(RDS)远程使用数据,Recordset对象是必须处理的对象。

8.2.4 Record对象
       ADO 2.5以前的版本在处理结构化数据上是很有效的,比如从数据库中取出记录集,但无法处理每一行的列(也就是列数和数据类型)可能不同的数据。对于SQL数据这不是一个问题,但对于文件和邮件系统,Web服务器和别的诸如此类的数据存储会如何呢?我们把这些数据看作是半结构化的数据,与记录集相比结构性较差,但与那些常用来代表文本或图像的二进制数据相比更具有结构性。
       通常,半结构化数据的存储采用树状结构来组织,有节点、子节点和文件。例如,设想一个有文件夹、子文件夹和文件的Web站点。图8-4所示的屏幕图显示了一台机器的Web站点,特别是还有一个名为public的虚拟目录:

       如果一定要在ADO中进行建模,会觉得这非常适合记录集,可能是嵌套的记录集。然而注意高亮度显示的目录,该目录含有不同类型的文件,里面有几个目录、两个ASP文件、一个文本文件和一个WORD文档。你会很容易地将其映射到一个拥有名称、类型、上次存取时间等字段的记录集,遗憾的是并不是这样简单。对于访问权限而言,在文件和目录之间就有区别。对于目录,需要的是能访问目录下的文件;而对于文件,却可能是需要访问其内容。
       由于其复杂性,引入了Record对象。在上面的情况下,存在有一些相同属性的条目的一个集合,但是每个条目也有独特的属性,因此需要使用别的方法去处理这些数据。把一个集合映射到一个记录集,一个单独的文件映射成一条记录,相应的文件属性就映射成Fields集合。
       这意味着有了一个含有六行记录的记录集。访问记录集中单独的一行就会得到该文件的属性(字段),但是提供给我们的仅仅是属性,为了访问文件或目录的内容,需要使用Record对象,该对象包含文件或目录的独特属性。习惯于这个概念有一定的困难,但不必担心,在第11、12章你会看到更多有关Record对象的例子。       Windows 2000初始版本发布以来,只有用于Internet发布的OLE DB提供者使用Record对象。一旦微软Exchange 6.0发布,将成为以类似方法利用记录集和记录提供对Exchange信息库访问的OLE DB提供者。
8.2.5 Stream对象
       Stream对象用于访问节点的内容,比如一个E-Mail消息,或一个Web页面。利用Stream对象可以访问文件或资源的真实内容。因此,结合Record和Recordset对象,不仅可以访问Web服务器上的文件或email消息,还可以访问相应的内容。这样,就可以创建一个只使用ADO去访问邮件系统的邮件客户。这也许不会有太多的优点,但意味着可不必了解邮件系统的API或对象模型,减少了学习上的弯路。
       Stream的另一个用途是XML,可以访问一系列作为XML流的数据(结构化或半结构化)。
       Stream对象用来处理二进制数据,所以,可以用来处理BLOB类型的数据,比如数据库中的图像或大文本数据。
       同样,在本书第11、12章中你会看到更多的有关Stream对象的例子。

8.2.6 集合
       ADO对象库中有一些集合,每个集合都有零个或更多个与其关联的对象的拷贝。可以使用相同的代码结构去遍历这些集合。
       在VBScript中的语法是:
       For Each object In Collection
              ' Do somet