Compartir vía


Visión general del Proveedor Simple de Microsoft OLE DB

El proveedor simple de Microsoft OLE DB (OSP) permite a ADO acceder a cualquier dato para el que se haya escrito un proveedor utilizando el Toolkit de OLE DB Simple Provider (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 cadena de conexión

Para conectarse a la DLL del 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 Proveedor de.

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

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 de Especifica el proveedor OLE DB para SQL Server.
Fuente 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 los componentes de acceso a datos de Windows (Windows DAC) se ha mejorado para admitir la apertura de conjuntos de registros jerárquicos de ADO 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 a la MSXML2.DLL; por lo tanto, se requiere MSXML2.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 utiliza heurísticas integradas para convertir los nodos de un árbol XML en capítulos de un conjunto de registros jerárquico .

Con estas heurística integradas, el árbol XML se convierte en un recordset jerárquico de dos niveles de la forma siguiente:

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

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

Reglas para asignar atributos y elementos 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 estaría la etiqueta del libro, que contiene los subelementos capítulo, figura y sección. 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 en 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 la columna del subelemento.

  • Cada columna es una columna simple que contiene valores escalares (normalmente cadenas) o una columna de conjunto de registros 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 si el elemento primario del subelemento tiene más de una instancia del subelemento como elemento secundario. De lo contrario, la columna es sencilla.

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

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

El código necesario para construir un recordset de 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 habituales de navegación ADO Recordset.

Recordsets generados por el OSP tienen algunas limitaciones:

  • No se admiten cursores de cliente (adUseClient).

  • Los conjuntos de registros jerárquicos creados a través de XML arbitrario no pueden ser guardados mediante Recordset.Save.

  • Conjuntos de registros creados con el OSP son de solo lectura.

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

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

Ejemplo de código

En el siguiente código de Visual Basic se muestra cómo abrir un archivo XML arbitrario, construir un recordset jerárquicoy escribir de forma recursiva cada registro de cada recordset en la ventana de depuración.

Este es un archivo XML simple que contiene cotizaciones de acciones. El código siguiente usa este archivo para construir un conjunto de registros 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 Recordset y lo pasa al subproceso WalkHier , que recorre de forma recursiva la jerarquía, escribiendo cada Campo en cada registro de cada 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