Microsoft OLE DB Simple Provider (OSP) 可讓 ADO 存取使用 OLE DB Simple Provider (OSP) Toolkit撰寫提供者的任何數據。 簡單提供者的目的是要存取只需要基本 OLE DB 支援的數據源,例如記憶體內部數位或 XML 檔。
連接字串參數
若要連線到 OLE DB Simple Provider DLL,請將 Provider 自變數設定為 ConnectionString 属性:
MSDAOSP
您也可以使用 Provider 屬性來設定或讀取此值。
您可以使用提供者編寫者決定的註冊提供者名稱,連接到已被註冊為完整 OLE DB 提供者的簡單提供者。
一般連接字串
此提供者的典型連接字串為:
"Provider=MSDAOSP;Data Source=serverName"
字串包含下列關鍵字:
關鍵詞 | 描述 |
---|---|
提供者 | 指定 SQL Server 的 OLE DB 提供者。 |
數據源 | 指定伺服器的名稱。 |
XML 檔範例
MDAC 2.7 或更新版本中的 OLE DB 簡單提供者 (OSP) 和 Windows 資料存取元件 (Windows DAC) 已增強,可支援透過任意 XML 檔案開啟階層式 ADO Recordsets。 這些 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
請注意,Portfolio 和 Info 卷標不會以階層式 Recordset表示。 如需 XML DSO 如何將 XML 樹狀結構轉換成階層式 Recordets的說明,請參閱下列規則。 下一節將討論$Text欄。
將 XML 元素和屬性指派給資料行和資料列的規則
XML DSO 遵循程序,將元素和屬性指派給資料綁定應用程式中的資料行和資料列。 XML 被建模為由一個標籤構成的樹狀結構,該標籤包含整個階層。 例如,書籍的 XML 描述可以包含章節標籤、圖卷標和區段標籤。 最上層是書籍標籤,其中包含子元素章節、圖形和區段。 當 XML DSO 將 XML 元素對應至資料列和數據行時,會轉換子元素,而不是最上層元素。
XML DSO 會使用此程式來轉換子元素:
每個子元素和屬性都會對應至階層中某些 Recordset 中的數據行。
欄位名稱通常與子元素或屬性的名稱相同,除非父元素具有一個屬性和一個同名的子元素,在這種情況下,會在子元素的欄位名稱前加上"!".
每一個數據列都是 簡單 數據列,其中包含純量值(通常是字串),或是包含子 Recordsets的 Recordset 數據列。
對應屬性的列一律很簡單。
對應至子元素的數據行 如果子元素有自己的子元素或屬性(或兩者),或是子元素的父系具有子元素的一個以上的子元素實例做為子系,則 recordset 數據行。 否則,欄很簡單。
當子元素有多個實例(在不同的父系下),如果實例的任何 表示 Recordset 數據行,則其數據行是 Recordset 數據行;只有當 所有 實例都表示簡單數據行時,其數據行才簡單。
所有 Recordets 都有名為 $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 建立的 階層式 Recordset。
使用 OSP 建立的記錄集 是唯讀的。
XMLDSO 會將另一個 Data 資料行 ($Text) 新增至 Hierarchy 中每個 Recordset。
如需 OLE DB Simple Provider 的詳細資訊,請參閱 建置簡單提供者。
程式代碼範例
下列 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 子程式,該程序會以遞歸方式遍歷層次結構,將每個 記錄集 中的每個紀錄的每個 欄位 輸出到偵錯視窗中。
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