如何: 使用 Visual Basic.NET 中 GetOleDbSchemaTable 方法來從 Excel 擷取中繼資料

文章翻譯 文章翻譯
文章編號: 318373 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步告訴您,如何利用 GetOleDbSchemaTable 方法與 Microsoft OLE DB 提供管理者及 Microsoft OLE DB 提供者的 Jet 擷取來自 Microsoft Excel 資料來源的資料表和資料行的中繼資料。

GetOleDbSchemaTable 方法公開由 System.Data.OleDb 類別的 Microsoft.NET Framework 是.NET 後續 OpenSchema 方法在較早版本的 Microsoft ActiveX 資料物件中 (ADO)。

該技巧的描述

藉由使用 ADO.NET 連接 Excel 資料來源之後您藉由使用 GetOleDbSchemaTable,擷取一份資料表的中繼資料,然後在以取得所選資料表的資料行中繼資料的使用不同的引數使用相同的方法。您也可以使用一個 DataGridTableStyle 物件配置並設定您的查詢結果的資料格的格式。

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • 安裝在相容的 Microsoft Windows 作業系統上的 Visual Studio.NET
  • 至少一個 Microsoft Excel 活頁簿 (.xls) 檔案具有某些列和資料的資料行
本文假設您有至少基本熟悉下列主題:
  • Visual Basic.NET
  • ADO.NET 資料存取
  • Excel 活頁簿和工作表

範例

  1. 啟動 Microsoft Visual Studio.NET 並建立新的 Visual Basic.NET Windows 應用程式專案。
  2. 將三個 按鈕 控制項和兩個 DataGrid 控制項加入至預設表單 (Form1)。分別將的 按鈕 控制項的 [文字] 屬性變更為 擷取中繼資料]、 [格式化表格清單,] 和 [格式資料行清單
  3. 切換至表單的程式碼模組,並在頂端加入下列的 Imports 陳述式:
    Imports System.Data
    Imports System.Data.OleDb
    Imports System.ComponentModel
  4. 繼承 System.Windows.Forms.Form 一行之後,在 Form 類別中插入下列模組層次宣告。視指向的 Excel 活頁簿檔案,其中包含某些資料列和資料的資料行調整連接字串
        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. 「 Windows Form 設計工具產生的程式碼 」 區域之後,表單 類別中插入下列程式碼。 這個程式碼呼叫 GetOleDbSchemaTable 載入 [資料表] 和 [欄] 清單、 填入 DataGrid 的控制項和更新資料行清單,選取的資料表變更時
        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. 插入下列程式碼,配置並使用 TableStyle 格式化表格 DataGrid。請注意 PropertyDescriptor 以利於進行非預設的格式設定的日期資料行使用
        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. 插入下列程式碼來配置和格式化資料行使用 TableStyleDataGrid
        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. 執行專案。
  9. 按一下 [擷取中繼資料 來填滿 (DataGrid1) 上的 [表格] 清單所 GetOleDbSchemaTable 傳回 Excel 活頁簿中的每個資料表的資料欄的所有。[資料行] 清單 (DataGrid2) 填滿一次所傳回的資料欄的所有在 [表格] 清單中第一個資料表中資料行。
  10. 在 [表格] 清單中選取不同的表格。資料行 清單將因為您實作 cm_PositionChanged 事件處理常式的顯示選定的資料表的資料行。
  11. 按一下 [定義,並將一個 TableMappingStyle 套用至 DataGrid1 格式表格清單]。這使得資料行標頭更 「 易記的 」,並顯示只有四個資料的資料行有用從九個 GetOleDbSchemaTable 所傳回的資料行。會顯示這些資料行:
    空間
    TABLE_TYPE
    DATE_CREATED
    DATE_MODIFIED
    這些空白資料行不會顯示:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    描述
    TABLE_PROPID
  12. 按一下 [格式資料行清單 定義,並套用一個 TableMappingStyle DataGrid2 至]。這使得資料行標頭更 「 易記的 」,並顯示只有 5 最有用資料的資料行從 28 GetOleDbSchemaTable 所傳回的資料行。
    COLUMN_NAME
    ORDINAL_POSITION
    DATA_TYPE
    MAXIMUM_CHARACTER_LENGTH
    NUMERIC_PRECISION
    這大多是空白的資料行不會顯示:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_NAME (已知)
    COLUMN_GUID
    COLUMN_PROPID
    COLUMN_HASDEFAULT (永遠 false)
    COLUMN_DEFAULT
    COLUMN_FLAGS
    IS_NULLABLE (永遠 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
    DOMAIN_NAME
    描述
  13. 按一下 DataGrid1 選取不同的資料表中的不同資料列。資料行 清單也會自動更新。您先前套用至每個 DataGrid 的 TableStyle 仍然有效。

疑難排解

  • GetOleDbSchemaTable 傳回的 Excel 資料來源之資料行資料型別並不在所有情況下在傳統的 ADO OpenSchema 方法所傳回之資料型別相同的:
    摺疊此表格展開此表格
    資料行型別傳統的 ADOADO.NET (OLE DB)
    數字5 adDouble5 OleDbType.Double
    貨幣6 adCurrency6 OleDbType.currency
    日期/時間7 adDate7 OleDbType.date
    布林值11 adBoolean11 OleDbType.Boolean
    文字 < 255202 adVarWChar130 OleDbType.WChar
    備忘錄203 adLongVarWChar130 OleDbType.WChar
  • 雖然實際上沒有資料行的標題是存在 GetOleDbSchemaTable,像 OpenSchema,從空白的 Excel 試算表傳回單一資料行 F1 」。

?考

如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
257819HOWTO: 使用 ADO Visual Basic 或 VBA Excel 資料

屬性

文章編號: 318373 - 上次校閱: 2003年9月3日 - 版次: 2.1
這篇文章中的資訊適用於:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
關鍵字:?
kbmt kbhowtomaster kbprovider KB318373 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:318373
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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