设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3644|回复: 5
打印 上一主题 下一主题

[ADO/DAO] XML 与 ADO Recordset 译文

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2013-9-28 11:29:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何从 XML 中获取 ADO 记录集(How To Obtain an ADO Recordset from XML)
朱亦文译 (2013-09-28)
原文地址:
http://support.microsoft.com/kb/263247/en-us
http://support.microsoft.com/kb/263247/zh-cn?spid=683&sid=273

概要
如果有一个 XML 字符串或文档,通过使用集成在 Microsoft ADO 2.5 Stream 对象中新的 ADO XML 功能,可以用它来打开一个 ActiveX 数据对象(ADO)的记录集。
本文介绍在 ADO 2.5 记录集中载入以下数据所需的机制:
  • 包含 XML 的字符串。
  • XML DOM 文档实例。

注:提供的 XML 数据要是 ADO 记录集可以接受的格式。


使用下面的代码,以 XML 字符串为数据打开一个记录集:
(请确保项目中引用了 Microsoft ActiveX Data Access Components 2.5 Library,以便可以使用 ADO)

示例代码:
  1. Public Function RecordsetFromXMLString(sXML As String) As Recordset
  2.     Dim oStream As ADODB.Stream
  3.     Set oStream = New ADODB.Stream
  4.     oStream.Open
  5.     oStream.WriteText sXML   '将 XML 字符串定入 ADO Stream
  6.     oStream.Position = 0    '设置流的开始位置

  7.     Dim oRecordset As ADODB.Recordset
  8.     Set oRecordset = New ADODB.Recordset
  9.     oRecordset.Open oStream    '以流打开一个 Recordset

  10.     oStream.Close
  11.     Set oStream = Nothing

  12.     Set RecordsetFromXMLString = oRecordset  'Return the recordset

  13.     Set oRecordset = Nothing
  14. End Function
复制代码
请注意,上面的字符串参数 sXML 要是正确的 XML 字符串。

下面的代码,以 DOM 对象为记录集的来源。注:Stream 对象则不是必需的


示例代码:
  1. Public Function RecordsetFromXMLDocument(XMLDOMDocument As DOMDocument) As Recordset
  2.     Dim oRecordset As ADODB.Recordset
  3.     Set oRecordset = New ADODB.Recordset
  4.       
  5.     oRecordset.Open XMLDOMDocument '通过 DOM Document 实例作为数据源参数

  6.     Set RecordsetFromXMLDocument = oRecordset  '返回该 recordset

  7.     Set oRecordset = Nothing
  8. End Function
复制代码
按以上任一方法打开记录集后,可以将记录集用作任何其他已断开连接的记录集。
请注意,当前的位置、AbsolutePage 和其他导航属性不会存储在 XML 文档中。因此,新打开的记录集总是定位在第一行。

来自群组: ACC应用开发心得交流

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享 分享淘帖2 订阅订阅

点击这里给我发消息

2#
 楼主| 发表于 2013-9-28 11:30:21 | 只看该作者
如何使用 XML OLE DB 简单提供程序访问分层 XML 数据
(How To Access Hierarchical XML Data with the XML OLE DB Simple Provider)
朱亦文译(2013-09-28)
原谅地址:
http://support.microsoft.com/kb/271772/en-us
http://support.microsoft.com/kb/271772/zh-cn?spid=683&sid=273

概要
OLE DB 简单提供程序的 XML (XML OSP) 可以用于加载一个在 XML 文档中的分层数据到一个只读的 ADO 记录集中,可以使用 ADO Recordset 对象的标准方法来读取或访问这些数据。XML OSP 提供了一种处理 XML 文档中所包含的数据的不同的方法。

本文章分步指导来创建 Visual Basic 6.0 示例演示如何使用 XML OSP 访问 XML 文档中包含的分层数据。
1. 用Microsoft 记事本创建一个空文件。将以下 XML 复制并粘贴到文件中并将其保存为 portfolio.xml:
  1. <portfolio>
  2.     <stock>
  3.         <symbol>MSFT</symbol>
  4.         <price>$66.00</price>
  5.         <info>
  6.             <companyname>Microsoft Corporation</companyname>
  7.             <website><a href="http://www.microsoft.com" target="_blank">http://www.microsoft.com</a></website>
  8.         </info>
  9.     </stock>
  10.     <stock>
  11.         <symbol>AAPL</symbol>
  12.         <price>$110.00</price>
  13.         <info>
  14.             <companyname>Apple Computer, Inc.</companyname>
  15.             <website><a href="http://www.apple.com" target="_blank">http://www.apple.com</a></website>
  16.         </info>
  17.     </stock>
  18.     <stock>
  19.         <symbol>DELL</symbol>
  20.         <price>$50.00</price>
  21.         <info>
  22.             <companyname>Dell Corporation</companyname>
  23.             <website><a href="http://www.dell.com" target="_blank">http://www.dell.com</a></website>
  24.         </info>
  25.     </stock>
  26.     <stock>
  27.         <symbol>INTC</symbol>
  28.         <price>$136.00</price>
  29.         <info>
  30.             <companyname>Intel Corporation</companyname>
  31.             <website><a href="http://www.intel.com" target="_blank">http://www.intel.com</a></website>
  32.         </info>
  33.     </stock>
  34. </portfolio>
