Microsoft OLE DB 简单提供程序概述

Microsoft OLE DB 简单提供程序(OSP)允许 ADO 访问任何由使用 OLE DB 简单提供程序工具包开发的提供程序所写的数据。 简单提供程序旨在访问仅需要基本 OLE DB 支持的数据源,例如内存中数组或 XML 文档。

连接字符串参数

若要连接到 OLE DB 简单提供程序 DLL,请将 Provider 参数设置为 ConnectionString 属性:

MSDAOSP

也可以使用 Provider 属性设置或读取此值。

可以使用由提供程序编写者确定的注册提供程序名称,连接到注册为完整 OLE DB 提供程序的简单提供程序。

典型连接字符串

此提供程序的典型连接字符串是:

"Provider=MSDAOSP;Data Source=serverName"

字符串由以下关键字组成:

关键词 描述
提供者 指定 SQL Server 的 OLE DB 提供程序。
数据源 指定服务器的名称。

XML 文档示例

MDAC 2.7 或更高版本和 Windows 数据访问组件(Windows DAC)中的 OLE DB 简单提供程序(OSP)已得到增强,支持通过任意 XML 文件 打开分层 ADO 记录集。 这些 XML 文件可能包含 ADO XML 持久性架构,但不是必需的。 这已通过将 OSP 连接到 MSXML2.DLL来实现;因此,需要 MSXML2.DLL 或更高版本。

以下示例中使用的 portfolio.xml 文件包含以下树:

Portfolio
   Stock
      Shares
      Symbol
      Price
      Info
         Company Name
         WebSite

XML DSO 使用内置启发法将 XML 树中的节点转换为分层 Recordset中的章节。

使用这些内置启发式方法,XML 树将转换为以下形式的双级分层 记录集

Parent Recordset
Shares, Symbol, Price, $Text
   Child Recordset
      Company Name, WebSite, $Text

请注意,投资组合和信息标记未在分层 Recordset中表示。 有关 XML DSO 如何将 XML 树转换为分层 记录集的说明,请参阅以下规则。 以下部分将讨论$Text列。

将 XML 元素和属性分配给列和行的规则

XML DSO 遵循将元素和属性分配给数据绑定应用程序中的列和行的过程。 XML 被建模为一种树结构,其中一个标记作为整个层次结构的根节点。 例如,书籍的 XML 说明可以包含章节标记、图标记和节标记。 在最高级别是书标签,其中包含子元素章节、图和节。 当 XML DSO 将 XML 元素映射到行和列时,将转换子元素,而不是顶级元素。

XML DSO 使用此过程转换子元素:

  • 每个子元素和属性对应于层次结构中某些 Recordset 中的列。

  • 列的名称与子元素或属性的名称相同,除非父元素具有属性和具有相同名称的子元素,在这种情况下,子元素的列名称前面为“!” 。

  • 每列都是一个 简单 列,其中包含标量值(通常是字符串),或者是包含子 记录集Recordset 列。

  • 与属性对应的列始终简单。

  • 如果子元素有自己的子元素或属性(或两者),或者子元素的父级有多个子元素实例,那么对应于这些子元素的列为 Recordset 列。 否则,这个列很简单。

  • 如果子元素的多个实例(在不同的父级下),则其列是 记录集 列(如果 实例的任何 表示 Recordset 列);仅当 所有 实例表示简单列时,其列才简单。

  • 所有 记录集 都有一个名为 $Text 的附加列。

构造 Recordset 所需的代码如下所示:

Dim adoConn as ADODB.Connection
Dim adoRS as ADODB.Recordset

Set adoRS = New ADODB.Connection
Set adoRS = New ADODB.Recordset

adoConn.Open "Provider=MSDAOSP; Data Source=MSXML2.DSOControl.2.6;"
adoRS.Open "https://WebServer/VRoot/portfolio.xml, adoConn

注意

可以使用四种不同的命名约定来指定数据文件的路径。

