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