2010-06-09 39 views

回答

46

它是如此简单:

DataTable t = _conn.GetSchema("Tables"); 

其中_conn是SqlConnection对象已经连接到正确的数据库。

+0

这种方法优于基于查询的方法的优点是,您可以获取有关DataTable中表的元数据,使用查询并非易事。 (但我只是意识到你只需要名称:)) – apoorv020 2010-06-09 11:59:25

6

运行SQL命令为:

SELECT name FROM sysobjects WHERE xtype = 'U' 
4

单程参见How to get a list of SQL Server databases

System.Data.SqlClient.SqlConnection SqlCon = new System.Data.SqlClient.SqlConnection("server=192.168.0.1;uid=sa;pwd=1234"); 
SqlCon.Open(); 

System.Data.SqlClient.SqlCommand SqlCom = new System.Data.SqlClient.SqlCommand(); 
SqlCom.Connection = SqlCon; 
SqlCom.CommandType = CommandType.StoredProcedure; 
SqlCom.CommandText = "sp_databases"; 

System.Data.SqlClient.SqlDataReader SqlDR; 
SqlDR = SqlCom.ExecuteReader(); 

while(SqlDR.Read()) 
{ 
MessageBox.Show(SqlDR.GetString(0)); 
} 
+0

你甚至都不需要存储的过程:) – slugster 2010-06-09 11:01:28

+3

这是数据库,不是表作为问吧? – 2012-05-10 13:37:54

4

如果你想从数据库中获取所有表名,你可以这样做;

string[] GetAllTables(SqlConnection connection) 
{ 
    List<string> result = new List<string>(); 
    SqlCommand cmd = new SqlCommand("SELECT name FROM sys.Tables", connection); 
    System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader(); 
    while(reader.Read()) 
    result.Add(reader["name"].ToString()); 
    return result.ToArray(); 
} 

获取所有数据库使用其他响应,并创建每个连接,使用功能“GetAllTables”从该数据库获取所有的表名。

+0

你的代码确实有效。你错过了打开和关闭连接。 – 2014-05-05 09:40:05

26

只是另一种解决方案:

public IList<string> ListTables() 
    { 
     List<string> tables = new List<string>(); 
     DataTable dt = _connection.GetSchema("Tables"); 
     foreach (DataRow row in dt.Rows) 
     { 
      string tablename = (string)row[2]; 
      tables.Add(tablename); 
     } 
     return tables; 
    } 
+6

你见过slu answer的答案吗? – 2011-12-16 11:15:56

+2

'(字符串)行[2];'帮助了我。谢谢。 – 2016-08-11 12:22:02

3

的另一种方式,但值得一提: 中包含的Microsoft.SqlServer.Smo.dll API使得它非常访问数据库:

private IEnumerable<string> getAllTables() 
{ 
    var sqlConnection = new System.Data.SqlClient.SqlConnection(connectionString); 
    var serverConnection = new Microsoft.SqlServer.Management.Common.ServerConnection(sqlConnection); 
    var server = new Microsoft.SqlServer.Management.Smo.Server(serverConnection); 
    var database = server.Databases[databaseName]; 
    foreach (Microsoft.SqlServer.Management.Smo.Table table in database.Tables) 
    { 
    yield return table.Name; 
    } 
} 

最酷的事情是Microsoft.SqlServer.Management.Smo.Table对象允许您执行各种操作,如更改架构,脚本等...

2

我的版本yonexbat回答

public System.Collections.Generic.Dictionary<string, string> GetAllTables(System.Data.SqlClient.SqlConnection _connection) 
{ 
    if (_connection.State == System.Data.ConnectionState.Closed) 
     _connection.Open(); 
    System.Data.DataTable dt = _connection.GetSchema("Tables"); 
    System.Collections.Generic.Dictionary<string, string> tables = new System.Collections.Generic.Dictionary<string, string>(); 
    foreach (System.Data.DataRow row in dt.Rows) 
    { 
     if (row[3].ToString().Equals("BASE TABLE", StringComparison.OrdinalIgnoreCase)) //ignore views 
     { 
      string tableName = row[2].ToString(); 
      string schema = row[1].ToString(); 
      tables.Add(tableName, schema); 
     } 
    } 
    _connection.Close(); 
    return tables; 
} 
+1

我认为它应该是'if(row [3] .ToString()。Equals(“BASE TABLE”,StringComparison.OrdinalIgnoreCase))' – tic 2015-05-22 17:01:35

+0

谢谢我已经纠正它 – irfandar 2015-05-24 09:00:00

1

感谢Slugster的回答。以下是关于如何查看数据库中表的列表的扩展说明。

在一个asp.net形式

添加以下:

<div> 
    <asp:Button ID="GridViewTableListButton" runat="server" Text="List all Tables on server" 
     onclick="GridViewTableListButton_Click" /> 
    <asp:GridView ID="GridViewTableList" runat="server"> 
    </asp:GridView> 
</div> 

然后在C#代码后面添加以下功能:

protected void GridViewTableListButton_Click(object sender, EventArgs e) 
{ 
    objConn.Open(); 
    DataTable t = objConn.GetSchema("Tables"); 
    GridViewTableList.DataSource = t; 
    GridViewTableList.DataBind(); 
    objConn.Close(); 
} 

不忘记加

using System.Data; 

SqlConnection objConn = new SqlConnection(); 

在你的页面顶部/你的父类中。

有了您的Page_Load中:

objConn.ConnectionString = ConfigurationManager.ConnectionStrings[connString].ConnectionString; 

CONNSTRING是一个类文件(称为connectionClass.cs)存储在App_Code文件夹

public class connectionClass 
{ 
..... 
    public string connClass() 
    { 
     connString = "LocalSqlServer"; // LOCAL home PC Version 
    } 
} 

然后终于在网上。配置

<add name="LocalSqlServer" connectionString="Data Source=MyPCsName\SQLEXPRESS;Initial Catalog=databasename;Integrated Security=True" providerName="System.Data.SqlClient"/> 

例如

3

我用这ExtensionMethodSqlConnection

public static List<string> GetTableNames(this SqlConnection connection) 
{ 
    using(SqlConnection conn = connection) 
    { 
     if(conn.State == ConnectionState.Open) 
     { 
      return conn.GetSchema("Tables").AsEnumerable().Select(s => s[2].ToString()).ToList(); 
     }    
    } 
    //Add some error-handling instead ! 
    return new List<string>();   
}