Procedura: Recuperare metadati da Excel utilizzando il metodo GetOleDbSchemaTable in Visual Basic .NET

Traduzione articoli Traduzione articoli
Identificativo articolo: 318373 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene descritto come recuperare i metadati di tabelle e colonne da origini dati Microsoft Excel utilizzando il metodo GetOleDbSchemaTable con il Provider Microsoft OLE DB gestito e di Provider Microsoft OLE DB per Jet.

Il metodo GetOleDbSchemaTable viene esposta dalla classe System.Data.OleDb di Microsoft .NET Framework è il successore .NET il metodo OpenSchema nelle versioni precedenti di Microsoft ActiveX Data Objects (ADO).

Descrizione della tecnica

Dopo la connessione a un'origine dati di Excel mediante ADO.NET, estrarre un elenco di tabella metadati tramite GetOleDbSchemaTable e quindi utilizzare lo stesso metodo con argomenti diversi per ottenere i metadati della colonna della tabella selezionata. È inoltre possibile utilizzare un oggetto DataGridTableStyle per disporre e formattare i risultati della query in una griglia di dati.

Requisiti

Nell'elenco che segue vengono indicati l'hardware, il software, l'infrastruttura di rete e i service pack necessari:
  • In Visual Studio .NET installato su un compatibile con sistema operativo Microsoft Windows
  • Almeno un file cartella di lavoro (xls) di Microsoft Excel con alcune righe e colonne di dati
In questo articolo si presuppone la conoscenza di base almeno i seguenti argomenti:
  • Visual Basic .NET
  • Accesso ai dati ADO.NET
  • Cartelle di lavoro di Excel e i fogli di lavoro

