C#取資料庫名稱與資料庫中表名的方法

iSQlServer發表於2009-10-22
在很多情況下我們需要將指定的資料庫中的所有表都列出來。在使用c#進行軟體開發時,我們有哪些方法可是實現這個目的呢?本人對此進行概要的總結,有以下6中方式可以實現這個目的。

1、sqldmo
SQLDMO是操作SQLServer的理想的方式,如果您的資料庫是SQLServer就可以考慮使用這種方式。在C#中使用SQLDMO需要新增SQLDMO的引用,然後在當前的檔案中using SQLDMO;即可以使用SQLDMO。SQLDMO的物件模型大家可以在SQLServer的幫助中獲得。
  1.         private void GetTabels_DMO(string strServerName,string strUser,string strPWD,string strDatabase)   
  2.         {   
  3.             SQLDMO.SQLServer Server = new SQLDMO.SQLServerClass();                   
  4.             //連線到伺服器   
  5.             Server.Connect(strServerName,strUser,strPWD);   
  6.             //對所有的資料庫遍歷,獲得指定資料庫   
  7.             for(int i=0;i
  8.             {   
  9.                 //判斷當前資料庫是否是指定資料庫   
  10.                 if(Server.Databases.Item(i+1,"dbo").Name ==strDatabase)   
  11.                 {   
  12.                     //獲得指定資料庫   
  13.                     SQLDMO._Database db= Server.Databases.Item(i+1,"dbo");   
  14.                     //獲得指定資料庫中的所有表   
  15.                     for(int j=0;j
  16.                     {   
  17.                         MessageBox.Show(db.Tables.Item(j+1,"dbo").Name);   
  18.                     }   
  19.                 }   
  20.             }   
  21.         }  
        private void GetTabels_DMO(string strServerName,string strUser,string strPWD,string strDatabase)         {             SQLDMO.SQLServer Server = new SQLDMO.SQLServerClass();                             //連線到伺服器             Server.Connect(strServerName,strUser,strPWD);             //對所有的資料庫遍歷,獲得指定資料庫             for(int i=0;i
2、adox

adox是ado Extensions for DDL and Security,是微軟對ADO技術的擴充套件,使用它我們可以運算元據庫的結構。它是一個COM元件,估計以後在ADO.NET中會增加ADOX的一些功能。如果大家需要ADOX的一些資料,我可以提供。下面的一個例子就是使用ADOX來獲得當前資料庫的所有表。
  1.       private void GetTables_ADOX()   
  2.         {   
  3.             //ADO的資料庫連線   
  4.             ADODB.ConnectionClass cn=new ADODB.ConnectionClass();   
  5.             string ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=Test;Data Source=HBXP";   
  6.             cn.Open(ConnectionString,"sa","",0);   
  7.             //操作ADOX的Catalog物件   
  8.             CatalogClass cat=new CatalogClass();   
  9.             cat.ActiveConnection=cn;   
  10.             for(int i=0;i
  11.             {   
  12.                 MessageBox.Show(cat.Tables[i].Name);   
  13.             }   
  14.         }  
      private void GetTables_ADOX()         {             //ADO的資料庫連線             ADODB.ConnectionClass cn=new ADODB.ConnectionClass();             string ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=Test;Data Source=HBXP";             cn.Open(ConnectionString,"sa","",0);             //操作ADOX的Catalog物件             CatalogClass cat=new CatalogClass();             cat.ActiveConnection=cn;             for(int i=0;i注意:在上面的程式碼中cat.ActiveConnection不能是ADO.Net中的Connection,而應該是ADO的Connection。

3、ado.net中的oledbconnection

在c#中我們首先會考慮使用ado.net來解決問題,如果沒有方法才會考慮使用adox或者sqldmo來解決這個問題。雖然adox和sqldmo也能夠解決這個問題,但是他們畢竟是com元件,在.net中使用起來和在非.net平臺會有一些差異,不是很順手。下面的示例就顯示了在ado.net中的oledbconnection的方法getoledbschematable來獲得資料庫的架構。大家可以在msdn中看到這個方法的說明:
  1. public DataTable GetOleDbSchemaTable(   
  2.    Guid schema,   
  3.    object[] restrictions);  
public DataTable GetOleDbSchemaTable(    Guid schema,    object[] restrictions);
引數
schema
OleDbSchemaGuid 的值之一,它指定要返回的架構表。
restrictions
限制值的 Object 陣列。這些值按照限制列的順序來應用。即,第一個限制值應用於第一個限制列,第二個限制值應用於第二個限制列,依此類推。
返回值
包含請求的架構資訊的 DataTable。
更多的資訊大家可以查詢MSDN,下面將示例如何實現。
  1.      private void GetTables_ADONET()   
  2.         {   
  3.             //處理OleDbConnection   
  4.             string strConnectionString=@"Integrated Security=SSPI;Data Source=HBXP;Initial Catalog=Test;Provider=SQLOLEDB.1";   
  5.             OleDbConnection cn=new OleDbConnection(strConnectionString);   
  6.             cn.Open();   
  7.             //利用OleDbConnection的GetOleDbSchemaTable來獲得資料庫的結構   
  8.             DataTable dt = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {nullnullnull"TABLE"});   
  9.             foreach (DataRow dr in  dt.Rows)   
  10.             {   
  11.                 MessageBox.Show((String)dr["TABLE_NAME"]);   
  12.             }   
  13.               
  14.         }  
     private void GetTables_ADONET()         {             //處理OleDbConnection             string strConnectionString=@"Integrated Security=SSPI;Data Source=HBXP;Initial Catalog=Test;Provider=SQLOLEDB.1";             OleDbConnection cn=new OleDbConnection(strConnectionString);             cn.Open();             //利用OleDbConnection的GetOleDbSchemaTable來獲得資料庫的結構             DataTable dt = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {null, null, null, "TABLE"});             foreach (DataRow dr in  dt.Rows)             {                 MessageBox.Show((String)dr["TABLE_NAME"]);             }                    }
4、資訊架構檢視

資訊架構檢視是sql-92 標準中定義的架構檢視,這些檢視獨立於系統表。資訊架構檢視的最大優點是,即使我們對系統表進行了重要的修改,應用程式也可以正常地使用這些檢視進行訪問。下面的示例使用資訊架構檢視來工作。
  1.      private void GetTables_INFORMATION_SCHEMA()   
  2.         {   
  3.             //開啟連線   
  4.             string strConnectionString=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];   
  5.             sqlcn=new SqlConnection(strConnectionString);   
  6.             sqlcn.Open();   
  7.             //使用資訊架構檢視   
  8.             SqlCommand sqlcmd=new SqlCommand("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'",sqlcn);   
  9.             SqlDataReader dr=sqlcmd.ExecuteReader();   
  10.             while(dr.Read())   
  11.             {   
  12.                 MessageBox.Show(dr.GetString(0));   
  13.             }   
  14.         }  
     private void GetTables_INFORMATION_SCHEMA()         {             //開啟連線             string strConnectionString=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];             sqlcn=new SqlConnection(strConnectionString);             sqlcn.Open();             //使用資訊架構檢視             SqlCommand sqlcmd=new SqlCommand("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'",sqlcn);             SqlDataReader dr=sqlcmd.ExecuteReader();             while(dr.Read())             {                 MessageBox.Show(dr.GetString(0));             }         }
5、使用系統表

如果您的資料庫系統是sqlserver,就可以使用如下的方式來獲得當前資料庫的所有表:
  1.      private void GetTables_SystemTable()   
  2.         {   
  3.             //開啟連線   
  4.             string strConnectionString=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];   
  5.             sqlcn=new SqlConnection(strConnectionString);   
  6.             sqlcn.Open();   
  7.             //使用資訊架構檢視   
  8.             SqlCommand sqlcmd=new SqlCommand("SELECT OBJECT_NAME (id) FROM sysobjects WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0",sqlcn);   
  9.             SqlDataReader dr=sqlcmd.ExecuteReader();   
  10.             while(dr.Read())   
  11.             {   
  12.                 MessageBox.Show(dr.GetString(0));   
  13.             }   
  14.         }  
     private void GetTables_SystemTable()         {             //開啟連線             string strConnectionString=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];             sqlcn=new SqlConnection(strConnectionString);             sqlcn.Open();             //使用資訊架構檢視             SqlCommand sqlcmd=new SqlCommand("SELECT OBJECT_NAME (id) FROM sysobjects WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0",sqlcn);             SqlDataReader dr=sqlcmd.ExecuteReader();             while(dr.Read())             {                 MessageBox.Show(dr.GetString(0));             }         }
6、使用sqlserver的儲存過程“sp_tables”

下面是“盛國軍”朋友提出的使用儲存過程的方法的補充程式碼。
  1.      public void GetTables_StoredProcedure()   
  2.         {   
  3.             //處理OleDbConnection   
  4.             string strConnectionString=@"Integrated Security=SSPI;Data Source=HBXP;Initial Catalog=Test;Provider=SQLOLEDB.1";   
  5.             OleDbConnection cn=new OleDbConnection(strConnectionString);   
  6.             cn.Open();   
  7.             //執行儲存過程   
  8.             OleDbCommand cmd=new OleDbCommand("sp_tables",cn);   
  9.             cmd.CommandType=CommandType.StoredProcedure;   
  10.             OleDbDataReader dr=cmd.ExecuteReader();   
  11.             while(dr.Read())   
  12.             {   
  13.                 MessageBox.Show(dr["TABLE_NAME"].ToString());   
  14.             }   
  15.         }  
     public void GetTables_StoredProcedure()         {             //處理OleDbConnection             string strConnectionString=@"Integrated Security=SSPI;Data Source=HBXP;Initial Catalog=Test;Provider=SQLOLEDB.1";             OleDbConnection cn=new OleDbConnection(strConnectionString);             cn.Open();             //執行儲存過程             OleDbCommand cmd=new OleDbCommand("sp_tables",cn);             cmd.CommandType=CommandType.StoredProcedure;             OleDbDataReader dr=cmd.ExecuteReader();             while(dr.Read())             {                 MessageBox.Show(dr["TABLE_NAME"].ToString());             }         }

獲取資料庫名稱的方法

以下示例返回當前資料庫的名稱。
  1. SELECT DB_NAME() AS [Current Database];  
SELECT DB_NAME() AS [Current Database];
GOB. 返回指定資料庫 ID 的資料庫名稱
以下示例返回資料庫 ID3的資料庫名稱。

  1. USE master;   
  2. GO   
  3. SELECT DB_NAME(3)AS [Database Name];   
  4. GO 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-617162/,如需轉載,請註明出處,否則將追究法律責任。

相關文章