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 Programming's Reference》,两者都由Wrox出版。
8.2.7 ADO常数
当使用ADO时,会发现有许多预先定义的用于众多选项的常数,比如定义光标类型和锁类型的常数。使用像Visual Basic或Visual C++这样的语言,一旦引用了ADO类型库,自然会用到这些常数。在ASP中情况不同,有两种选择。
引用常数的第一种方法是把它们包含进ASP文件:
<!-- #INCLUDE FILE="adovbc.inc" -->
可以将包含文件拷入本地目录,或者从安装目录引用它,其缺省路径为C:\Program Files\Common Files\System\ado(以上文件包含用于VBScript的ADO常数——对于JScript,应该使用adojavas.Inc)。使用这个方法的一点不足是会使ASP页面变得过大,因为包含了全部的常数,而其中许多是不需要使用的。
可以创建自己的只含有所需要的常数的包含文件,但越来越多使用ADO的功能时,很可能会发现需要不断地编辑、维护这个文件。
一个比较好的解决的方法是创建一个对类型库的引用,这种方法不需要将常数包含进ASP文件而直接可以引用常数:
<!-- METADATA TYPE="typelib" FILE="C:\Program Files\
Common Files\System\ado\msado15.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文件夹中找到。
这三种方式无论哪一种都可以使用,使用哪一种只是一种偏爱而已。直接的连接字符串可能速度快一些,因为提供所有的连接细节。数据链接文件需要从文件中读出连接细节,ODBC数据源需要从注册表中读取连接细节。当然,速度的差异是很小的,每种方法各有优缺点。
8.3.1 连接字符串
连接字符串依赖于提供者,因为每个数据提供者可能需要不同的细节。
值得注意的重要一点是,ODBC的OLE DB提供者是缺省的,所以,如果不使用Provide=部分,系统将自动地使用ODBC。
下面为不同的提供者列举了连接字符串的例子,在本书的后面将会看到更多的例子。
1. 微软Access
如果使用ODBC,而没有DSN:
Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:\wrox\database_name.mdb
对于本地的OLE DB提供者:
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\wrox\database_name.mdb
上面的例子说明了Access数据库存放于C:\wrox目录下。虽然读者可能会尝试将数据库作为Web文件存放于相同的目录下,但不要这样做,否则任何人都可以下载整个数据库文件。将数据库存放于Web目录外永远是明智的,没有人可以从外面访问该文件。
2. 微软SQL Server
对于微软SQL Server,使用针对ODBC的提供者:
Driver={SQL Server}; Server=server_name; Database=database_name; UID=user_name;
PWD=user_password
例如:
Driver={SQL Server}; Server=WATCHER; Database=pubs; UID=davids; PWD=whisky
对于本地OLE DB提供者,语法类似:
Provider=SQLOLEDB; Data Source=server_name; Initial Catalog=database_name;
User Id=user_name; Password=user_password
例如:
Provider=SQLOLEDB; Data Source=WATHCHER; Initial Catalog=pubs; User Id=davids;
Password=whisky
3. 微软索引服务
索引服务只能通过本地的OLE DB提供者使用。其语法:
Provider=MSIDXS; Data Source=catalog_name
例如,使用Web目录
Provider=MSIDXS; Data Source=Web
4. ODBC驱动程序
在使用针对ODBC的OLE DB提供者的例子中,Driver显得较为冗长。例如:
Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:\wrox\database_name.mdb
当创建一个新数据源时,使用的驱动程序的准确名字应该是从驱动程序列表中得到的,如图8-6所示:
图8-6 驱动程序列表
5. 数据链接文件
以前版本的ADO允许在资源管理器中的目录上右击鼠标来创建一个数据链接文件。创建了新文件后,打开该文件从而得到Data Link Properties对话框。在写本书的时候,微软已经从鼠标右键菜单中删除了该选项,因为他们觉得这会让用户感到混乱。但微软声称会提供一个注册表文件以便再次引入这项功能。
不要忘了,也可以简单地通过创建一个空文本文件,并将其扩展名改为.udl来创建一个数据链接文件。
一旦有了物理上的数据链接文件,就可以通过鼠标双击或者右击鼠标选择Open打开文件。接下来,读者会看到图8-7所示的对话框:
图8-7 Data Link Properties对话框
图中的详细内容因选择的提供者的不同而不同。上面的例子显示了SQL Server提供者,连接到一个称为WATHER的SQL Server上,以davids的身份登录(口令被屏蔽了),使用pubs数据库。注意,如果选择Allow saving password选择,输入的口令将会在UDL文件中以明文保存下来。
如果要改变提供者,可以选择“Provider”(提供者)选项卡,如图8-8所示:
图8-8 改变提供者的选项卡
通过这个选择,可以选出所需的提供者,然后按下Next按钮填入适当的连接细节。
也可以在文本编辑器中编辑文件,如图8-9所示:
图8-9 改变提供者的选项卡
可以看到在UDL文件中确实存有一个连接字符串。
要使用数据链接文件,仅需要在打开连接时指定这个数据链接文件:
conPubs.Open "File Name=C:\wrox\pubs.udl"
6. ODBC数据源
ODBC数据源(通常称谓数据源名称,即DSN)可以通过Administrative菜单的Data Source选项进行设置。在以前版本的Windows中把它作为控制面板中的一个小程序。为了在ASP页面中访问DSN,必须确定该DSN已经被设置为系统DSN。这只需在Data Source Administrator中选择System DSN选项卡,然后选择Add按钮,如图8-10所示:
图8-10 选择数据源的界面
然后,就可以选择希望使用的ODBC驱动程序,并填入适当的ODBC参数。
一旦建立了DSN,可以使用连接字符串的“DSN=”属性。例如:
conPubs.Open "DSN=pubs"
8.3.2 使用包含文件
使用包含文件连接字符串的包含文件提供了一个中心区域来存储许多ASP页面需要的连接细节。要这样做,仅仅需要创建一个新的ASP文件,不妨称为Connection.asp,并在其中加入下面的代码:
<%
strConn = "Provider=SQLOLEDB; Data Source=WATCHER; " & _
"Initial Catalog=pubs; User Id=davids; Password=whisky"
%>
在ASP页面中,现在可以在该页的顶端加入这一行:
<!-- #INCLUDE FILE="Connection.asp" -->
这样不必再为每个ASP页面都输入连接细节,同时方便于更改整个站点都使用的连接。
包含文件也是放置METADATA标签的好地方。