欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP 3.0高级编程(三十七)

程序员文章站 2022-06-23 16:26:10
8.2.5 stream对象        stream对象用于访问节点的内容,比如一个e-mail消息,或一个web页面。利用...
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 & "<br>"
       next
       如果选择jscript,那么可以使用enumerator对象:
       for (objfield = new enumerator(rs.fields);
              !objfield.atend(); objfield.movenext())
              response.write (objfield.item().name + <br>);
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 & "<br>"
next
在本章后面,将详细讨论error集合。
4.  properties集合
为了避免混乱,properties集合没有在前面的对象模型图上加以显示。它与对象模型的关系显示在图8-5中:
图8-5  property与对象之间的关系
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 programmings 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页面都可以引用这些常数。

8.3 连接到数据存储
       如果需要访问一个数据存储,应该创建一个到数据存储的连接。前面已经提到过:可以显式地创建一个connection对象,或者让ado隐含地创建一个连接。对于任何一种方式,都必须知道数据存储的详细内容。
       虽然用于连接的实际细节不尽相同,但对于所有类型的数据存储,其连接的实际方法是相同的。这并不令人惊奇,因为不同的提供者需要不同类型的信息。在允许用户访问数据存储之前,一些提供者需要用户的证书,而别的提供者却接受默认的安全证书。
       连接到数据源有好几种方法:
       · 连接字符串。在字符串中放入连接的细节,或在打开数据存储时,直接将连接细节加入到命令中。这种方法的优点是连接细节将保留在asp页面中。不足之处,如果你有较多的页面,在改变了连接细节时,将陷于繁重的维护工作当中。解决的方法是创建一个包含连接细节的字符串变量,并放进一个asp包含文件,这样的话仅仅有一个连接字符串的实例,但能保持与其他的asp页面相符。另一个常用的技术就是将应用程序中的连接字符串存储到状态变量中,这样可以被应用程序中的所有页面使用。
       · 数据链接文件。这是一个含有连接细节的文件(扩展名为.udl)。优点是对于任何数据的asp页面只需要一个数据链接文件。要创建一个数据链接文件,只需创建一个新的文本文件,并重新命名(要确保windows资源管理器显示文件扩展名)。一旦重新命名了该文件,就可以打开它(双击)以显示data link properties对话框。以前版本的ado允许从windows资源管理器的new菜单建立数据链接文件。我们将在本章稍后看到有关数据链接文件的内容。
       · odbc数据源,或dsn。有点类似于数据链接文件,但只适用于odbc数据源。它们集中起来用于asp页面,数据源必须是系统数据源。odbc数据源从odbc数据源管理器(odbc data source administrator)中创建,这个工具可在administrative tools文件夹中找到。
       这三种方式无论哪一种都可以使用,使用哪一种只是一种偏爱而已。直接的连接字符串可能速度快一些,因为提供所