Microsoft OLE DB 简单提供程序概述
Microsoft OLE DB 简单提供程序 (OSP) 让 ADO 可以访问已使用 OLE DB 简单提供程序 (OSP) 工具包为其编写了提供程序的任何数据。 简单提供程序用于访问仅需要基本 OLE DB 支持的数据源,例如内存中数组或 XML 文档。
连接字符串参数
若要连接到 OLE DB 简单提供程序 DLL,请将 ConnectionString 属性的 Provider 参数设置为:
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 Recordset。 这些 XML 文件可能会包含 ADO XML 持久性架构,但它不是必需的。 这已通过将 OSP 连接到 MSXML2.DLL 来实现;因此,MSXML2.DLL 或更高版本是必需的。
以下示例中使用的 portfolio.xml 文件包含以下树:
Portfolio
Stock
Shares
Symbol
Price
Info
Company Name
WebSite
XML DSO 使用内置的启发式方法将 XML 树中的节点转换为分层 Recordset 中的段。
使用这些内置的启发式方法,XML 树将转换为以下形式的两级分层 Recordset:
Parent Recordset
Shares, Symbol, Price, $Text
Child Recordset
Company Name, WebSite, $Text
请注意,分层 Recordset 中未表示 Portfolio 和 Info 标记。 有关 XML DSO 如何将 XML 树转换为分层 Recordset 的说明,请参阅以下规则。 以下部分讨论了 $Text 列。
将 XML 元素和特性分配给列和行的规则
XML DSO 遵循一个用于向数据绑定应用程序中的列和行分配元素和特性的过程。 XML 将建模为一棵树,其中一个标记包含整个层次结构。 例如,书籍的 XML 说明可以包含 chapter 标记、figure 标记和 section 标记。 最高级别的是 book 标记,其中包含子元素 chapter、figure 和 section。 当 XML DSO 将 XML 元素映射到行和列时,将会转换子元素,而不是顶级元素。
XML DSO 使用以下过程转换子元素:
每个子元素和特性都对应于层次结构内某个 Recordset 中的一个列。
列的名称与子元素或特性的名称相同,除非父元素具有同名的特性和子元素,在这种情况下,一个“!”将追加到子元素的列名前。
每个列要么是包含标量值(通常是字符串)的简单列,要么是包含子 Recordset 的 Recordset 列。
与特性对应的列始终是简单列。
如果子元素有自己的子元素或特性(或两者都有),或者子元素的父级将该子元素的多个实例作为其一个子级,则对应于子元素的列是 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 生成的 Recordset 存在一些限制:
不支持客户端游标 (adUseClient)。
使用 Recordset.Save 无法持久保存通过任意 XML 创建的分层 Recordset。
使用 OSP 创建的 Recordset 是只读的。
XMLDSO 向层次结构中的每个 Recordset 添加额外的一列数据 ($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 内的每个记录中的每个 Field 写入调试窗口。
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