Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 3618|回復(fù): 5
打印 上一主題 下一主題

[ADO/DAO] XML 與 ADO Recordset 譯文

[復(fù)制鏈接]

點(diǎn)擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2013-9-28 11:29:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
如何從 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

概要
如果有一個(gè) XML 字符串或文檔,通過(guò)使用集成在 Microsoft ADO 2.5 Stream 對(duì)象中新的 ADO XML 功能,可以用它來(lái)打開一個(gè) ActiveX 數(shù)據(jù)對(duì)象(ADO)的記錄集。
本文介紹在 ADO 2.5 記錄集中載入以下數(shù)據(jù)所需的機(jī)制:
  • 包含 XML 的字符串。
  • XML DOM 文檔實(shí)例。

注:提供的 XML 數(shù)據(jù)要是 ADO 記錄集可以接受的格式。


使用下面的代碼,以 XML 字符串為數(shù)據(jù)打開一個(gè)記錄集:
(請(qǐng)確保項(xiàng)目中引用了 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    '設(shè)置流的開始位置

  7.     Dim oRecordset As ADODB.Recordset
  8.     Set oRecordset = New ADODB.Recordset
  9.     oRecordset.Open oStream    '以流打開一個(gè) Recordset

  10.     oStream.Close
  11.     Set oStream = Nothing

  12.     Set RecordsetFromXMLString = oRecordset  'Return the recordset

  13.     Set oRecordset = Nothing
  14. End Function
復(fù)制代碼
請(qǐng)注意,上面的字符串參數(shù) sXML 要是正確的 XML 字符串。

下面的代碼,以 DOM 對(duì)象為記錄集的來(lái)源。注:Stream 對(duì)象則不是必需的


示例代碼:
  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 '通過(guò) DOM Document 實(shí)例作為數(shù)據(jù)源參數(shù)

  6.     Set RecordsetFromXMLDocument = oRecordset  '返回該 recordset

  7.     Set oRecordset = Nothing
  8. End Function
復(fù)制代碼
按以上任一方法打開記錄集后,可以將記錄集用作任何其他已斷開連接的記錄集。
請(qǐng)注意,當(dāng)前的位置、AbsolutePage 和其他導(dǎo)航屬性不會(huì)存儲(chǔ)在 XML 文檔中。因此,新打開的記錄集總是定位在第一行。

來(lái)自群組: ACC應(yīng)用開發(fā)心得交流

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享分享 分享淘帖2 訂閱訂閱

點(diǎn)擊這里給我發(fā)消息

2#
 樓主| 發(fā)表于 2013-9-28 11:30:21 | 只看該作者
如何使用 XML OLE DB 簡(jiǎn)單提供程序訪問(wèn)分層 XML 數(shù)據(jù)
(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 簡(jiǎn)單提供程序的 XML (XML OSP) 可以用于加載一個(gè)在 XML 文檔中的分層數(shù)據(jù)到一個(gè)只讀的 ADO 記錄集中,可以使用 ADO Recordset 對(duì)象的標(biāo)準(zhǔn)方法來(lái)讀取或訪問(wèn)這些數(shù)據(jù)。XML OSP 提供了一種處理 XML 文檔中所包含的數(shù)據(jù)的不同的方法。

本文章分步指導(dǎo)來(lái)創(chuàng)建 Visual Basic 6.0 示例演示如何使用 XML OSP 訪問(wèn) XML 文檔中包含的分層數(shù)據(jù)。
1. 用Microsoft 記事本創(chuàng)建一個(gè)空文件。將以下 XML 復(fù)制并粘貼到文件中并將其保存為 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>
復(fù)制代碼
2. 在 Visual Basic 中打開一個(gè)標(biāo)準(zhǔn) EXE 項(xiàng)目。默認(rèn)情況下,將創(chuàng)建 Form1。
3. 在項(xiàng)目添加 Microsoft ActiveX Data Objects 2.6 library 引用。
4. 向 Form1 中添加一個(gè)命令按鈕 Command1。
5. 復(fù)制和粘貼以下代碼到窗體模塊中,在 adoRS.Open 語(yǔ)句中指定 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
復(fù)制代碼
6. 保存該項(xiàng)目并運(yùn)行。單擊 Form1 上的命令按鈕,運(yùn)行 Visual Basic ActiveX Data Object (ADO) 代碼使用 XML OSP  加載 portfolio.xml 中的數(shù)據(jù)到 ADO 記錄集對(duì)象。該代碼然后調(diào)用 printtbl 子過(guò)程,并將已加載的 ADO 記錄集作為輸入?yún)?shù)傳遞給該過(guò)程。printtbl 子過(guò)程中的代碼循環(huán)遍歷記錄集,并在調(diào)試窗口(立即窗口)中打印其內(nèi)容。如果在 Visual Basic 集成的開發(fā)環(huán)境 (IDE) 中調(diào)試窗口(立即窗口)不可見,按 CTRL G 鍵可打開調(diào)試窗口(立即窗口)。
3#
發(fā)表于 2013-9-28 12:00:42 | 只看該作者
用Linq to XML會(huì)簡(jiǎn)單很多

點(diǎn)擊這里給我發(fā)消息

4#
 樓主| 發(fā)表于 2013-9-28 12:02:36 | 只看該作者
todaynew 發(fā)表于 2013-9-28 12:00
用Linq to XML會(huì)簡(jiǎn)單很多

用.Net,當(dāng)然好。但前提是使用 VBA。

點(diǎn)擊這里給我發(fā)消息

5#
發(fā)表于 2013-9-28 14:38:59 | 只看該作者
頂一下,謝謝分享。

點(diǎn)擊這里給我發(fā)消息

6#
發(fā)表于 2013-9-28 23:55:46 | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2024-10-23 10:19 , Processed in 0.106271 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表