您目前已離線,請等候您的網際網路重新連線

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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:318373
本文章的有 Microsoft Visual C#.NET] 版本請參閱 318452

在此工作

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

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

back to the top

該技巧的描述

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

back to the top

需求

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

範例

  1. 啟動 Microsoft Visual Studio.NET 並建立新的 Visual Basic.NET Windows 應用程式專案。
  2. 將三個 按鈕 控制項和兩個 DataGrid 控制項加入至預設表單 (Form1)。分別將的 按鈕 控制項的 [文字] 屬性變更為 擷取中繼資料]、 [格式化表格清單,] 和 [格式資料行清單
  3. 切換至表單的程式碼模組,並在頂端加入下列的 Imports 陳述式:
    Imports System.DataImports System.Data.OleDbImports 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 仍然有效。
back to the top

疑難排解

  • 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 」。
back to the top
参考
如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
257819HOWTO: 使用 ADO Visual Basic 或 VBA Excel 資料
back to the top

警告:本文為自動翻譯

內容

文章識別碼:318373 - 最後檢閱時間:09/03/2003 22:57:40 - 修訂: 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
意見反應