如何: 通过使用 Visual Basic.net 中的 GetOleDbSchemaTable 方法从 Excel 检索元数据

文章翻译 文章翻译
文章编号: 318373 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本分步指南介绍了如何通过 GetOleDbSchemaTable 方法与 Microsoft OLE DB 提供托管程序和 $ 在 Microsoft OLE DB 提供程序为 Jet 检索从 Microsoft Excel 数据源的表和列的元数据。

由 Microsoft.net 框架的 System.Data.OleDb 类公开的 GetOleDbSchemaTable 方法是.net 后续任务 OpenSchema 方法在早期版本的 Microsoft ActiveX 数据对象 (ADO)。

该技术的说明

使用 ADO.NET 连接到 Excel 数据源之后,您通过使用 GetOleDbSchemaTable,提取的表的元数据的列表,然后使用不同的参数中使用相同的方法,以获得所选表的列元数据。您还可以使用 DataGridTableStyle 对象版式和格式的数据网格中您查询的结果。

要求

下面的列表概述了建议的硬件、 软件、 网络的基础结构和服务包,您需要:
  • 在兼容的 Microsoft Windows 操作系统上安装的 visual Studio.net
  • 至少一个 Excel 工作簿 (.xls) 文件与某些行和列的数据
本文假定您已至少基本熟悉下列主题:
  • Visual.net Basic
  • ADO.NET 数据访问
  • Excel 工作簿和工作表

示例

  1. 启动 Microsoft 可 Visual Studio 的.net 并创建新的 Visual Basic.net Windows 应用程序项目。
  2. 将三个 按钮 控件和两个 DataGrid 控件添加到默认窗体 (Form1)。分别更改为 检索元数据格式的表格列表,和 格式列列表按钮 控件的 Text 属性。
  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 加载表和列列表、 填充 数据网格 的控件,并更新列列表,当所选的表更改时
        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. 插入以下代码以排列并使用 TableStyles 设置表 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_NAME
    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 (始终为真)
    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
    域名
    说明
  13. 单击以选择另一个表的 DataGrid1 中不同的行。自动更新 列表中。您以前应用于每个 数据网格 TableStyles 仍然有效。

故障排除

  • 列的数据类型的 Excel 数据源返回 GetOleDbSchemaTable 由不在所有情况下由 OpenSchema 方法经典 ADO 中返回的数据类型相同:
    收起该表格展开该表格
    列类型经典 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: 在 Visual Basic 或 VBA 的 Excel 数据中使用 ADO

属性

文章编号: 318373 - 最后修改: 2003年9月3日 - 修订: 2.1
这篇文章中的信息适用于:
  • Microsoft Visual Basic .NET 2003 标准版
  • Microsoft Visual .NET 2002 标准版
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
关键字:?
kbmt kbhowtomaster kbprovider KB318373 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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