本分步指南介绍了如何通过
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 工作簿和工作表
示例
- 启动 Microsoft 可 Visual Studio 的.net 并创建新的 Visual Basic.net Windows 应用程序项目。
- 将三个 按钮 控件和两个 DataGrid 控件添加到默认窗体 (Form1)。分别更改为 检索元数据、 格式的表格列表,和 格式列列表 的 按钮 控件的 Text 属性。
- 切换到窗体的代码模块,并在顶部添加下面的 Imports 语句:
Imports System.Data
Imports System.Data.OleDb
Imports System.ComponentModel
- 下面的模块级声明"继承 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 - "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 - 插入以下代码以排列并使用 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 - 插入版式和格式列以下面的代码通过使用 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 - 运行该项目。
- 单击以填充 表 列表中 (DataGrid1) 检索元数据 具有所有 GetOleDbSchemaTable Excel 工作簿中的每个表返回的信息的列。在 表 列表中第一个表中的列与所有返回的信息的列在相同时间填充 列 列表中 (DataGrid2)。
- 在 表 列表中选择一个不同的表。随后,列 列表将发生变化,因为您实施该 cm_PositionChanged 事件处理程序显示所选表中的列。
- 单击定义并应用一个 TableMappingStyle DataGrid1 格式的表格列表。这使得更"友好"列标题,并显示由 GetOleDbSchemaTable 返回的九个列中的有用数据的四个列。这些列的显示:
TABLE_NAME
TABLE_TYPE
DATE_CREATED
DATE_MODIFIED
不显示这些空白列如下:TABLE_CATALOG
TABLE_SCHEMA
TABLE_GUID
说明
TABLE_PROPID
- 单击 格式列列表 可以定义并应用一个 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
域名
说明
- 单击以选择另一个表的 DataGrid1 中不同的行。自动更新 列 列表中。您以前应用于每个 数据网格 TableStyles 仍然有效。
故障排除
- 列的数据类型的 Excel 数据源返回 GetOleDbSchemaTable 由不在所有情况下由 OpenSchema 方法经典 ADO 中返回的数据类型相同:
收起该表格展开该表格
| 列类型 | 经典 ADO | ADO.NET (OLE DB) |
|---|
| 数字 | 5 adDouble | 5 OleDbType.Double |
| 货币 | 6 adCurrency | 6 OleDbType.Currency |
| 日期/时间 | 7 adDate | 7 OleDbType.Date |
| 布尔值 | 11 adBoolean | 11 OleDbType.Boolean |
| 文本 < 255 | 202 adVarWChar | 130 OleDbType.WChar |
| 备注 | 203 adLongVarWChar | 130 OleDbType.WChar |
- GetOleDbSchemaTable,如 OpenSchema,从一个空的 Excel 工作表中返回单个列"f1",虽然实际上任何数据或列标题不都存在。
有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
257819
(http://support.microsoft.com/kb/257819/EN-US/
)
HOWTO: 在 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
(http://support.microsoft.com/kb/318373/en-us/
)
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。