使用本逐步式指南通过
GetOleDbSchemaTable 方法与 Microsoft OLE DB 提供托管程序和 $ 在 Microsoft OLE DB 提供程序为 Jet 检索从 Microsoft Excel 数据源的表和列的元数据。
由 Microsoft.net 框架的
System.Data.OleDb 类公开该
GetOleDbSchemaTable 方法是在早期版本的 ActiveX 数据对象 (ADO)
OpenSchema 方法.net 后续任务。
该技术的说明
通过使用 Microsoft ADO.NET 连接到 Excel 数据源后,使用
GetOleDbSchemaTable 方法提取的表的元数据的列表。接下来,使用带不同参数的相同的方法获取为所选表的列元数据。您还可以使用
DataGridTableStyle 方法版式和格式的数据网格中的查询结果。
要求
下面的列表概述了建议的硬件、 软件、 网络的基础结构和服务包,您需要:
- 在兼容的 Microsoft Windows 操作系统上安装 Microsoft Visual Studio.net。
- 至少一个 Excel 工作簿 (.xls) 具有文件某些行和列的数据。
本文假定您熟悉下列主题:
- Microsoft Visual C#.net。
- Microsoft ADO.NET 数据访问。
- Microsoft Excel 工作簿和工作表。
示例
- 启动 Visual Studio.net 并创建一个新的 Visual C# Windows 应用窗体程序项目。
- 向 Form1 中添加三个 按钮 控件和两个 DataGrid 控件。更改分别命名 检索元数据、 格式表的列表,和 格式列列表 中,该按钮的 按钮 控件的 Text 属性。
- 切换到窗体的代码模块并添加任何其他代码之前,以下语句:
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
- 在 窗体 类中插入下面的模块级声明。使该连接字符串指向包含某些行和列的数据的 Excel 工作簿文件
private OleDbConnection cn;
private String strCn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\\test.xls;Extended Properties=Excel 8.0";
private DataTable dtTables;
private CurrencyManager cm;
private DataTable dtColumns;
private DataView dvColumns;
- 在 窗体 类中的在 Windows 窗体设计器生成的代码节中之后, 插入下面的代码。此代码调用 GetOleDbSchemaTable 加载表和列列表、 填充 DataGrids 中,和更新列列表中选定的表发生更改时
private void button1_Click(object sender, System.EventArgs e)
{
GetTablesList();
}
private void GetTablesList()
{
try
{
cn = new OleDbConnection(strCn);
cn.Open();
dtTables = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null,null,null,"TABLE"});
dataGrid1.DataSource = dtTables;
dataGrid1.ReadOnly = true;
cn.Close();
}
catch(System.Data.OleDb.OleDbException myException)
{
for (int i=0; i < myException.Errors.Count; i++)
{
MessageBox.Show("Index #" + i + "\n" +
"Message: " + myException.Errors[i].Message + "\n" +
"Native: " +
myException.Errors[i].NativeError.ToString() + "\n" +
"Source: " + myException.Errors[i].Source + "\n" +
"SQL: " + myException.Errors[i].SQLState + "\n");
}
}
GetColumnsList();
}
private void GetColumnsList()
{
if( cm == null)
cm = (CurrencyManager)this.BindingContext [dtTables];
cm.PositionChanged += new EventHandler(this.cm_PositionChanged );
int r = cm.Position;
String strTable = dtTables.Rows[r]["TABLE_NAME"].ToString ();
cn = new OleDbConnection(strCn);
cn.Open();
dtColumns = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,new Object[]{null,null, strTable, null});
dvColumns = new DataView(dtColumns);
dvColumns.Sort = "ORDINAL_POSITION";
dataGrid2.DataSource = dvColumns;
dataGrid2.ReadOnly = true;
cn.Close();
}
private void cm_PositionChanged( object sender, System.EventArgs e)
{
GetColumnsList();
}
- 插入以下代码以排列并使用 TableStyles 设置表 DataGrid 格式。请注意该 PropertyDescriptor 以便于非默认格式的日期列的使用
private void button2_Click(object sender, System.EventArgs e)
{
FormatTablesGrid(dtTables);
}
private void FormatTablesGrid(DataTable dt2format)
{
DataGridTableStyle gs = new DataGridTableStyle();
gs.MappingName = dt2format.TableName;
DataGridColumnStyle cs = new DataGridTextBoxColumn();
cs.MappingName = "TABLE_NAME";
cs.HeaderText = "Table Name";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
cs = new DataGridTextBoxColumn();
cs.MappingName = "TABLE_TYPE";
cs.HeaderText = "Table Type";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
CurrencyManager cm = (CurrencyManager)this.BindingContext[dt2format];
PropertyDescriptor pd = cm.GetItemProperties()["DATE_CREATED"];
cs = new DataGridTextBoxColumn(pd, "d");
cs.MappingName = "DATE_CREATED";
cs.HeaderText = "Date Created";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
cm = ( CurrencyManager)this.BindingContext[dt2format];
pd = cm.GetItemProperties()["DATE_MODIFIED"];
cs = new DataGridTextBoxColumn(pd, "d");
cs.MappingName = "DATE_MODIFIED";
cs.HeaderText = "Date Modified";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
dataGrid1.TableStyles.Add(gs);
button2.Enabled = false;
}
- 插入以下代码以排列并通过使用 TableStyle 格式化列 DataGrid:
private void button3_Click(object sender, System.EventArgs e)
{
FormatColumnsGrid(dtTables);
}
private void FormatColumnsGrid(DataTable dt2format)
{
DataGridTableStyle gs = new DataGridTableStyle();
gs.MappingName = dtColumns.TableName;
DataGridColumnStyle cs = new DataGridTextBoxColumn();
cs.MappingName = "COLUMN_NAME";
cs.HeaderText = "Column Name";
cs.Width = 100;
gs.GridColumnStyles.Add(cs);
cs = new DataGridTextBoxColumn();
cs.MappingName = "ORDINAL_POSITION";
cs.HeaderText = "Ordinal Position";
cs.Width = 100;
gs.GridColumnStyles.Add(cs);
cs = new DataGridTextBoxColumn();
cs.MappingName = "DATA_TYPE";
cs.HeaderText = "Data Type";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
cs = new DataGridTextBoxColumn();
cs.MappingName = "CHARACTER_MAXIMUM_LENGTH";
cs.HeaderText = "Text Length";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
cs = new DataGridTextBoxColumn();
cs.MappingName = "NUMERIC_PRECISION";
cs.HeaderText = "Numeric Precision";
cs.Width = 75;
gs.GridColumnStyles.Add(cs);
dataGrid2.TableStyles.Add(gs);
button3.Enabled = false;
}
- 运行该项目。
- 单击 检索元数据 (Button1)。
表 列表中 (DataGrid1) 填写的是 Excel 工作簿中的每个表返回 GetOleDbSchemaTable 方法的信息的所有列。列 列表中 (DataGrid2) 填充在同一时间与在 表 列表中第一个表中列返回的信息的所有列。 - 从 表 列表中选择一个不同的表。
列列表中显示选定表 cm_PositionChanged 事件处理程序的结果列。 - 单击 格式表列表 (Button2)。 这定义并应用一个 TableMappingStyle DataGrid1,以使列标题更加友好的名称和显示有用的数据的四个列
TABLE_NAME
TABLE_TYPE
DATE_CREATED
DATE_MODIFIED
而非 9 个 GetOleDbSchemaTable 方法返回的列。
空白列未显示的是:TABLE_CATALOG
TABLE_SCHEMA
TABLE_GUID
说明
TABLE_PROPID
- 单击 格式列列表 (Button3)。 这定义并应用一个 TableMappingStyle DataGrid2,以使列标题更加友好的名称和显示仅五个最有用的列由 GetOleDbSchemaTable 方法返回 COLUMN_NAME ORDINAL_POSITION DATA_TYPE MAXIMUM_CHARACTER_LENGTH NUMERIC_PRECISION 28 列中的数据。
未显示的列有:
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 方法返回列的数据类型不是在所有情况下,由在早期版本的 ADO OpenSchema 方法返回的数据类型相同:
收起该表格展开该表格
| 列类型 | 经典 ADO | ADO.Net (OleDb) |
|---|
| 数字 | 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
文章编号: 318452 - 最后修改: 2003年9月3日 - 修订: 2.2
这篇文章中的信息适用于:
- Microsoft ADO.NET 1.1
- Microsoft ADO.NET 1.0
- Microsoft Visual C# .NET 2003 标准版
- Microsoft Visual C# .NET 2002 标准版
| kbmt kbhowtomaster KB318452 KbMtzh |
机器翻译注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版:
318452
(http://support.microsoft.com/kb/318452/en-us/
)
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。