如何: 在 Visual C#.net 中使用 GetOleDbSchemaTable 从 Excel 检索元数据

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

本页

概要

使用本逐步式指南通过 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 工作簿和工作表。

示例

  1. 启动 Visual Studio.net 并创建一个新的 Visual C# Windows 应用窗体程序项目。
  2. 向 Form1 中添加三个 按钮 控件和两个 DataGrid 控件。更改分别命名 检索元数据格式表的列表,和 格式列列表 中,该按钮的 按钮 控件的 Text 属性。
  3. 切换到窗体的代码模块并添加任何其他代码之前,以下语句:
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb;
    					
  4. 窗体 类中插入下面的模块级声明。使该连接字符串指向包含某些行和列的数据的 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;
    					
  5. 窗体 类中的在 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();
    }
    								
    					
  6. 插入以下代码以排列并使用 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;
    
    }
    					
  7. 插入以下代码以排列并通过使用 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;
    
    	}
    					
  8. 运行该项目。
  9. 单击 检索元数据 (Button1)。

    列表中 (DataGrid1) 填写的是 Excel 工作簿中的每个表返回 GetOleDbSchemaTable 方法的信息的所有列。 列表中 (DataGrid2) 填充在同一时间与在 列表中第一个表中列返回的信息的所有列。
  10. 列表中选择一个不同的表。

    列列表中显示选定表 cm_PositionChanged 事件处理程序的结果列。
  11. 单击 格式表列表 (Button2)。 这定义并应用一个 TableMappingStyle DataGrid1,以使列标题更加友好的名称和显示有用的数据的四个列
    TABLE_NAME
    TABLE_TYPE
    DATE_CREATED
    DATE_MODIFIED
    而非 9 个 GetOleDbSchemaTable 方法返回的列。

    空白列未显示的是:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    说明
    TABLE_PROPID
  12. 单击 格式列列表 (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
    域名
    说明
  13. 单击以选择另一个表的 DataGrid1 中不同的行。自动更新列列表中。TableStyles 以前应用于每个 数据网格 将保持有效。

故障排除

  • 由 Excel 数据源的 GetOleDbSchemaTable 方法返回列的数据类型不是在所有情况下,由在早期版本的 ADO OpenSchema 方法返回的数据类型相同:
    收起该表格展开该表格
    列类型经典 ADOADO.Net (OleDb)
    数字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

属性

文章编号: 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
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