文章编号: 318452 - 最后修改: 2003年9月3日 - 修订: 2.2

如何: 检索从 Excel 浣跨敤 Visual C#.net 中的 GetOleDbSchemaTable 的元数据

本页

展开全部 | 关闭全部

概要

使用本逐步式指南 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 Visual Studio.net 兼容的 Microsoft Windows 操作系统上安装。
  • 至少一个 Microsoft Excel 工作簿 (.xls) 具有文件的一些行和列的数据。
本文假定您熟悉下列主题:
  • Microsoft Visual C#.net。
  • Microsoft ADO.NET 数据访问。
  • Microsoft Excel 工作簿和工作表。

示例

  1. 启动 Visual Studio.net 并创建新的 Visual C# Windows 窗体应用项目。
  2. 向 Form1 中添加三个 按钮 控件和两个 DataGrid 控件。 更改分别命名按钮 检索元数据格式的表格列表,和 格式列列表Button 控件的 Text 属性。
  3. 切换到代码模块中为窗体并添加任何其他代码之前下列语句:
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb;
    					
  4. Form 类中插入下面的模块级声明。 已连接到 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. Form 类中的 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) 充满 GetOleDbSchemaTable 方法所返回的 Excel 工作簿中的每个表的信息的所有列。 列表中 (DataGrid2) 填充在同一时间与返回的列在 列表中第一个表中的信息的所有列。
  10. 列表中选择一个不同的表。

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

    空白单元格列未显示的是:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    说明
    TABLE_PROPID
  12. 单击 格式列列表 (Button3)。 这定义并应用一个 TableMappingStyle DataGrid2,以进行更友好的列标题和显示仅五个最有用的列从 28 列 COLUMN_NAME ORDINAL_POSITION DATA_TYPE MAXIMUM_CHARACTER_LENGTH NUMERIC_PRECISION GetOleDbSchemaTable 方法所返回的数据。

    列未显示的是:

    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
    域名
    说明
  13. 单击以选择另一个表的 DataGrid1 中不同的行。 自动更新列列表中。 以前应用于每个 DataGridTableStyles 仍然有效。

鐤戦毦瑙 g 瓟

  • 对于 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 知识库中相应的文章:
257819? (http://support.microsoft.com/kb/257819/EN-US/ ) HOWTO: 用 Visual Basic 或 VBA 中的 Excel 数据使用 ADO

这篇文章中的信息适用于:
  • 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和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
 

文章翻译