PROCEDURE: Metagegevens ophalen uit Excel met behulp van de methode GetOleDbSchemaTable in Visual Basic.NETTO

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 318373 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Op deze pagina

Samenvatting

In dit stapsgewijze artikel wordt beschreven hoe u tabel ophalen en kolommetagegevens uit Microsoft Excel-gegevensbronnen met behulp van deGetOleDbSchemaTablemethode met de Microsoft OLE DB Managed Provider en de Microsoft OLE DB-Provider voor Jet.

HetGetOleDbSchemaTablemethode die wordt weer gegeven door deSystem.data.OLEDBklassen van Microsoft..NET Framework is het.NETTO opvolger deOpenSchemamethode in eerdere versies van Microsoft ActiveX Data Objects (ADO).

Beschrijving van de techniek

Nadat u verbinding met een Excel-gegevensbron met behulp van ADO.NET u een lijst met tabel metagegevens uitpakken metGetOleDbSchemaTable, en vervolgens dezelfde methode gebruiken met verschillende argumenten ophalen metagegevens van kolommen voor de geselecteerde tabel. U kunt ook eenDataGridTableStyleobject indelen en formatteren van de query resulteert in een gegevens raster.

Vereisten

De volgende lijst worden de aanbevolen hardware, software, net werk infrastructuur en service packs u nodig hebt:
  • Visual Studio.NET geïnstalleerd op een compatibele Microsoft Windows-besturingssysteem
  • Minstens één Microsoft Excel-werkmap (. xls)-bestand met enkele rijen en kolommen met gegevens
In dit artikel wordt ervan uitgegaan dat er ten minste elementaire kennis met de volgende onderwerpen:
  • In Visual Basic.NETTO
  • ADO.Toegang tot net werk gegevens
  • Excel-werkmappen en -werk bladen

Voorbeeld

  1. Start Microsoft Visual Studio.NETTO en maak een nieuwe visuele Basis.NETTO Windows-toepassingsproject.
  2. Drie toevoegenKnopbesturings elementen en tweeDataGridbesturings elementen aan het standaard formulier (Form1). Wijziging deTeksteigenschap van deKnopbesturings elementenMetagegevens ophalen,Lijst van opmaak tabellen, enLijst kolommenrespectievelijk.
  3. Ga naar de formulier codemodule en voeg het volgende toeInvoerinstructies boven:
    Imports System.Data
    Imports System.Data.OleDb
    Imports System.ComponentModel
  4. Voeg de volgende declaraties van de module niveau in deFormulierklasse na de regel "Forms neemt". Aanpassen de verbindingstekenreeks als u nodig hebt om te verwijzen naar een Excel-werkmap die het bestand aantal rijen en kolommen met gegevens bevat.
        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. Voeg de volgende code in deFormulierklasse na de "Windows Form Designer ted code '. Deze code roeptGetOleDbSchemaTableladen van de tabel en kolommen lijsten, vult hetDataGridbesturings elementen en updates de kolommen weer geven wanneer de geselecteerde tabel wijzigingen.
        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. Voeg de volgende code indelen en opmaken van tabellenDataGridmet behulp vanTableStyles. Let op het gebruik vanPropertyDescriptorter vergemakkelijking van niet-standaard opmaak van de kolommen datum.
        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. Voeg de volgende code indelen en opmaken van kolommenDataGridmet behulp vanTableStyle:
        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. Het project wordt uitgevoerd.
  9. Klik opMetagegevens ophalenvult deTabellen(DataGrid1) een lijst met alle kolommen van de gegevens die zijn voor elke tabel in de Excel-werkmap door geretourneerdGetOleDbSchemaTable. HetKolommenlijst (DataGrid2) wordt gevuld met alle tegelijkertijd de kolommen met gegevens die zijn geretourneerd voor de kolommen in de eerste tabel in hetTabellenlijst.
  10. Selecteer een andere tabel in deTabellenlijst. HetKolommenlijst met wijzigingen in de kolommen in de geselecteerde tabel weer geven vanwege decm_PositionChangedgebeurtenis-handler die u hebt geïmplementeerd.
  11. Klik opLijst van opmaak tabellendefiniëren en toepassen van een TableMappingStyle op DataGrid1. Hierdoor de kolom koppen meer "vriendelijke" en geeft alleen de vier kolommen van nuttige gegevens uit de negen kolommen die worden geretourneerd doorGetOleDbSchemaTable. Deze kolommen worden weer gegeven:
    TABLE_NAME
    TABLE_TYPE
    DATE_CREATED
    DATE_MODIFIED
    Deze lege kolommen worden niet weer gegeven:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    BESCHRIJVING
    TABLE_PROPID
  12. Klik opLijst kolommendefiniëren en toepassen van een TableMappingStyle op DataGrid2. Dit meer "vriendelijke" kunt u de kolom koppen en geeft alleen de 5 meest nuttige kolommen met gegevens uit de 28 kolommen die worden geretourneerd doorGetOleDbSchemaTable.
    COLUMN_NAME
    ORDINAL_POSITION
    DATA_TYPE
    MAXIMUM_CHARACTER_LENGTH
    NUMERIC_PRECISION
    Deze grotendeels lege kolommen worden niet weer gegeven:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_NAME (al bekende)
    COLUMN_GUID
    COLUMN_PROPID
    COLUMN_HASDEFAULT (altijd false)
    COLUMN_DEFAULT
    COLUMN_FLAGS
    IS_NULLABLE (altijd 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
    DOMEIN NAAM
    BESCHRIJVING
  13. Klik op een andere rij in DataGrid1 op een andere tabel. HetKolommenlijst wordt automatisch bijgewerkt. De TableStyles die u eerder toegepast op elkDataGridblijven van kracht.

Problemen oplossen

  • De kolom gegevenstypen die worden geretourneerd doorGetOleDbSchemaTablevoor een Excel-gegevensbron niet identiek zijn in alle gevallen de gegevenstypen die worden geretourneerd door deOpenSchemamethode in klassiek ADO:
    Deze tabel samenvouwenDeze tabel uitklappen
    KolomtypeADO classicADO.NETTO (OLE DB)
    Numerieke5 - adDouble5- OleDbType.Double
    Valuta6 - adCurrency6- OleDbType.Currency
    Datum/tijd7 - adDate7- OleDbType.Date
    Boolean11 - adBoolean11- OleDbType.Boolean
    Tekst<>202 - adVarWChar130- OleDbType.WChar
    Memo203 - adLongVarWChar130- OleDbType.WChar
  • GetOleDbSchemaTable, zoalsOpenSchema, retourneert één kolom "f1" van een leeg Excel-werkblad Hoewel in feite zijn geen gegevens- of kolom koppen aanwezig.

Referenties

Voor Als u meer informatie wilt, klikt u op het volgende artikelnummer om het artikel te bekijken in de Microsoft Knowledge Base:
257819PROCEDURE: ADO gebruiken met Excel-gegevens vanuit Visual Basic of VBA

Eigenschappen

Artikel ID: 318373 - Laatste beoordeling: maandag 28 februari 2011 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ADO.NET 1.1
Trefwoorden: 
kbhowtomaster kbprovider kbmt KB318373 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:318373

Geef ons feedback

 

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