Esempio

  1. Avviare Microsoft Visual Studio .NET e creare un nuovo progetto applicazione Windows di Visual Basic .NET.
  2. Aggiungere tre controlli Button e due controlli di DataGrid al form predefinito (Form1). Modificare la proprietà di testo i controlli Button per Recuperare metadati , la Formattazione elenco di tabelle e Formattazione elenco colonne rispettivamente.
  3. Passare al modulo del codice e aggiungere le seguenti istruzioni Imports nella parte superiore:
    Imports System.Data
    Imports System.Data.OleDb
    Imports System.ComponentModel
  4. Inserire le seguenti dichiarazioni a livello di modulo nella classe Form dopo la riga "Inherits System.Windows.Forms.Form". Modificare la stringa di connessione necessarie per fare riferimento a un file della cartella di lavoro di Excel che contiene alcune righe e colonne di dati.
        Dim cn As OleDbConnection
        Dim strCn As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=c:\test.xls;Extended Properties=Excel 8.0"
        Dim dtTables As DataTable
        Dim WithEvents cm As CurrencyManager
        Dim dtColumns As DataTable
        Dim dvColumns As DataView
  5. Inserire il codice seguente nella classe Form dopo la sezione "Codice generato da Progettazione Windows Form". Questo codice chiama GetOleDbSchemaTable per caricare gli elenchi di tabella e colonne, inserisce i controlli DataGrid e l'elenco di colonne viene aggiornato quando cambia la tabella selezionata.
        Private Sub Button1_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles Button1.Click
            Call GetTablesList()
        End Sub
    
        Private Sub GetTablesList()
            cn = New OleDbConnection(strCn)
            cn.Open()
            dtTables = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
            DataGrid1.DataSource = dtTables
            DataGrid1.ReadOnly = True
            cn.Close()
            Call GetColumnsList()
        End Sub
    
        Private Sub GetColumnsList()
            If cm Is Nothing Then
                cm = CType(Me.BindingContext(dtTables), CurrencyManager)
            End If
            Dim r As Integer = cm.Position
            Dim strTable As String = dtTables.Rows(r)("TABLE_NAME")
            cn = New OleDbConnection(strCn)
            cn.Open()
            dtColumns = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, _
                New Object() {Nothing, Nothing, strTable, Nothing})
            dvColumns = New DataView(dtColumns)
            dvColumns.Sort = "ORDINAL_POSITION"
            DataGrid2.DataSource = dvColumns
            DataGrid2.ReadOnly = True
            cn.Close()
        End Sub
    
        Private Sub cm_PositionChanged(ByVal sender As Object, _
                ByVal e As System.EventArgs) Handles cm.PositionChanged
            Call GetColumnsList()
        End Sub
  6. Inserire il codice riportato di seguito per disporre e formattare tabelle DataGrid utilizzando TableStyles . Si noti l'utilizzo di PropertyDescriptor per semplificare non predefinito formattazione di colonne di date.
        Private Sub Button2_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles Button2.Click
            Call FormatTablesGrid(dtTables)
        End Sub
    
        Private Sub FormatTablesGrid(ByVal dt2format As DataTable)
            Dim gs As DataGridTableStyle = New DataGridTableStyle()
            gs.MappingName = dt2format.TableName
    
            Dim cs As DataGridColumnStyle = New DataGridTextBoxColumn()
            With cs
                .MappingName = "TABLE_NAME"
                .HeaderText = "Table Name"
                .Width = 75
            End With
            gs.GridColumnStyles.Add(cs)
    
            cs = New DataGridTextBoxColumn()
            With cs
                .MappingName = "TABLE_TYPE"
                .HeaderText = "Table Type"
                .Width = 75
            End With
            gs.GridColumnStyles.Add(cs)
    
            Dim cm As CurrencyManager = CType(Me.BindingContext(dt2format), CurrencyManager)
            Dim pd As PropertyDescriptor = cm.GetItemProperties()("DATE_CREATED")
    
            cs = New DataGridTextBoxColumn(pd, "d")
            With cs
                .MappingName = "DATE_CREATED"
                .HeaderText = "Date Created"
                .Width = 75
            End With
            gs.GridColumnStyles.Add(cs)
    
            cm = CType(Me.BindingContext(dt2format), CurrencyManager)
            pd = cm.GetItemProperties()("DATE_MODIFIED")
    
            cs = New DataGridTextBoxColumn(pd, "d")
            With cs
                .MappingName = "DATE_MODIFIED"
                .HeaderText = "Date Modified"
                .Width = 75
            End With
            gs.GridColumnStyles.Add(cs)
    
            DataGrid1.TableStyles.Add(gs)
            Me.Button2.Enabled = False
    
        End Sub
  7. Inserire il codice riportato di seguito per disporre e formattare le colonne DataGrid utilizzando TableStyle :
        Private Sub Button3_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles Button3.Click
            Call FormatColumnsGrid(dtColumns)
        End Sub
    
        Private Sub FormatColumnsGrid(ByVal dt2format As DataTable)
            Dim gs As DataGridTableStyle = New DataGridTableStyle()
            gs.MappingName = dtColumns.TableName
    
            Dim cs As DataGridColumnStyle = New DataGridTextBoxColumn()
            With cs
                .MappingName = "COLUMN_NAME"
                .HeaderText = "Column Name"
                .Width = 100
            End With
            gs.GridColumnStyles.Add(cs)
    
            cs = New DataGridTextBoxColumn()
            With cs
                .MappingName = "ORDINAL_POSITION"
                .HeaderText = "Ordinal Position"
                .Width = 100
            End With
            gs.GridColumnStyles.Add(cs)
    
            cs = New DataGridTextBoxColumn()
            With cs
                .MappingName = "DATA_TYPE"
                .HeaderText = "Data Type"
                .Width = 75
            End With
            gs.GridColumnStyles.Add(cs)
    
            cs = New DataGridTextBoxColumn()
            With cs
                .MappingName = "CHARACTER_MAXIMUM_LENGTH"
                .HeaderText = "Text Length"
                .Width = 75
            End With
            gs.GridColumnStyles.Add(cs)
    
            cs = New DataGridTextBoxColumn()
            With cs
                .MappingName = "NUMERIC_PRECISION"
                .HeaderText = "Numeric Precision"
                .Width = 75
            End With
            gs.GridColumnStyles.Add(cs)
    
            DataGrid2.TableStyles.Add(gs)
            Me.Button3.Enabled = False
    
        End Sub
  8. Eseguire il progetto.
  9. Fare clic su Recuperare metadati per riempire l'elenco di tabelle (DataGrid1) con tutte le colonne di informazioni che vengono restituite per ogni tabella nella cartella di lavoro di Excel da GetOleDbSchemaTable . L'elenco di colonne (DataGrid2) viene inserito nello stesso momento con tutte le colonne di informazioni che vengono restituite per le colonne della prima tabella nell'elenco tabelle .
  10. Selezionare una tabella diversa nell'elenco tabelle . Le modifiche della lista colonne per visualizzare le colonne della tabella selezionata a causa del gestore eventi cm_PositionChanged implementato.
  11. Fare clic su Formato lista di tabelle per definire e applicare un TableMappingStyle DataGrid1. In questo modo le intestazioni di colonna più "descrittivo" e si consente di visualizzare solo le quattro colonne dati utili dalle nove colonne restituiti da GetOleDbSchemaTable . Queste colonne vengono visualizzate:
    TABLE_NAME
    TABLE_TYPE
    DATE_CREATED
    DATE_MODIFIED
    Queste colonne di celle vuote non vengono visualizzate:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    DESCRIZIONE
    TABLE_PROPID
  12. Fare clic su Formattazione elenco di colonne per definire e applicare un TableMappingStyle DataGrid2. In questo modo le intestazioni di colonna più "descrittivo" e si visualizza solo il 5 utile colonne di dati dalle colonne restituite da GetOleDbSchemaTable 28.
    COLUMN_NAME
    ORDINAL_POSITION
    DATA_TYPE
    MAXIMUM_CHARACTER_LENGTH
    NUMERIC_PRECISION
    Queste colonne principalmente vuote non vengono visualizzate:
    TABLE_CATALOG
    TABLE_SCHEMA
    Table_name (già noto)
    COLUMN_GUID
    COLUMN_PROPID
    COLUMN_HASDEFAULT (sempre false)
    COLUMN_DEFAULT
    COLUMN_FLAGS
    IS_NULLABLE (sempre true)
    TYPE_GUID
    CHARACTER_OCTET_LENGTH
    NUMERIC_SCALE
    DATETIME_PRECISION
    CHARACTER_SET_CATALOG
    CHARACTER_SET_SCHEMA
    CHARACTER_SET_NAME
    COLLATION_CATALOG
    COLLATION_SCHEMA
    COLLATION_NAME
    DOMAIN_CATALOG
    DOMAIN_SCHEMA
    NOME_DOMINIO
    DESCRIZIONE
  13. Fare clic su una riga diversa DataGrid1 per selezionare una tabella diversa. Elenco colonne viene aggiornato automaticamente. Il TableStyles è stato applicato a ogni DataGrid rimangono valide.

