Compartilhar via


Visão geral do Provedor Microsoft OLE DB Simples

O OSP (Provedor OLE DB Simples) da Microsoft permite que o ADO acesse todos os dados para os quais um provedor foi gravado usando o Kit de Ferramentas OSP (Provedor OLE DB Simples). Provedores simples destinam-se a acessar fontes de dados que exigem apenas suporte fundamental do OLE DB, como matrizes na memória ou documentos XML.

Parâmetros de cadeia de conexão

Para se conectar à DLL do Provedor OLE DB Simples, defina o argumento Provider para a propriedade ConnectionString como:

MSDAOSP

Esse valor também pode ser definido ou lido por meio da propriedade Provider.

Você pode se conectar a provedores simples que foram registrados como provedores OLE DB completos usando o nome do provedor registrado, determinado pelo gravador do provedor.

Cadeia de conexão típica

Uma cadeia de conexão típica para esse provedor é:

"Provider=MSDAOSP;Data Source=serverName"

A cadeia de caracteres consiste nestas palavras-chave:

Palavra-chave Descrição
Provedor Especifica o Provedor OLE DB para SQL Server.
Fonte de Dados Especifica o nome de um servidor.

Exemplo de documento XML

O OSP (Provedor OLE DB Simples) no MDAC 2.7 ou posterior e o Windows DAC (Windows Data Access Components) foram aprimorados para dar suporte à abertura de Recordsets ADO hierárquicos em arquivos XML arbitrários. Esses arquivos XML podem conter o esquema de persistência XML do ADO, mas não são obrigatórios. Isso foi implementado com a conexão do OSP ao MSXML2.DLL, ou seja, é necessário ,MSXML2.DLL ou posterior.

O arquivo portfolio.xml usado no exemplo a seguir contém a seguinte árvore:

Portfolio
   Stock
      Shares
      Symbol
      Price
      Info
         Company Name
         WebSite

O DSO XML usa heurística interna para converter os nós de uma árvore XML em capítulos em um Recordset hierárquico.

Usando essas heurísticas internas, a árvore XML é convertida em um Recordset hierárquico de dois níveis do seguinte formulário:

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

Observe que as marcas de Portfólio e Informações não são representadas no Recordset hierárquico. Para obter uma explicação de como o DSO XML converte árvores XML em Recordsets hierárquicos, confira as regras a seguir. A coluna $Text é discutida na seção a seguir.

Regras para atribuir elementos XML e atributos a colunas e linhas

O DSO XML segue um procedimento para atribuir elementos e atributos a colunas e linhas em aplicativos associados a dados. O XML é modelado como uma árvore com uma marca que contém toda a hierarquia. Por exemplo, uma descrição XML de um livro pode conter marcas de capítulo, marcas de figura e marcas de seção. No nível mais alto estaria a marca de livro, que contém os subelementos capítulo, figura e seção. Quando o DSO XML mapeia elementos XML para linhas e colunas, os subelementos, não o elemento de nível superior, são convertidos.

O DSO XML usa este procedimento para converter os subelementos:

  • Cada subelemento e atributo corresponde a uma coluna em algum Recordset na hierarquia.

  • O nome da coluna é o mesmo que o nome do subelemento ou atributo, a menos que o elemento pai tenha um atributo e um subelemento com o mesmo nome; nesse caso, um "!" é acrescentado ao início do nome da coluna do subelemento.

  • Cada coluna é uma coluna Simple que contém valores escalares (geralmente cadeias de caracteres) ou uma coluna Recordset que contém Recordsets filho.

  • As colunas correspondentes aos atributos são sempre simples.

  • As colunas correspondentes a subelementos são colunas Recordset se o subelemento tem seus próprios subelementos ou atributos (ou ambos) ou o pai do subelemento tem mais de uma instância do subelemento como filho. Caso contrário, a coluna é simples.

  • Quando há várias instâncias de um subelemento (em pais diferentes), sua coluna é uma coluna Recordset se alguma das instâncias implicar uma coluna Recordset; sua coluna é simples somente se todas as instâncias implicam uma coluna simples.

  • Todos os Recordsets têm uma coluna adicional chamada $Text.

O código necessário para construir um Recordset é o seguinte:

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

Observação

O caminho do arquivo de dados pode ser especificado usando quatro convenções de nomenclatura diferentes.

'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

Assim que o Recordset for aberto, os comandos de navegação usuais do Recordset ADO poderão ser usados.

Os Recordsets gerados pelo OSP têm algumas limitações:

  • Não há suporte a cursores de cliente (adUseClient).

  • Os Recordsets hierárquicos criados por XML arbitrário não podem ser persistidos usando Recordset.Save.

  • Os Recordsets criados com o OSP são somente leitura.

  • O XMLDSO adiciona mais uma coluna de dados ($Text) a cada Recordset na hierarquia.

Para obter mais informações sobre o Provedor OLE DB Simples, confira Criando um provedor simples.

Exemplo de código

O código do Visual Basic a seguir demonstra a abertura de um arquivo XML arbitrário, a construção de um Recordset hierárquico e a gravação recursiva de cada registro de cada Recordset na janela de depuração.

Aqui está um arquivo XML simples que contém cotações de ações. O código a seguir usa esse arquivo para construir um Recordset hierárquico de dois níveis.

<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>

A seguir estão dois subprocedimentos do Visual Basic. O primeiro cria o Recordset e o transmite ao subprocedimento WalkHier, que percorre recursivamente a hierarquia, gravando cada Field de cada registro em cada Recordset na janela de depuração.

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