Panoramica del provider Microsoft OLE DB semplice

Il provider Microsoft OLE DB semplice (OSP) consente ad ADO di accedere a tutti i dati per cui è stato scritto un provider usando il Toolkit del provider OLE DB semplice (OSP). I provider semplici sono destinati ad accedere alle origini dati che richiedono solo il supporto OLE DB fondamentale, ad esempio matrici in memoria o documenti XML.

Parametri della stringa di connessione

Per connettersi alla DLL del provider OLE DB semplice, impostare l'argomento Provider della proprietà ConnectionString come segue:

MSDAOSP

È possibile impostare o leggere questo valore anche usando la proprietà Provider.

È possibile connettersi a provider semplici registrati come provider OLE DB completi usando il nome del provider registrato, determinato dal writer del provider.

Stringa di connessione tipica

Una stringa di connessione tipica per questo provider è:

"Provider=MSDAOSP;Data Source=serverName"

La stringa è costituita da queste parole chiave:

Parola chiave Descrizione
Provider Specifica il provider OLE DB per SQL Server.
Origine dati Specifica il nome di un server.

Esempio di documento XML

Il provider OLE DB semplice (OSP) in MDAC 2.7 o versioni successive e Windows Data Access Components (Windows DAC) è stato migliorato per supportare l'apertura di Recordset ADO gerarchici su file XML arbitrari. Questi file XML possono contenere lo schema di persistenza XML ADO, ma non è obbligatorio. Questa operazione è stata implementata connettendo OSP a MSXML2.DLL; pertanto è necessario MSXML2.DLL o versioni successive.

Il file portfolio.xml usato nell'esempio seguente contiene l'albero seguente:

Portfolio
   Stock
      Shares
      Symbol
      Price
      Info
         Company Name
         WebSite

Il DSO XML usa l'euristica predefinita per convertire i nodi in un albero XML in capitoli in un Recordset gerarchico.

Usando questa euristica predefinita, l'albero XML viene convertito in un Recordset gerarchico a due livelli del modulo seguente:

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

Si noti che i tag Portfolio e Info non sono rappresentati nel Recordset gerarchico. Per una spiegazione del modo in cui il DSO XML converte gli alberi XML in Recordset gerarchici, vedere le regole seguenti. La colonna $Text è illustrata nella sezione seguente.

Regole per l'assegnazione di elementi e attributi XML a colonne e righe

Il DSO XML segue una routine per l'assegnazione di elementi e attributi a colonne e righe nelle applicazioni associate ai dati. XML viene modellato come albero con un tag contenente l'intera gerarchia. Ad esempio, una descrizione XML di un libro può contenere tag di capitolo, tag di figura e tag di sezione. Al livello più alto si troverebbe il tag libro, contenente i sottoelementi capitolo, figura e sezione. Quando l'oggetto DSO XML esegue il mapping degli elementi XML a righe e colonne, i sottoelementi, non l'elemento di primo livello, vengono convertiti.

Il DSO XML usa questa routine per convertire i sottoelementi:

  • Ogni sottoelemento e attributo corrisponde a una colonna in alcuni Recordset nella gerarchia.

  • Il nome della colonna è lo stesso del nome del sottoelemento o dell'attributo, a meno che l'elemento padre non abbia un attributo e un sottoelemento con lo stesso nome, nel qual caso un simbolo "!" viene anteposto al nome della colonna del sottoelemento.

  • Ogni colonna è una colonna semplice che contiene valori scalari (in genere stringhe) o una colonna Recordset che contiene elementi figlio Recordset.

  • Le colonne corrispondenti agli attributi sono sempre semplici.

  • Le colonne corrispondenti ai sottoelementi sono colonne Recordset se il sottoelemento ha i propri sottoelementi o attributi (o entrambi) o l'elemento padre del sottoelemento ha più di un'istanza del sottoelemento come elemento figlio. Negli altri casi la colonna è semplice.

  • Quando sono presenti più istanze di un sottoelemento (in elementi padre diversi), la colonna è di tipo Recordset se una delle istanze implica una colonna Recordset. La colonna è semplice solo se tutte le istanze implicano una colonna semplice.

  • Tutti i Recordset hanno una colonna aggiuntiva denominata $Text.

Il codice necessario per costruire un oggetto Recordset è il seguente:

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

Il percorso del file di dati può essere specificato usando quattro convenzioni di denominazione diverse.

'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

Non appena è stato aperto l'oggetto Recordset, è possibile usare i consueti comandi di spostamento del Recordset ADO.

I Recordset generati dall'OSP presentano alcune limitazioni:

  • I cursori client (adUseClient) non sono supportati.

  • I Recordset gerarchici creati su XML arbitrario non possono essere memorizzati in modo permanente usando Recordset.Save.

  • I Recordset creati con OSP sono di sola lettura.

  • XMLDSO aggiunge una aggiuntiva di dati ($Text) a ogni oggetto Recordset nella gerarchia.

Per altre informazioni sul provider semplice OLE DB, vedere Creazione di un provider semplice.

Esempio di codice

Il codice Visual Basic seguente illustra l'apertura di un file XML arbitrario, la creazione di un Recordset gerarchico e la scrittura ricorsiva di ogni Recordset nella finestra di debug.

Ecco un file XML semplice che contiene i prezzi di magazzino. Il codice seguente usa questo file per costruire un Recordset gerarchico a due livelli.

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

Di seguito sono riportate due sotto procedure di Visual Basic. La prima crea l'oggetto Recordset e lo passa alla routine secondaria WalkHier, che descrive in modo ricorsivo la gerarchia, scrivendo ogni Campo di ogni record in ciascun Recordset nella finestra di debug.

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