Обзор простого поставщика Microsoft OLE DB

Microsoft OLE DB Simple Provider (OSP) позволяет ADO получать доступ к любым данным, для которых поставщик был написан с помощью набора средств простого поставщика OLE DB (OSP). Простые поставщики предназначены для доступа к источникам данных, которым требуется только базовая поддержка OLE DB, например массивы в памяти или XML-документы.

Параметры строки соединения

Чтобы подключиться к библиотеке DLL простого поставщика OLE DB, задайте для аргумента Provider значение свойства ConnectionString :

MSDAOSP

Это значение также можно задать или считывать с помощью свойства Provider .

Вы можете подключиться к простым поставщикам, зарегистрированным в качестве полных поставщиков OLE DB, с помощью имени зарегистрированного поставщика, определенного модулем записи поставщика.

Типичная строка подключения

Типичная строка подключения для этого поставщика:

"Provider=MSDAOSP;Data Source=serverName"

Строка состоит из следующих ключевых слов:

Ключевое слово Описание
Поставщик Указывает поставщик OLE DB для SQL Server.
Источник данных Указывает имя сервера.

Пример XML-документа

Простой поставщик OLE DB (OSP) в MDAC 2.7 или более поздней версии и компоненты доступа к данным Windows (Windows DAC) были улучшены для поддержки открытия иерархических наборов записей ADO в произвольных XML-файлах. Эти XML-файлы могут содержать схему сохраняемости ADO XML, но это необязательно. Это было реализовано путем подключения OSP к MSXML2.DLL; поэтому требуется MSXML2.DLL или более поздней версии.

Файл portfolio.xml , используемый в следующем примере, содержит следующее дерево:

Portfolio
   Stock
      Shares
      Symbol
      Price
      Info
         Company Name
         WebSite

Xml DSO использует встроенные эвристические методы для преобразования узлов в xml-дереве в главы иерархического набора записей.

Используя эти встроенные эвристики, XML-дерево преобразуется в двухуровневый иерархический набор записей следующей формы:

Parent Recordset
Shares, Symbol, Price, $Text
   Child Recordset
      Company Name, WebSite, $Text

Обратите внимание, что теги Portfolio и Info не представлены в иерархическом наборе записей. Описание того, как XML DSO преобразует XML-деревья в иерархические наборы записей, см. в следующих правилах. Столбец $Text рассматривается в следующем разделе.

Правила назначения XML-элементов и атрибутов столбцам и строкам

XML DSO следует процедуре назначения элементов и атрибутов столбцам и строкам в приложениях с привязкой к данным. XML моделировается как дерево с одним тегом, содержащим всю иерархию. Например, XML-описание книги может содержать теги глав, тегов рисунков и разделов. На самом высоком уровне будет тег книги, содержащий подэлементы глава, рисунок и раздел. Когда XML DSO сопоставляет XML-элементы со строками и столбцами, преобразуются подэлементы, а не элемент верхнего уровня.

Xml DSO использует следующую процедуру для преобразования подэлементов:

  • Каждый вложенный элемент и атрибут соответствует столбцу в некоторой иерархии Recordset .

  • Имя столбца совпадает с именем подэлемента или атрибута, если родительский элемент не имеет атрибута и подэлемента с тем же именем. В этом случае к имени столбца подэлемента добавляется "!".

  • Каждый столбец представляет собой простой столбец, содержащий скалярные значения (обычно строки), или столбец Recordset , содержащий дочерние наборы записей.

  • Столбцы, соответствующие атрибутам, всегда просты.

  • Столбцы, соответствующие вложенным элементам, являются столбцами Recordset , если подэлемент имеет собственные подэлементы или атрибуты (или и то, и другое), или родительский элемент подэлемента имеет более одного экземпляра в качестве дочернего элемента. В противном случае столбец прост.

  • Если имеется несколько экземпляров подэлемента (в разных родительских элементах), его столбец является столбцом Recordset , если любой из экземпляров подразумевает столбец Recordset ; Его столбец является простым, только если все экземпляры подразумевают простой столбец.

  • Все наборы записей имеют дополнительный столбец с именем $Text.

Код, необходимый для создания набора записей , выглядит следующим образом:

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

Как только набор записей будет открыт, можно использовать обычные команды навигации ADO Recordset .

Наборы записей , созданные OSP, имеют несколько ограничений.

  • Клиентские курсоры (adUseClient) не поддерживаются.

  • Иерархические наборы записей, созданные в произвольном ФОРМАТЕ XML, невозможно сохранить с помощью Recordset.Save.

  • Наборы записей , созданные с помощью OSP, доступны только для чтения.

  • XMLDSO добавляет дополнительный столбец Data ($Text) к каждому набору записей в иерархии.

Дополнительные сведения о простом поставщике OLE DB см. в разделе Создание простого поставщика.

Пример кода

Следующий код Visual Basic демонстрирует открытие произвольного XML-файла, создание иерархического набора записей и рекурсивную запись каждой записи каждого набора записей в окно отладки.

Ниже приведен простой XML-файл, содержащий котировки акций. В следующем коде этот файл используется для создания двухуровневого иерархического набора записей.

<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. Первый создает набор записей и передает его вложенной процедуре 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