复制代码
2. 在 Visual Basic 中打开一个标准 EXE 项目。默认情况下,将创建 Form1。
3. 在项目添加 Microsoft ActiveX Data Objects 2.6 library 引用。
4. 向 Form1 中添加一个命令按钮 Command1。
5. 复制和粘贴以下代码到窗体模块中,在 adoRS.Open 语句中指定 portfolio.xml 的路径:
  1. Private Sub Command1_Click()
  2.     Dim adoRS As ADODB.Recordset
  3.     Set adoRS = New ADODB.Recordset
  4.    
  5.     ' Set up the Connection
  6.     adoRS.ActiveConnection = "Provider=MSDAOSP; Data Source=MSXML2.DSOControl.2.6;"
  7.    
  8.     ' Open the XML source
  9.     adoRS.Open "<path to portfolio.xml>"
  10.     On Error GoTo RecError
  11.     printtbl adoRS, 0
  12.    
  13.     GoTo Bye
  14.    
  15. RecError:
  16.     Debug.Print Err.Number & ": " & Err.Description
  17.     If adoRS.State = adStateOpen Then
  18.         For Each Col In adoRS.Fields
  19.             Debug.Print Col.Name & ": " & Col.Status  '  Error Status
  20.         Next Col
  21.     End If
  22.    
  23. Bye:
  24.     If adoRS.State = adStateOpen Then
  25.         adoRS.Close
  26.     End If
  27.     Set adoRS = Nothing
  28. End Sub

  29. ' Function to recursively retrieve the data
  30. Sub printtbl(rs, indent)
  31.     On Error Resume Next
  32.    
  33.     Dim rsChild As ADODB.Recordset
  34.     Dim Col As ADODB.Field
  35.    
  36.     While rs.EOF <> True
  37.         For Each Col In rs.Fields
  38.         If Col.Name <> "$Text" Then   ' $Text to be ignored
  39.             If Col.Type <> adChapter Then
  40.                 ' Output the non-chaptered column
  41.                 Debug.Print Space(indent) & Col.Name & ": " & Col.Value,
  42.             Else
  43.                 Debug.Print
  44.                 ' Retrieve the Child recordset
  45.                 Set rsChild = Col.Value
  46.                 rsChild.MoveFirst
  47.                 If Err Then MsgBox Error
  48.                 printtbl rsChild, indent + 4
  49.                 rsChild.Close
  50.                 Set rsChild = Nothing
  51.             End If
  52.         End If
  53.         Next
  54.         Debug.Print
  55.         rs.MoveNext
  56.     Wend
  57.    
  58. End Sub
复制代码
6. 保存该项目并运行。单击 Form1 上的命令按钮,运行 Visual Basic ActiveX Data Object (ADO) 代码使用 XML OSP  加载 portfolio.xml 中的数据到 ADO 记录集对象。该代码然后调用 printtbl 子过程,并将已加载的 ADO 记录集作为输入参数传递给该过程。printtbl 子过程中的代码循环遍历记录集,并在调试窗口(立即窗口)中打印其内容。如果在 Visual Basic 集成的开发环境 (IDE) 中调试窗口(立即窗口)不可见,按 CTRL G 键可打开调试窗口(立即窗口)。
3#
发表于 2013-9-28 12:00:42 | 只看该作者
用Linq to XML会简单很多

点击这里给我发消息

4#
 楼主| 发表于 2013-9-28 12:02:36 | 只看该作者
todaynew 发表于 2013-9-28 12:00
用Linq to XML会简单很多

用.Net,当然好。但前提是使用 VBA。

点击这里给我发消息

5#
发表于 2013-9-28 14:38:59 | 只看该作者
顶一下,谢谢分享!!

点击这里给我发消息

6#
发表于 2013-9-28 23:55:46 | 只看该作者
学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 04:25 , Processed in 0.094641 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表