使用Ado.net獲取數(shù)據(jù)庫架構(gòu)信息
秋 楓 2004-7-3
在開發(fā)的時(shí)候有時(shí)需要獲取數(shù)據(jù)庫架構(gòu)信息來得到數(shù)據(jù)庫的一些其他信息,比如存儲(chǔ)過程、視圖、表、字段的類型、備注說明等。通過OleDb.NET數(shù)據(jù)提供程序可以比較簡(jiǎn)潔的實(shí)現(xiàn)這一點(diǎn)。
一、OleDbConnection的GetOleDbSchemaTable方法
在Ado.net的對(duì)象模型的該對(duì)象充當(dāng)了與數(shù)據(jù)源之間的連接,通過Connection對(duì)象來連接數(shù)據(jù)庫或者從數(shù)據(jù)庫斷開以釋放寶貴的資源。這里我們需要用到的是OleDbConnection對(duì)象的GetOleDbSchemaTable 方法,
定義如下:
public DataTable GetOleDbSchemaTable( Guid schema,object[] restrictions);
方法返回一個(gè)DataTable對(duì)象;
第一個(gè)參數(shù)是OleDbSchemaGuid的枚舉值,是用來指定架構(gòu)信息類型,可以根據(jù)某一個(gè)值來決定所需的架構(gòu)類型,如表、列、視圖等,具體可以參考MSDN;
第二個(gè)參數(shù)為Restrictions的參數(shù),作為一個(gè)oject數(shù)組數(shù)據(jù)類型,起到過濾的作用,如果把第二個(gè)參數(shù)設(shè)置為null,那就返回指定的OleDbSchemaGuid枚舉的所有信息了。
下面用示例程序來進(jìn)行相關(guān)說明,示例界面如下:
整個(gè)窗體包括:
一個(gè)TextBox,用來輸入數(shù)據(jù)庫連接字符串;
一個(gè)DataGrid,用來顯示架構(gòu)信息;
查看按鈕,點(diǎn)擊獲取架構(gòu)信息。
這里以SqlServer 的Northwind數(shù)據(jù)庫為例,在查看按鈕事件中進(jìn)行了如下處理:
private void buttonOK_Click(object sender, System.EventArgs e)
{
this.dataGridSchema.DataSource = GetSqlDbSchemaUsingOleDbConnection (this.textBoxConnString.Text.Trim());
}
通過文本框把連接字符串傳入GetSqlDbSchemaUsingOleDbConnection函數(shù),由OleDbConnection對(duì)象來連接數(shù)據(jù)庫,并獲取構(gòu)架信息,
private DataTable GetSqlDbSchemaUsingOleDbConnection(string connString)
{
OleDbConnection myConn = new OleDbConnection(connString);
myConn.Open();
DataTable table1 = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,null);
myConn.Close();
return table1;
}
上面的函數(shù)返回?cái)?shù)據(jù)庫的所有字段,下面來看看如何通過Restrictions參數(shù)來過濾信息;
參數(shù)數(shù)據(jù)可以定義為
object[] restrictions =
new object[]{"TABLE_CATALOG","TABLE_SCHEMA","TABLE_NAME","COLUMN_NAME"};
具體可參考MSDN文檔。
對(duì)上面函數(shù)進(jìn)行修改,我們只獲取Northwind 數(shù)據(jù)庫Customers表的信息:
private DataTable GetSqlDbSchemaUsingOleDbConnection(string connString)
{
OleDbConnection myConn = new OleDbConnection(connString);
object [] restrictions = new object[]{"Northwind","dbo","Customers",null};
myConn.Open();
DataTable table1 = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,restrictions);
myConn.Close();
return table1;
}
另外對(duì)于Access數(shù)據(jù)庫架構(gòu)信息的獲取也可以通過上面的方法來完成,
private DataTable GetMdbSchemaUsingOleDbConnection(string connString)
{
OleDbConnection myConn = new OleDbConnection(connString);
myConn.Open();
DataTable table1 = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,null);
myConn.Close();
return table1;
}
前面的界面圖示就是執(zhí)行結(jié)果,這里我用的是Access 2003。
二.OleDbDataReader的GetSchemaTable方法
另外一個(gè)獲取架構(gòu)的方法是使用OleDbDataReader的GetSchemaTable方法,
public virtual DataTable GetSchemaTable();
該方法需要結(jié)合OleDbCommand.ExecuteReader的一個(gè)重載方法才能完成,可以設(shè)置重載方法的唯一參數(shù),
public OleDbDataReader ExecuteReader(CommandBehavior behavior);
CommandBehavior為一枚舉對(duì)象,定義為
[Flags]
[Serializable]
public enum CommandBehavior
CommandBehavior.SchemaOnly:只返回列信息,不影響數(shù)據(jù)庫狀態(tài);
CommandBehavior.KeyInfo:返回列和主鍵信息。執(zhí)行此查詢時(shí)不鎖定選定的行。
如果使用CommandBehavior.SchemaOnly就不需要再加CommandBehavior.KeyInfo了。
下面是演示代碼:
private DataTable GetSchemaUsingOleDbDataReader(string connString)
{
OleDbConnection myConn = new OleDbConnection(connString);
DataTable table1 = null;
try
{
OleDbCommand cmd = new OleDbCommand("Select * from Customers",myConn);
myConn.Open();
OleDbDataReader dataReader = cmd.ExecuteReader(CommandBehavior.SchemaOnly);
table1 = dataReader.GetSchemaTable();
dataReader.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
if(myConn.State != ConnectionState.Closed)
myConn.Close();
myConn.Dispose();
}
return table1;
}
該方法返回了Customers表的架構(gòu)信息,當(dāng)然,如果連接到Access數(shù)據(jù)庫,上面的函數(shù)只需修改一下連接字符串和查詢字符串就可以正確執(zhí)行。
三、其他補(bǔ)充
我們這里所說的是通過OleDb.NET來實(shí)現(xiàn)數(shù)據(jù)庫架構(gòu)信息的獲取。對(duì)于特定的數(shù)據(jù)提供程序Sql Client.NET和Oracle Client.NET等還可以通過其他手段實(shí)現(xiàn)。
比如:
在Sql Server中可以通過信息架構(gòu)視圖來獲取數(shù)據(jù):
SELECT * FROM INFORMATION_SCHEMA.TABLES
獲取表名的清單:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
獲取視圖名清單:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW'
還有獲取列,存儲(chǔ)過程等,具體可以查看SQL SERVER 的聯(lián)機(jī)幫助。
在Oracle數(shù)據(jù)庫中可以通過查詢Oracle數(shù)據(jù)字典來獲取這些信息,具體可以參考Oracle的相關(guān)文檔。
本文參考:《MSDN》、《ADO.NET Core Reference》、《Sql Server 2000聯(lián)機(jī)叢書》
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!