Поделиться через


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

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

Параметры строки подключения

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

MSDAOSP

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

Вы можете подключиться к простым поставщикам, зарегистрированным как полноценные поставщики 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-дерева в главы иерархической Recordset.

Используя эти встроенные эвристики, дерево 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 c строками и столбцами с помощью DSO преобразуются вложенные элементы, а не элемент верхнего уровня.

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

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

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

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

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

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

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

  • Все наборы записей имеют дополнительный столбец с именем $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) не поддерживаются.

  • Иерархические наборы записей, созданные на основе произвольного XML, не могут сохраняться с помощью Recordset.Save.

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

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

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

Пример кода

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

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