Compartir a través de


Introducción al proveedor simple de Microsoft OLE DB

El proveedor simple de Microsoft OLE DB (OSP) permite a ADO tener acceso a los datos para los que se ha escrito un proveedor mediante el kit de herramientas del proveedor simple de OLE DB (OSP). Los proveedores simples están diseñados para acceder a orígenes de datos que solo requieren compatibilidad fundamental con OLE DB, como matrices en memoria o documentos XML.

Parámetros de la cadena de conexión

Para conectarse al archivo DLL de proveedor simple de OLE DB, establezca el argumento Provider en la propiedad ConnectionString en:

MSDAOSP

Este valor también se puede establecer o leer mediante la propiedad Provider.

Puede conectarse a proveedores simples que se han registrado como proveedores OLE DB completos mediante el nombre del proveedor registrado, determinado por el escritor del proveedor.

Cadena de conexión típica

Una cadena de conexión típica para este proveedor es:

"Provider=MSDAOSP;Data Source=serverName"

La cadena consta de estas palabras clave:

Palabra clave Descripción
Proveedor Especifica el proveedor OLE DB para SQL Server.
Data Source (Origen de datos) Especifica el nombre de un servidor.

Ejemplo de documento XML

El proveedor simple de OLE DB (OSP) en MDAC 2.7 o posterior y componentes de Windows Data Access (DAC de Windows) se ha mejorado para admitir la apertura de Recordsets de ADO jerárquicos en archivos XML arbitrarios. Estos archivos XML pueden contener el esquema de persistencia XML de ADO, pero no es necesario. Esto se ha implementado conectando el OSP al MSXML2.DLL; por lo tanto , se requiereMSXML2.DLL o posterior.

El archivo portfolio.xml usado en el ejemplo siguiente contiene el árbol siguiente:

Portfolio
   Stock
      Shares
      Symbol
      Price
      Info
         Company Name
         WebSite

El DSO XML usa heurística integrada para convertir los nodos de un árbol XML en capítulos de un objeto Recordset jerárquico.

Con estas heurística integradas, el árbol XML se convierte en un objeto Recordset jerárquico de dos niveles con el formato siguiente:

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

Tenga en cuenta que las etiquetas Portfolio e Info no se representan en el objeto Recordset jerárquico. Para obtener una explicación de cómo el DSO XML convierte árboles XML en conjuntos de registros jerárquicos, consulte las reglas siguientes. La columna $Text se describe en la sección siguiente.

Reglas para asignar elementos y atributos XML a columnas y filas

El DSO XML sigue un procedimiento para asignar elementos y atributos a columnas y filas en aplicaciones enlazadas a datos. XML se modela como un árbol con una etiqueta que contiene toda la jerarquía. Por ejemplo, una descripción XML de un libro podría contener etiquetas de capítulo, etiquetas de figura y etiquetas de sección. En el nivel más alto sería la etiqueta de libro, que contiene el capítulo, la figura y la sección de subelementos. Cuando el DSO XML asigna elementos XML a filas y columnas, se convierten los subelementos, no el elemento de nivel superior.

El DSO XML usa este procedimiento para convertir los subelementos:

  • Cada subelemento y atributo corresponde a una columna de algún Recordset de la jerarquía.

  • El nombre de la columna es el mismo que el nombre del subelemento o atributo, a menos que el elemento primario tenga un atributo y un subelemento con el mismo nombre, en cuyo caso se antepone un "!" al nombre de columna del subelemento.

  • Cada columna es una columna simple que contiene valores escalares (normalmente cadenas) o una columna Recordset que contiene conjuntos de registros secundarios.

  • Las columnas correspondientes a los atributos siempre son sencillas.

  • Las columnas correspondientes a los subelementos son columnas Recordset si el subelemento tiene sus propios subelementos o atributos (o ambos), o el elemento primario del subelemento tiene más de una instancia del subelemento como elemento secundario. De lo contrario, la columna es simple.

  • Cuando hay varias instancias de un subelemento (en distintos elementos primarios), su columna es una columna Recordset si alguna de las instancias implica una columna Recordset; su columna solo es simple si todas las instancias implican una columna simple.

  • Todos los conjuntos de registros tienen una columna adicional denominada $Text.

El código necesario para construir un Recordset es el siguiente:

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

Nota

La ruta de acceso del archivo de datos se puede especificar mediante cuatro convenciones 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

Tan pronto como se haya abierto el Recordset, se pueden usar los comandos de navegación habituales del conjunto de registros de ADO.

Los conjuntos de registros generados por el OSP tienen algunas limitaciones:

  • No se admiten cursores de cliente (adUseClient).

  • Los conjuntos de registros jerárquicos creados sobre XML arbitrarios no se pueden conservar mediante Recordset.Save.

  • Los conjuntos de registros creados con el OSP son de solo lectura.

  • XmlDSO agrega una columna adicional de Datos ($Text) a cada Recordset de la jerarquía.

Para obtener más información sobre el proveedor simple OLE DB, vea Building a Simple Provider.

Ejemplo de código

El siguiente código de Visual Basic muestra cómo abrir un archivo XML arbitrario, construir un Recordset jerárquico y escribir de forma recursiva cada registro de cada Recordset en la ventana de depuración.

Este es un archivo XML simple que contiene cotizaciones bursátiles. El código siguiente usa este archivo para construir un objeto Recordset jerárquico de dos niveles.

<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 continuación se muestran dos subprocesos de Visual Basic. El primero crea el objeto Recordset y lo pasa al subproceso WalkHier, que recorre de forma recursiva la jerarquía, escribiendo cada campo en cada registro de cada objeto Recordset en la ventana de depuración.

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