使用Ado.net獲取數據庫架構信息
2024-07-10 13:03:24
供稿:網友
使用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聯機叢書》