使用此逐步教學指南,若要利用
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 活頁簿和工作表。
範例
- 啟動 Visual Studio.NET 並建立新的 Visual C# Windows Form 應用專案。
- 將三個 按鈕 控制項和兩個 DataGrid 控制項加入 Form1。變更 按鈕 控制項,以分別命名 擷取中繼資料]、 [格式化表格清單,] 和 [格式資料行清單,按鈕的 [文字] 的屬性。
- 切換至程式碼模組的表單,然後新增下列陳述式之前的任何其他程式碼:
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 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();
}
- 插入下列程式碼,配置並使用 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;
}
- 插入下列程式碼配置並使用 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) 填滿 GetOleDbSchemaTable 方法所傳回的 Excel 活頁簿中的每個資料表資訊的所有資料行。傳回在 [表格] 清單中第一個資料表中資料行資訊的所有資料行同時填滿 (DataGrid2) 上的 [資料行] 清單。 - 從 [表格] 清單選取不同的表格。
[資料行] 清單會顯示選取資料表 cm_PositionChanged 事件處理常式的結果欄。 - 按一下 [格式化表格清單 (Button2)]。 這會定義並套用一個 TableMappingStyle DataGrid1,來讓資料行標頭更好記,並只有用資料四欄的顯示
空間
TABLE_TYPE
DATE_CREATED
DATE_MODIFIED
而非九個 GetOleDbSchemaTable 方法所傳回的資料行。
空白資料行中不會顯示如下:TABLE_CATALOG
TABLE_SCHEMA
TABLE_GUID
描述
TABLE_PROPID
- 按一下 [格式資料行清單 (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
描述
- 按一下 DataGrid1 選取不同的資料表中的不同資料列。[資料行] 清單會自動更新。先前套用至每個 DataGridTableStyle 仍然有效。
疑難排解
- 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,傳回單一資料行 (F1) 從空白的 Excel 工作表時,在實際上沒有資料行的標題都存在。
如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
257819?
(http://support.microsoft.com/kb/257819/EN-US/
)
HOWTO: 使用 ADO Visual Basic 或 VBA Excel 資料