Gewusst wie: Abrufen von Metadaten aus Excel anhand der GetOleDbSchemaTable-Methode in Visual Basic .NET

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 318373 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser schrittweise aufgebaute Artikel beschreibt das Abrufen von Tabellen- und Spaltennamen Metadaten aus Microsoft Excel-Datenquellen mithilfe der GetOleDbSchemaTable -Methode mit dem Microsoft OLE DB Managed Provider und Microsoft OLE DB-Provider für Jet.

Die GetOleDbSchemaTable -Methode, verfügbar gemacht wird, durch die System.Data.OleDb -Klasse von Microsoft .NET Framework ist der Nachfolger .NET die OpenSchema- Methode in früheren Versionen von Microsoft ActiveX Data Objects (ADO).

Beschreibung der Technik

Nachdem Sie mithilfe von ADO.NET eine Verbindung mit einer Excel-Datenquelle hergestellt, Sie eine Liste der Metadaten Tabelle mithilfe von GetOleDbSchemaTable extrahieren und verwenden dieselbe Methode mit verschiedenen Argumenten um Spaltenmetadaten für die ausgewählte Tabelle zu erhalten. Sie können auch ein DataGridTableStyle -Objekt verwenden, um Layout und die Abfrageergebnisse in einem Datenraster formatieren.

Voraussetzungen

In der folgenden Liste sind die empfohlene Hardware, Software, Netzwerkinfrastruktur und erforderlichen Service Packs aufgeführt:
  • Visual Studio .NET auf einem kompatiblen Betriebssystem Microsoft Windows installiert
  • Mindestens eine Microsoft Excel-Arbeitsmappe (.xls)-Datei mit einigen Zeilen und Spalten von Daten
In diesem Artikel werden vorausgesetzt mindestens grundlegende Kenntnisse in den folgenden Themen:
  • Visual Basic .NET
  • ADO.NET-Datenzugriff
  • Excel-Arbeitsmappen und Arbeitsblätter

Beispiel

  1. Starten Sie Microsoft Visual Studio .NET aus, und erstellen Sie ein neues Visual Basic .NET Windows-Anwendungsprojekt.
  2. Fügen Sie drei Button -Steuerelemente und zwei DataGrid -Steuerelemente in das das Standardformular (Form1). Ändern Sie die Text -Eigenschaft des Button -Steuerelemente bzw. Abrufen von Metadaten , Format Tabellenübers und Format Spalten List .
  3. Wechseln Sie zur Code-Modul des Formulars, und fügen Sie die folgenden Imports -Anweisungen oben:
    Imports System.Data
    Imports System.Data.OleDb
    Imports System.ComponentModel
  4. Legen Sie die folgenden Deklarationen auf Modulebene in der Form -Klasse nach der Zeile "Inherits System.Windows.Forms.Form". Passen Sie die Verbindungszeichenfolge wie erforderlich auf eine Excel-Arbeitsmappendatei, auf dem einige Zeilen und Spalten mit Daten enthält.
        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. Fügen Sie nach dem Bereich "Vom Windows Formulardesigner Generierter Code" folgenden Code in der Form -Klasse. Dieser Code ruft GetOleDbSchemaTable , die Tabelle und Spalten Listen zu laden, füllt die DataGrid -Steuerelementen und die Liste Spalten aktualisiert, wenn die ausgewählte Tabelle ändert.
        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. Fügen Sie den folgenden Code zum Layout und Formatieren von Tabellen, DataGrid mit Hilfe der TableStyles . Beachten Sie die Verwendung PropertyDescriptor zu erleichtern, vom Standard abweichende Formatierung des Date-Spalten.
        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. Fügen Sie folgenden Code zum gestalten und Formatieren der Spalten DataGrid mithilfe 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. Führen Sie das Projekt aus.
  9. Klicken Sie auf Metadaten abrufen der Liste die Tabellen (DataGrid1) ausfüllen aller Spalten mit Informationen, die für jede Tabelle in der Excel-Arbeitsmappe von GetOleDbSchemaTable zurückgegeben werden. Liste (DataGrid2) wird gleichzeitig mit allen Spalten mit Informationen, die zurückgegeben werden für die Spalten in der ersten Tabelle in der Liste Tabellen gefüllt.
  10. Wählen Sie eine andere Tabelle in der Liste Tabellen . Die Änderungen der Spalten Liste um die Spalten aus der ausgewählten Tabelle aufgrund des Ereignishandlers Cm_PositionChanged anzuzeigen, die Sie implementiert.
  11. Klicken Sie auf Format Tabellenübers definieren und Anwenden einer TableMappingStyle zu DataGrid1. Dies macht die Spaltenheader mehr "angezeigten" und zeigt nur die vier Spalten nützliche Daten aus den neun Spalten, die vom GetOleDbSchemaTable zurückgegeben werden. Diese Spalten werden angezeigt:
    TABLE_NAME
    TABLE_TYPE
    DATE_CREATED
    DATE_MODIFIED
    Diese leere Spalten werden nicht angezeigt:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    Beschreibung
    TABLE_PROPID
  12. Klicken Sie auf Format Spalten List definieren und ein TableMappingStyle, DataGrid2 zu übernehmen. Dies macht die Spaltenheader mehr "angezeigten" und zeigt nur die 5 nützlichsten Spalten von Daten aus den 28 Spalten, die vom GetOleDbSchemaTable zurückgegeben werden.
    COLUMN_NAME
    ORDINAL_POSITION
    DATA_TYPE
    MAXIMUM_CHARACTER_LENGTH
    NUMERIC_PRECISION
    Diese größtenteils leeren Spalten werden nicht angezeigt:
    TABLE_CATALOG
    TABLE_SCHEMA
    Table_name (bereits bekannt)
    COLUMN_GUID
    COLUMN_PROPID
    COLUMN_HASDEFAULT (immer false)
    COLUMN_DEFAULT
    COLUMN_FLAGS
    IS_NULLABLE (immer 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
    Domänenname
    Beschreibung
  13. Klicken Sie auf eine andere Zeile in DataGrid1 eine andere Tabelle auswählen. Liste wird automatisch aktualisiert. TableStyles, die Sie zuvor jeder DataGrid zugewiesen bleiben wirksam.

Problembehandlung

  • Die Spalte-Datentypen, die vom GetOleDbSchemaTable für eine Excel-Datenquelle zurückgegeben werden sind nicht mit den Datentypen, die von der OpenSchema -Methode im klassischen ADO zurückgegeben werden in allen Fällen identisch:
    Tabelle minimierenTabelle vergrößern
    SpaltentypKlassische ADOADO.NET (OLE DB)
    Numerische5 adDouble5 OleDbType.Double
    Währung6 adCurrency6-OleDbType.Currency
    Datum-Uhrzeit7 adDate7-OleDbType.Date
    Wert11 adBoolean11-OleDbType.Boolean
    Text < 255202 adVarWChar130-OleDbType.WChar
    Memo203 adLongVarWChar130-OleDbType.WChar
  • GetOleDbSchemaTable wie OpenSchema zurückgegeben eine einzelne Spalte "F1" aus ein leeres Excel-Arbeitsblatt, obwohl tatsächlich keine Daten oder Spaltenüberschriften vorhanden sind.

Informationsquellen

Weitere Informationen finden Sie die folgende KB-Artikelnummer:
257819So wird 's gemacht: Verwenden von ADO mit Excel-Daten von Visual Basic oder VBA

Eigenschaften

Artikel-ID: 318373 - Geändert am: Mittwoch, 3. September 2003 - Version: 2.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
Keywords: 
kbmt kbhowtomaster kbprovider KB318373 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 318373
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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