使用Ado.net擷取資料庫結構描述資訊
來源:互聯網
上載者:User
ado|架構|資料|資料庫 使用Ado.net擷取資料庫結構描述資訊
秋 楓 2004-7-3
在開發的時候有時需要擷取資料庫結構描述資訊來得到資料庫的一些其他資訊,比如預存程序、視圖、表、欄位的類型、備忘說明等。通過OleDb.NET資料提供者可以比較簡潔的實現這一點。
一、OleDbConnection的GetOleDbSchemaTable方法
在Ado.net的物件模型的該對象充當了與資料來源之間的串連,通過Connection對象來串連資料庫或者從資料庫斷開以釋放寶貴的資源。這裡我們需要用到的是OleDbConnection對象的GetOleDbSchemaTable 方法,
定義如下:
public DataTable GetOleDbSchemaTable( Guid schema,object[] restrictions);
方法返回一個DataTable對象;
第一個參數是OleDbSchemaGuid的枚舉值,是用來指定架構資訊類型,可以根據某一個值來決定所需的架構類型,如表、列、視圖等,具體可以參考MSDN;
第二個參數為Restrictions的參數,作為一個oject數組資料類型,起到過濾的作用,如果把第二個參數設定為null,那就返回指定的OleDbSchemaGuid枚舉的所有資訊了。
下面用樣本程式來進行相關說明,樣本介面如下:
整個表單包括:
一個TextBox,用來輸入資料庫連接字串;
一個DataGrid,用來顯示架構資訊;
查看按鈕,點擊擷取架構資訊。
這裡以SqlServer 的Northwind資料庫為例,在查看按鈕事件中進行了如下處理:
private void buttonOK_Click(object sender, System.EventArgs e)
{
this.dataGridSchema.DataSource = GetSqlDbSchemaUsingOleDbConnection (this.textBoxConnString.Text.Trim());
}
通過文字框把連接字串傳入GetSqlDbSchemaUsingOleDbConnection函數,由OleDbConnection對象來串連資料庫,並擷取構架資訊,
private DataTable GetSqlDbSchemaUsingOleDbConnection(string connString)
{
OleDbConnection myConn = new OleDbConnection(connString);
myConn.Open();
DataTable table1 = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,null);
myConn.Close();
return table1;
}
上面的函數返回資料庫的所有欄位,下面來看看如何通過Restrictions參數來過濾資訊;
參數資料可以定義為
object[] restrictions =
new object[]{"TABLE_CATALOG","TABLE_SCHEMA","TABLE_NAME","COLUMN_NAME"};
具體可參考MSDN文檔。
對上面函數進行修改,我們只擷取Northwind 資料庫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;
}
另外對於Access資料庫結構描述資訊的擷取也可以通過上面的方法來完成,
private DataTable GetMdbSchemaUsingOleDbConnection(string connString)
{
OleDbConnection myConn = new OleDbConnection(connString);
myConn.Open();
DataTable table1 = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,null);
myConn.Close();
return table1;
}
前面的介面圖示就是執行結果,這裡我用的是Access 2003。
二.OleDbDataReader的GetSchemaTable方法
另外一個擷取架構的方法是使用OleDbDataReader的GetSchemaTable方法,
public virtual DataTable GetSchemaTable();
該方法需要結合OleDbCommand.ExecuteReader的一個重載方法才能完成,可以設定重載方法的唯一參數,
public OleDbDataReader ExecuteReader(CommandBehavior behavior);
CommandBehavior為一枚舉對象,定義為
[Flags]
[Serializable]
public enum CommandBehavior
CommandBehavior.SchemaOnly:只返回列資訊,不影響資料庫狀態;
CommandBehavior.KeyInfo:返回列和主鍵資訊。執行此查詢時不鎖定選定的行。
如果使用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表的架構資訊,當然,如果串連到Access資料庫,上面的函數只需修改一下連接字串和查詢字串就可以正確執行。
三、其他補充
我們這裡所說的是通過OleDb.NET來實現資料庫結構描述資訊的擷取。對於特定的資料提供者Sql Client.NET和Oracle Client.NET等還可以通過其他手段實現。
比如:
在Sql Server中可以通過資訊架構視圖來擷取資料:
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'
還有擷取列,預存程序等,具體可以查看SQL SERVER 的線上說明。
在Oracle資料庫中可以通過查詢Oracle資料字典來擷取這些資訊,具體可以參考Oracle的相關文檔。
本文參考:《MSDN》、《ADO.NET Core Reference》、《Sql Server 2000聯機叢書》