现在,ADO 提供一种简单的方式来访问数据源(如关系数据库)中的信息。但是,大量的信息不是以数据库表形式存在,而是以电子邮件系统中的邮件和现代文件系统中的文件形式存在。Record 和 Stream 对象为访问存储在非关系数据库的其他源中的信息提供了方便。
Record 对象可以表示和管理数据,例如文件系统中的目录和文件以及电子邮件系统中的文件夹和邮件。Record 还可以表示 Recordset 中的行,虽然 Record 和 Recordset 对象具有不同的方法和属性。
Stream 对象提供了一种方式,用于读、写和管理组成文件或邮件的字节的二进制流。
统一资源定位符 (URL) 可以作为连接字符串和命令文本的替换方式,用于指定数据源以及文件和目录的位置。它还可以同现有的 Connection 和 Recordset 对象以及 Record 和 Stream 对象配合使用。
几种增强的 ADO 对象可以与 Record 和 Stream 对象结合使用。
Fields 集合的 Append 方法创建 Field 对象并将其添加到集合中,它还可以指定 Field 的值。
Update 方法完成集合中字段的添加或删除。
作为 Append 方法的快捷方式和替换方式,您只需简单地把一个值赋给取消定义或以前删除的字段便可创建字段。 (为了更好地进行讨论,在后面的使用中,术语“目录”也表示文件夹,而术语“文件”也表示邮件。)
记录和提供者提供的字段
打开 Record 对象时,它的源可以是打开的 Recordset 的当前行、绝对 URL 或者是与打开的 Connection 对象连接的相对 URL。
如果 Record 是从 Recordset 打开的,那么 Record 对象的 Fields 集合将包含 Recordset 的所有字段,再加上所有由基本提供者添加的字段。
提供者可以插入其他用来补充 Record 特性的字段。其结果是,Record 具有唯一的字段,这些字段都不在 Recordset 中,也不在由 Recordset 的另一行派生的任何 Record 中。
例如,从电子邮件数据源派生的 Recordset 的所有行都具有 From、To 和 Subject 等列。从该 Recordset 派生出来的 Record 将具有与其相同的字段。但是,Record 还可能具有其他由该 Record 表示的特定邮件的唯一字段,例如 Attachment 和 Cc(抄送)。
尽管 Record 对象和 Recordset 的当前行具有相同的字段,但它们是有区别的,因为 Record 和 Recordset 对象具有不同的方法和属性。
Record 和 Recordset 共有的字段在两个对象上都可以修改。但是,不能在 Record 对象上删除字段,尽管基本提供者可能支持将字段设置为 Null。
打开 Record 以后,可以通过编程来添加字段。也可以删除刚添加的字段,但是不能删除原 Recordset 的字段。
Record 对象还可以直接从 URL 打开。在这种情况下,添加到 Record 的字段取决于基本提供者。现在,大多数提供者都添加了一组字段,用于描述由 Record 表示的项目。如果该项目包含字节流(如简单文件),通常可以从 Record 打开 Stream 对象。
用于文档源提供者的特殊字段
一类称为“文档源提供者”的特殊提供者,用于管理文件夹和文档。当 Record 对象表示文档或者 Recordset 对象表示文档的文件夹时,文档源提供者使用唯一一组描述文档特性(而不是实际文档)的字段来预置这些对象。通常,一个字段包含对表示文档的 Stream 的引用。
这些字段组成资源记录或记录集,并且在通过 ADO 使用提供者中按支持这些字段的特定提供者分类列出。
有两个常量用于为资源 Record 或 Recordset 的 Fields 集合建立索引,以检索一对常用字段。Field 对象的 Value 属性返回需要的内容。
- 通过 adDefaultStream 常量访问的字段包含与 Record 或 Recordset 对象相关联的默认流。提供者将默认流分配给对象。
- 通过 adRecordURL 常量访问的对象包含标识文档的绝对 URL。
文档源提供者不支持 Record 和 Field 对象的 Properties 集合。这些对象的 Properies 集合的内容为空。
文档源提供者可以添加提供者特有的属性(如 Datasource Type)来标识它是否为文档源提供者。有关如何确定提供者类型的详细信息,请参阅提供者的文档。
资源记录集列
“资源记录集”包含下面的列:
| 列名 | 类型 | 说明 |
| RESOURCE_PARSENAME
|
adVarWChar
|
只读。指示资源的 URL。 |
| RESOURCE_PARENTNAME
|
adVarWChar
|
只读。指示父记录的绝对 URL。 |
| RESOURCE_ABSOLUTEPARSENAME
|
adVarWChar
|
只读。指示资源的绝对 URL,它是 PARENTNAME 和 PARSENAME 的连接。 |
| RESOURCE_ISHIDDEN
|
adBoolean
|
如果隐藏资源,则为 True。除了创建行集合的命令显式选择 RESOURCE_ISHIDDEN 为 TRUE 的行以外,将不返回行。 |
| RESOURCE_ISREADONLY
|
adBoolean
|
如果资源是只读的,则为 True。试图通过 DBBINDFLAG_WRITE 打开此资源,并且通过 DB_E_READONLY 打开将会失败。即使以只读模式打开资源,仍然可以编辑此属性。 |
| RESOURCE_CONTENTTYPE
|
adVarWChar
|
指示文档的 MIME 类型,用于指示格式(如“text/html”)。 |
| RESOURCE_CONTENTCLASS
|
adVarWChar
|
指示文档的可能用法,例如律师的摘要。这可以与用来创建文档的 Office 模板相对应。 |
| RESOURCE_CONTENTLANGUAGE
|
adVarWChar
|
指示用于存储内容的语言。 |
| RESOURCE_CREATIONTIME
|
adFileTime
|
只读。指示 FILETIME 结构,它包含资源的创建时间。以 Coordinated Universal Time (UTC) 格式报告时间。 |
| RESOURCE_LASTACCESSTIME
|
adFileTime
|
只读。指示 FILETIME 结构,它包含最后一次访问资源的时间。时间采用 UTC 格式。如果提供者不支持这个时间成员,FILETIME 成员为零。 |
| RESOURCE_LASTWRITETIME
|
adFileTime
|
只读。指示 FILETIME 结构,它包含最后一次写入资源的时间。时间采用 UTC 格式。如果提供者不支持这个时间成员,FILETIME 成员为零。 |
| RESOURCE_STREAMSIZE
|
asUnsignedBigInt
|
只读。指示资源的默认流的字节数。 |
| RESOURCE_ISCOLLECTION
|
adBoolean
|
只读。如果资源是一个集合(如目录),则为 True。如果资源是简单文件,则为 False。 |
| RESOURCE_ISSTRUCTUREDDOCUMENT
|
adBoolean
|
如果资源是结构化文档,则为 True。如果资源不是结构化文档,则为 False。它可以是集合或简单文件。 |
| DEFAULT_DOCUMENT
|
adVarWChar
|
只读。指示此资源包含 URL,该 URL 指向文件夹的默认简单文档或结构化文档。此属性在从资源请求默认流时使用。对于简单文件,此属性为 Null。 |
| CHAPTERED_CHILDREN
|
adChapter
|
只读。可选。指示行集合的子集,该行集合包含资源的子。(OLE DB Provider for Internet Publishing 不使用此列。) |
| RESOURCE_DISPLAYNAME
|
adVarWChar
|
只读。指示资源的显示名称。 |
| RESOURCE_ISROOT
|
adBoolean
|
只读。如果资源是集合或结构化文档的根,则为 True。 |
流
Stream 对象可以在下列目标上打开:
通过 URL 指定的简单文件。
包含 Stream 对象的 Record 或 Recordset 的字段。
表示目录或复合文件的 Record 或 Recordset 对象的默认流。
包含简单文件的 URL 的资源字段。
没有特定源。在这种情况下,将在内存中打开一个 Stream 对象,可以将数据写入其中,然后再保存到另一个 Stream 或文件中。
Recordset 中的 BLOB 字段。
流和持久性
Recordset 对象的 Save 方法将 Recordset 保存或者持久保留到文件中,而 Open 方法则从该文件中恢复 Recordset。
现在,Save 和 Open 方法也可以将 Recordset 持久保留到 Stream 对象中。此功能尤其有助于使用远程数据服务 (RDS) 和 Active Server Pages (ASP)。
有关如何在 ASP 页上自动使用持久性的详细信息,请参阅当前 ASP 的文档。
下列几种方案说明了如何使用 Stream 对象和持久性。
方案 1:
本方案先简单地将 Recordset 保存到一个文件中,再将其保存到 Stream。然后将持久保留的流打开到另一个 Recordset 中。
Dim rs1 As ADODB.Recordset Dim rs2 As ADODB.Recordset Dim stm As ADODB.Stream
rs1.Open "SELECT * FROM Authors", "DSN=Pubs;uid=sa;pwd=;", _ adopenStatic, adLockReadOnly, adCmdText rs1.Save "c:\myfolder\mysubfolder\myrs.xml", adPersistXML rs1.Save stm, adPersistXML rs2.Open stm
方案 2:
本方案以 XML 格式将 Recordset 持久保留到 Stream 中。然后将 Stream 读取到可以进行检查、操作或显示的字符串中。
Dim rs As New ADODB.Recordset Dim stm As New ADODB.Stream Dim strRst As String
' Open, save, and close the recordset. rs.Open "select * from Authors", "dsn=Pubs;uid=sa;pwd=;" rs.Save stm, adPersistXML rs.Close Set rs = nothing
' Put saved recordset into a string variable. strRst = stm.ReadText(adReadAll)
' Examine, manipulate, or display the XML data. ...
方案 3:
本范例代码显示了一段 ASP 代码,它将 Recordset 以 XML 格式直接持久保留到 Response 对象。
... <% response.ContentType = "text/xml"
' Create and open a recordset. Set rs = Server.CreateObject("ADODB.Recordset") rs.Open "select * from Authors", "dsn=Pubs;uid=sa;pwd=;"
' Save recordset directly into output stream. rs.Save Response, adPersistXML
' Close recordset rs.Close Set rs = nothing %> ...
方案 4:
在本方案中,ASP 代码将 Recordset 的内容以 ADTG 格式写入客户端。Cursor Service 可以用此数据创建断开连接的 Recordset。
RDS DataControl 的新属性 URL 指向生成 Recordset 的 .asp 页。这意味着获取 Recordset 对象不需要 RDS 使用服务器端 DataFactory 对象,也不需要用户编写业务对象。因此大大简化了 RDS 编程模型。
名为 http://server/directory/recordset.asp 的服务器端代码如下:
<% Dim rs Set rs = Server.CreateObject("ADODB.Recordset") rs.Open "select au_fname, au_lname, phone from Authors", "dsn=Pubs" response.ContentType = "multipart/mixed" rs.Save response, adPersistADTG %>
客户端代码:
<HTML> <HEAD> <TITLE>RDS Query Page</TITLE> </HEAD> <body> <CENTER> <H1>Remote Data Service 2.5</H1> <TABLE DATASRC="#DC1"> <TR> <TD><SPAN DATAFLD="au_fname"></SPAN></TD> <TD><SPAN DATAFLD="au_lname"></SPAN></TD> <TD><SPAN DATAFLD="phone"></SPAN></TD> </TR> </TABLE> <BR>
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=DC1 HEIGHT=1 WIDTH = 1> <PARAM NAME="URL" VALUE="http://server/directory/recordset.asp"> </OBJECT>
</SCRIPT> </BODY> </HTML>
开发人员还可以选择在客户端使用 Recordset 对象。
... function GetRs() { rs = CreateObject("ADODB.Recordset"); rs.Open "http://server/directory/recordset.asp" DC1.SourceRecordset = rs; } ...
将 ADO 与 OLE DB Provider for Internet Publishing 配合使用
可以将 ADO Record 和 Stream 对象与 Microsoft OLE DB Provider for Internet Publishing (Internet Publishing Provider) 配合使用来访问和操作资源,例如由 Microsoft FrontPage® 提供的 Web 文件夹或文件。用 ADO 可以将 Record、Stream 或 Recordset 的源指定为 URL。然后,您就可以上载、下载、移动、复制和删除资源,或者直接操作资源属性。
有关将 Records 和 Streams 与 Internet Publishing Provider 配合使用的范例代码,请参阅 Internet 发布方案。
Internet Publishing Provider 是和 Microsoft Windows 2000 一起安装的。Internet Publishing Provider 的早期版本也可以通过 Microsoft Office 2000 和 Microsoft Internet Explorer 5.0 获得。
有三种方法可以将 ADO 连接到 Internet Publishing Provider:
在连接字符串中指定“URL=”。例如: objConn.Open "URL=http://servername"
将连接字符串的 Provider 关键字指定为 MSDAIPP.DSO。例如: objConn.Open "provider=MSDAIPP.DSO;data source=http://servername"
将 Connection 对象的 Provider 属性指定为 MSDAIPP.DSO。例如: objConn.Provider = "MSDAIPP.DSO" objConn.Open "http://servername"
注意 如果 MSDAIPP.DSO 被显式指定为提供者的值(使用 Provider 连接字符串关键字或 Provider 属性),您将不能在连接字符串中使用“URL=”。否则,将会出现错误。但可以如上所示指定 URL。
|