Microsoft OLE DB Simple Provider 概觀
Microsoft OLE DB Simple Provider (OSP) 可讓 ADO 存取提供者使用 OLE DB Simple Provider (OSP) Toolkit 撰寫的任何資料。 簡單提供者旨在存取僅需基本 OLE DB 支援的資料來源,例如記憶體內部陣列或 XML 文件。
連接字串參數
若要連線至 OLE DB Simple Provider DLL,請將 ConnectionString 屬性的 Provider 引數設定為:
MSDAOSP
您也可以使用 Provider 屬性來設定或讀取此值。
您可使用提供者寫入者的已註冊提供者名稱,連線至已註冊作為完全 OLE DB 提供者的簡單提供者。
一般連接字串
此提供者的一般連接字串為:
"Provider=MSDAOSP;Data Source=serverName"
字串包含下列關鍵字:
關鍵字 | 描述 |
---|---|
提供者 | 指定適用於 SQL Server 的 OLE DB 提供者。 |
資料來源 | 指定伺服器的名稱。 |
XML 文件範例
已增強 MDAC 2.7 或更新版本中的 OLE DB Simple Provider (OSP) 和 Windows Data Access Components (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
請注意,組合和資訊標籤不會以階層式 Recordset 表示。 如需 XML DSO 如何將 XML 樹狀結構轉換成階層式 Recordsets 的說明,請參閱下列規則。 下節將討論 $Text 資料行。
將 XML 元素和屬性指派給資料行和資料列的規則
XML DSO 遵循程序,將元素和屬性指派給資料繫結應用程式中的資料行和資料列。 XML 會模型化成具有一個標籤的樹狀結構,其標籤包含整個階層。 例如,書籍的 XML 說明可包含章節標籤、圖標籤和節標籤。 在最高層級會是書籍標籤,其中包含子元素章節、圖和節。 當 XML DSO 將 XML 元素對應至資料列或資料行時,將轉換子元素,而非最高層級元素。
XML DSO 會使用此程序來轉換子元素:
每個子元素和屬性都會對應至階層中某些 Recordset 的資料行。
資料行的名稱與子元素或屬性的名稱相同,除非父元素具有相同名稱的屬性或子元素,在此情況下,會在子元素的資料行名稱前面加上 "!"。
每個資料行都是包含純量值 (通常為字串) 的簡單資料行,或包含子系 Recordsets 的 Recordset 資料行。
對應至屬性的資料行一律為簡單。
如果子元素有個別子元素或屬性 (或兩者) 或子元素的父系有多個作為子系的子元素執行個體,則對應至子元素的資料行為 Recordset 資料行。 否則,資料行為簡單。
當子元素有多個執行個體 (在不同父系下) 時,如果任何執行個體代表 Recordset 資料行,則其資料行為 Recordset 資料行;如果所有執行個體代表簡單資料行,其資料行為簡單。
所有 Recordsets 皆有名為 $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 產生的 Recordsets 有一些限制:
不支援用戶端資料指標(adUseClient)。
無法使用 Recordset.Save 保存透過任意 XML 建立的階層式 Recordsets。
使用 OSP 建立的 Recordsets 為唯讀。
XMLDSO 會將其他資料行 ($Text) 新增至階層中的每個 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 子程序,這會以遞迴方式向下查核階層、將每個 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