'HTTP://
adoRS.Open "https://WebServer/VRoot/portfolio.xml", adoConn
'FILE://
adoRS.Open "file:/// C:\\Directory\\portfolio.xml", adoConn
'UNC Path
adoRS.Open "\\ComputerName\ShareName\portfolio.xml", adoConn
'Full DOS Path
adoRS.Open "C:\Directory\portfolio.xml", adoConn

一旦打开了 Recordset,就可以使用常用的 ADO Recordset 导航命令。

OSP 生成的记录集 存在一些限制:

  • 不支持客户端游标(adUseClient)。

  • 使用 Recordset.Save不能保存通过任意 XML 创建的分层 记录集

  • 使用 OSP 创建的 记录集 是只读的。

  • XMLDSO 向层次结构中的每个 记录集 添加另一列数据($Text)。

有关 OLE DB 简单提供程序的详细信息,请参阅 生成简单提供程序

代码示例

以下 Visual Basic 代码演示如何打开任意 XML 文件,构造分层 Recordset,并以递归方式将每个 Recordset 的每个记录 写入调试窗口。

下面是一个简单的 XML 文件,其中包含股票报价。 以下代码使用此文件构造两级分层 Recordset

<portfolio>
   <stock>
      <shares>100</shares>
      <symbol>MSFT</symbol>
      <price>$70.00</price>
      <info>
         <companyname>Microsoft Corporation</companyname>
         <website>https://www.microsoft.com</website>
      </info>
   </stock>
   <stock>
      <shares>100</shares>
      <symbol>AAPL</symbol>
      <price>$107.00</price>
      <info>
         <companyname>Apple Computer, Inc.</companyname>
         <website>https://www.apple.com</website>
      </info>
   </stock>
   <stock>
      <shares>100</shares>
      <symbol>DELL</symbol>
      <price>$50.00</price>
      <info>
         <companyname>Dell Corporation</companyname>
         <website>https://www.dell.com</website>
      </info>
    </stock>
    <stock>
       <shares>100</shares>
       <symbol>INTC</symbol>
       <price>$115.00</price>
       <info>
          <companyname>Intel Corporation</companyname>
          <website>https://www.intel.com</website>
       </info>
   </stock>
</portfolio>

下面是两个 Visual Basic 子过程。 第一个创建 Recordset,并将其传递给 WalkHier 子过程,后者递归地遍历层次结构,将每个 Recordset 中的每条记录的每个 字段 写入调试窗口。

Private Sub BrowseHierRecordset()
' Add ADO 2.7 or later to Project/References
' No need to add MSXML2, ADO just passes the ProgID through to the OSP.

    Dim adoConn As ADODB.Connection
    Dim adoRS As ADODB.Recordset
    Dim adoChildRS As ADODB.Recordset

    Set adoConn = New ADODB.Connection
    Set adoRS = New ADODB.Recordset
    Set adoChildRS = ADODB.Recordset

    adoConn.Open "Provider=MSDAOSP; Data Source=MSXML2.DSOControl.2.6;"
    adoRS.Open "https://bwillett3/Kowalski/portfolio.xml", adoConn

    Dim iLevel As Integer
    iLevel = 0
    WalkHier iLevel, adoRS

End Sub

Sub WalkHier(ByVal iLevel As Integer, ByVal adoRS As ADODB.Recordset)
    iLevel = iLevel + 1
    PriorLevel = iLevel
    While Not adoRS.EOF
        For ndx = 0 To adoRS.Fields.Count - 1
            If adoRS.Fields(ndx).Name <> "$Text" Then
                If adoRS.Fields(ndx).Type = adChapter Then
                    Set adoChildRS = adoRS.Fields(ndx).Value
                    WalkHier iLevel, adoChildRS
                Else
                    Debug.Print iLevel & ": adoRS.Fields(" & ndx & _
                       ") = " & adoRS.Fields(ndx).Name & " = " & _
                       adoRS.Fields(ndx).Value
                End If
            End If
        Next ndx
        adoRS.MoveNext
    Wend
    iLevel = PriorLevel
End Sub