文章編號: 318452 - 上次校閱: 2003年9月3日 - 版次: 2.2

如何: 利用 GetOleDbSchemaTable Visual C#.NET 中從 Excel 擷取中繼資料

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

使用此逐步教學指南,若要利用 GetOleDbSchemaTable 方法與 Microsoft OLE DB 提供管理者及 Microsoft OLE DB 提供者的 Jet 擷取 Microsoft Excel 資料來源的資料表和資料行的中繼資料。

Microsoft.NET Framework System.Data.OleDb 類別所公開的 GetOleDbSchemaTable 方法是.NET 後續 OpenSchema 方法在較早版本的 ActiveX 資料物件 (ADO) 中。

該技巧的描述

藉由使用 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 Form 應用專案。
  2. 將三個 按鈕 控制項和兩個 DataGrid 控制項加入 Form1。變更 按鈕 控制項,以分別命名 擷取中繼資料]、 [格式化表格清單,] 和 [格式資料行清單,按鈕的 [文字] 的屬性。
  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 Form 設計工具產生的程式碼區段之後插入下列程式碼。這個程式碼會呼叫 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. 插入下列程式碼,配置並使用 TableStyle 格式化表格 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_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
    DOMAIN_NAME
    描述
  13. 按一下 DataGrid1 選取不同的資料表中的不同資料列。[資料行] 清單會自動更新。先前套用至每個 DataGridTableStyle 仍然有效。

疑難排解

  • 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,傳回單一資料行 (F1) 從空白的 Excel 工作表時,在實際上沒有資料行的標題都存在。

?考

如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
257819? (http://support.microsoft.com/kb/257819/EN-US/ ) HOWTO: 使用 ADO Visual Basic 或 VBA Excel 資料

這篇文章中的資訊適用於:
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
  • Microsoft Visual C# .NET 2003 標準版
  • Microsoft Visual C# .NET 2002 Standard Edition
關鍵字:?
kbmt kbhowtomaster KB318452 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:318452? (http://support.microsoft.com/kb/318452/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。