Risoluzione dei problemi

  • I tipi di dati di colonne che vengono restituiti tramite GetOleDbSchemaTable per un'origine dati Excel non sono identici in tutti i casi ai tipi di dati restituiti dal metodo OpenSchema in ADO classico:
    Riduci questa tabellaEspandi questa tabella
    Tipo di colonnaADO classicoADO.NET (OLE DB)
    NumericoadDouble 5OleDbType.Double 5
    ValutaadCurrency 6OleDbType.Currency 6
    Data/oraadDate 7OleDbType.Date 7
    Valore booleanoadBoolean 11OleDbType.Boolean 11
    Testo < 255202 adVarWChar130 OleDbType.WChar
    Nota203 adLongVarWChar130 OleDbType.WChar
  • GetOleDbSchemaTable come OpenSchema restituisce una singola colonna "F1" un foglio di lavoro Excel vuoto, anche se in realtà non intestazioni di dati o di colonna sono presenti.

Riferimenti

Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
257819HOWTO: Utilizzo di ADO con dati di Excel da Visual Basic o VBA

Proprietà

Identificativo articolo: 318373 - Ultima modifica: mercoledì 3 settembre 2003 - Revisione: 2.1
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
Chiavi: 
kbmt kbhowtomaster kbprovider KB318373 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 318373
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com