Übersicht über den Microsoft OLE DB Simple Provider
Der Microsoft OLE DB Simple Provider (OSP) ermöglicht ActiveX Data Objects (ADO) den Zugriff auf beliebige Daten, für die mithilfe des OLE DB Simple Provider (OSP)-Toolkits ein Anbieter geschrieben wurde. Einfache Anbieter greifen auf Datenquellen zu, die nur grundlegende OLE DB-Unterstützung erfordern, z. B. speicherinterne Arrays oder XML-Dokumente.
Parameter der Verbindungszeichenfolge
Zum Herstellen einer Verbindung mit der OLE DB Simple Provider-DLL legen Sie das Provider-Argument für die ConnectionString-Eigenschaft auf den folgenden Wert fest:
MSDAOSP
Dieser Wert kann auch mithilfe der Provider-Eigenschaft festgelegt oder gelesen werden.
Sie können eine Verbindung mit einfachen Anbietern herstellen, die als vollständige OLE DB-Anbieter registriert wurden, indem Sie den registrierten Anbieternamen verwenden, der vom Anbieterwriter festgelegt wurde.
Typische Verbindungszeichenfolge
Eine typische Verbindungszeichenfolge für diesen Anbieter sieht wie folgt aus:
"Provider=MSDAOSP;Data Source=serverName"
Die Zeichenfolge enthält folgende Schlüsselwörter:
Schlüsselwort | Beschreibung |
---|---|
Anbieter | Gibt den OLE DB-Anbieter für SQL Server an. |
Data Source | Gibt den Namen eines Servers an. |
Beispiel für ein XML-Dokument
Der OLE DB Simple Provider in MDAC 2.7 oder höher und Windows Data Access Components (Windows DAC) wurde erweitert, um das Öffnen hierarchischer ADO-Recordsets über beliebige XML-Dateien zu unterstützen. Diese XML-Dateien können das ADO-XML-Persistenzschema enthalten, dies ist jedoch nicht erforderlich. Die Funktion wurde durch Verbinden des OSP mit MSXML2.DLL implementiert. Daher ist MSXML2.DLL oder höher erforderlich.
Die im folgenden Beispiel verwendete Datei portfolio.xml enthält diese Struktur:
Portfolio
Stock
Shares
Symbol
Price
Info
Company Name
WebSite
Das XML-Data Source-Objekt (DSO) verwendet integrierte Heuristik, um die Knoten in einer XML-Struktur in Kapitel in einem hierarchischen Recordset zu konvertieren.
Mithilfe dieser integrierten Heuristik wird die XML-Struktur in ein hierarchisches Recordset mit zwei Ebenen im folgenden Format konvertiert:
Parent Recordset
Shares, Symbol, Price, $Text
Child Recordset
Company Name, WebSite, $Text
Beachten Sie, dass die Portfolio- und Info-Tags im hierarchischen Recordset nicht dargestellt werden. Im folgenden Abschnitt zu den Regeln wird erläutert, wie das XML-DSO XML-Strukturen in hierarchische Recordsets konvertiert. Die Spalte „$Text“ wird im folgenden Abschnitt erläutert.
Regeln für die Zuweisung von XML-Elementen und -Attributen zu Spalten und Zeilen
Das XML-DSO folgt einer bestimmten Prozedur, um Spalten und Zeilen in datengebundenen Anwendungen Elemente und Attribute zuzuweisen. XML wird als Struktur mit einem Tag modelliert, das die gesamte Hierarchie enthält. Beispielsweise könnte die XML-Beschreibung eines Buchs Kapiteltags, Abbildungstags und Abschnittstags enthalten. Die höchste Ebene wäre das Buchtag, das die Unterelemente Kapitel, Abbildung und Abschnitt enthält. Wenn das XML-DSO Zeilen und Spalten XML-Elemente zuordnet, werden die Unterelemente konvertiert – nicht das Element der obersten Ebene.
Das XML-DSO verwendet die folgende Prozedur zum Konvertieren der Unterelemente:
Jedes Unterelement und Attribut entspricht einer Spalte in einem Recordset in der Hierarchie.
Der Name der Spalte ist mit dem Namen des Unterelements oder Attributs identisch, es sei denn, das übergeordnete Element verfügt über ein Attribut und ein Unterelement mit demselben Namen. In diesem Fall wird dem Spaltennamen des Unterelements ein Ausrufezeichen (!) vorangestellt.
Jede Spalte ist entweder eine einfache Spalte, die Skalarwerte (normalerweise Zeichenfolgen) enthält, oder eine Recordset-Spalte, die untergeordnete Recordsets enthält.
Spalten, die Attributen entsprechen, sind immer einfach.
Spalten, die Unterelementen entsprechen, sind Recordset-Spalten, wenn entweder das Unterelement über eigene Unterelemente und/oder Attribute verfügt oder das übergeordnete Element des Unterelements über mehr als eine Instanz des Unterelements als untergeordnetes Element verfügt. Andernfalls ist die Spalte einfach.
Wenn mehrere Instanzen eines Unterelements (unter verschiedenen übergeordneten Elementen) vorhanden sind, ist die zugehörige Spalte eine Recordset-Spalte, sofern eine der Instanzen eine Recordset-Spalte impliziert. Die zugehörige Spalte ist nur einfach, wenn alle Instanzen eine einfache Spalte implizieren.
Alle Recordsets verfügen über eine zusätzliche Spalte namens „$Text“.
Im Folgenden sehen Sie den erforderlichen Code zum Erstellen eines Recordsets:
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
Hinweis
Der Pfad der Datendatei kann mit vier verschiedenen Namenskonventionen angegeben werden.
'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
Sobald das Recordset geöffnet wurde, können die üblichen ADO-Recordset-Navigationsbefehle verwendet werden.
Für Recordsets, die vom OSP generiert wurden, gelten einige Einschränkungen:
Clientcursor (adUseClient) werden nicht unterstützt.
Hierarchische Recordsets, die über beliebige XML erstellt wurden, können nicht mithilfe von Recordset.Save persistiert werden.
Recordsets, die mit dem OSP erstellt wurden, sind schreibgeschützt.
Das XML-DSO fügt jedem Recordset in der Hierarchie eine zusätzliche Datenspalte ($Text) hinzu.
Weitere Informationen zum OLE DB Simple Provider finden Sie unter Erstellen eines einfachen Anbieters.
Codebeispiel
Der folgende Visual Basic-Code veranschaulicht das Öffnen einer beliebigen XML-Datei, das Erstellen eines hierarchischen Recordsets und das rekursive Schreiben der einzelnen Datensätze jedes Recordsets in das Debugfenster.
Im Folgenden sehen Sie eine einfache XML-Datei, die Aktienkurse enthält. Der folgende Code verwendet diese Datei, um ein hierarchisches Recordset mit zwei Ebenen zu erstellen.
<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>
Nachfolgend sind zwei Visual Basic-Unterprozeduren aufgeführt. Die erste Unterprozedur erstellt das Recordset und übergibt es an die WalkHier-Unterprozedur, die die Hierarchie rekursiv durchläuft und jedes Feld in den einzelnen Datensätzen in jedem Recordset in das Debugfenster schreibt.
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