最近在公司做一個小項目,其中一部分功能涉及到要在程序中獲得數據庫的架構(元數據)信息,所謂數據庫的架構,就是數據庫的表/視圖結構,包括數據表所包含的字段名、字段類型、長度、主鍵、外鍵信息等。記得曾經也用C++Builder工具實現過相關功能,但年代久遠,源碼也沒有保存,實現方法已經完全回憶不起來了。想想反正開發工具也換成了vs,倒不如重頭再來過。
要取得數據庫架構信息倒不是一件難度很高的事,在網絡上以"數據庫元數據"為關鍵字進行搜索,會找到很多有關方法的介紹,但多半是與數據庫系統相關的方法,例如介紹在SQL Server下哪些數據表存儲了有關元數據的信息,可以通過哪些數據庫系統提供的函數來獲取等,這裡也提供兩個有關的鏈接,有興趣的可以自行去閱讀相關文章:
http://searchdatabase.techtarget.com.cn/tips/433/3388433.sHtml(如何獲取SQL Server數據庫元數據)
http://www.pipcn.com/blog/user1/master/archives/2006/1119.sHtml(獲取SQL,Access,Oracle數據庫的元數據信息)
但是我總想著能用更為通用的方法、較少的程序代碼來完成這項工作。說實話,實現了之後我發現,如果我能夠安心下來對ADO.NET進行系統的學習,其實這個問題很容易解決,但我想找現成的實現,反而耽誤了一些時間。總之是在網絡上搜索沒能找到現成的代碼,我不得不回頭再來看ADO.Net的有關文檔。這下倒是讓我很快就找到了Connection對象的GetSchema方法獲得數據表和視圖的信息,以及Command對象的ExecuteReader方法通過帶CommandBehavior.SchemaOnly參數提取表結構,這樣,實現代碼非常簡單:
/// <summary>
/// 獲取數據庫的表架構信息
/// </summary>
/// <returns>返回當前數據源的架構信息列表</returns>
public void GetSchema(out List<SqlSchemaInfo> lst)
{
lst = new List<SqlSchemaInfo>();
//GetSchema方法所需的字符串參數,Tables和VIEws分別表示數據表和視圖
string tables = System.Data.SqlClient.SqlClIEntMetaDataCollectionNames.Tables;
string views = System.Data.SqlClient.SqlClientMetaDataCollectionNames.VIEws;
//這裡創建的Connection對象僅作為示例,只實現對sqlserver和Oracle的支持
if (_providerName.Trim() == "sqlserver")
{
&nb