ado|对象
虽然在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 something with object
Next
例如,遍历一个Recordset对象的Fields集:
For Each objField In rs.Fields
Response.Write objField.Name & "
"
Next
如果选择JScript,那么可以使用Enumerator对象:
for (objField = new Enumerator(rs.Fields);
!objField.atEnd(); objField.moveNext())
Response.Write (objField.item().Name + '
');
1. Fields集合
Fields集合拥有与记录集或记录关联的Field对象。对基于结构化数据的记录集,比如SQL数据,字段相应于数据中的列,并含有列的详细内容,比如名称、数据类型、长度等等。在以后几章看到大量的关于Fields集合的例子。
对于半结构化的数据,对象的属性相应于字段。在第12章会看到更多的相关的介绍。
2. Parameters集合
Parameters集合仅被Command对象使用,确定在存储命令中的参数。SQL数据库中的存储过程频繁地使用参数,并允许数据传入和传出预定义的SQL语句。如果拥有向ADO返回信息的参数,则会十分有用,因为这样从存储过程中返回的就不只是一个记录集。例如,考虑一个更新多个表然后返回一个记录集的复杂存储过程,可以用一个输出参数显示更新了多少条记录。
另一个使用参数的理由是性能问题,特别是在仅仅需要从存储过程返回单个值的时候。在这种情况下,没有创建记录集的必要,只需要保存一个值即可,因而不需要返回记录集,而返回输出参数的值是更为有效的方法。
在第9章会看到有关Parameter集合的详细介绍。
3. Error集合
Error集合包含因运行命令而引起的上一次ADO或OLE DB提供者错误的详细内容,只能被Connection对象访问。可能会觉得这是个限制,因为不必显式定义Connection对象,但可以通过Command、Recordset和Record对象的ActiveConnection属性访问隐含的Connection对象。例如:
For Each objError In rs.ActiveConnection.Errors
Response.Write objError.Name & "
"
Next
在本章后面,将详细讨论Error集合。
4. Properties集合
为了避免混乱,Properties集合没有在前面的对象模型图上加以显示。它与对象模型的关系显示在图8-5中:
Properties集合存在的原因是因为ADO是用来处理许多不同的数据存储,都有不同的特征。将属性(Property)组成一个集合,可以使之能够动态地根据不同的数据提供者而随时改变。例如,Jet的OLE DB提供者允许访问Jet特殊的安全属性:
Set conDB = Server.CreateObject ("ADODB.Connection")
conDB.Open "DSN=Nwind"
conDB.Properties ("Jet OLEDB:Database Password") = "LetMeIn"
其他的提供者没有这个属性,因此把它加到Connection对象中作为一个静态属性是不明智的。ADO根据所使用的OLE DB提供者,会用提供者缺省值填充属性集合。
虽然这里有关于Properties集合的使用说明,但在本书中不准备详细叙述Properties集合。要获得更多的关于该集合的介绍,请参阅《Professional ADO 2.5 Programming》或《ADO 2.5 Programming's Reference》,两者都由Wrox出版。
8.2.7 ADO常数
当使用ADO时,会发现有许多预先定义的用于众多选项的常数,比如定义光标类型和锁类型的常数。使用像Visual Basic或Visual C++这样的语言,一旦引用了ADO类型库,自然会用到这些常数。在ASP中情况不同,有两种选择。
引用常数的第一种方法是把它们包含进ASP文件:
<!-- #INCLUDE FILE="adovbc.inc" -->
可以将包含文件拷入本地目录,或者从安装目录引用它,其缺省路径为C:Program FilesCommon FilesSystemado(以上文件包含用于VBScript的ADO常数——对于JScript,应该使用adojavas.Inc)。使用这个方法的一点不足是会使ASP页面变得过大,因为包含了全部的常数,而其中许多是不需要使用的。
可以创建自己的只含有所需要的常数的包含文件,但越来越多使用ADO的功能时,很可能会发现需要不断地编辑、维护这个文件。
一个比较好的解决的方法是创建一个对类型库的引用,这种方法不需要将常数包含进ASP文件而直接可以引用常数:
<!-- METADATA TYPE="typelib" FILE="C:Program Files
Common FilesSystemadomsado15.dll" -->
不要怀疑这个DLL的名字是msado15.dll,这是一个正确的名字,包含最新版本的ADO。
可以在需要的地方把这个METADATA语句包含进每一个ASP文件,或者放入global.asa文件,这样应用程序中的每个Web页面都可以引用这些常数。