繁体   English   中英

从服务器 C# 上的特定数据库中检索表列表

[英]Retrieve List of Tables from Specific Database on Server C#

如何从服务器上的特定数据库中将表的名称检索到List<string>中?

System.Data.SqlClient无需对 sys.Tables 进行正式查询即可满足您的需求(尽管这是它在后台使用的)。 使用SqlConnection object 上的GetSchema()方法并指定您想要“表”,它会向您发送一个DataTable object,其中每个表都有一行。 它在每一行(按该列顺序)中发回数据库名称、表模式名称、表名称和表类型。 代码如下所示:

public static List<string> GetTables(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        DataTable schema = connection.GetSchema("Tables");
        List<string> TableNames = new List<string>();
        foreach (DataRow row in schema.Rows)
        {
            TableNames.Add(row[2].ToString());
        }
        return TableNames;
    }
}

对于 SQL Server 2005 及更高版本:

using (SqlConnection connection = new SqlConnection(@"Data Source=(local);Integrated Security=True;Initial Catalog=DB_Name;")) {
    connection.Open();

    using (SqlCommand command = connection.CreateCommand()) {
        command.CommandText =
            @"SELECT s.name, o.name
            FROM sys.objects o WITH(NOLOCK)
            JOIN sys.schemas s WITH(NOLOCK)
            ON o.schema_id = s.schema_id
            WHERE o.is_ms_shipped = 0 AND RTRIM(o.type) = 'U'
            ORDER BY s.name ASC, o.name ASC";

        using (SqlDataReader reader = command.ExecuteReader()) {
            while (reader.Read()) {
                string schemaName = reader.GetString(0);
                string tableName = reader.GetString(1);

                // your code goes here...
            }
        }
    }
}

要从数据库(SQlServer)中获取所有用户定义的表,我们必须查询系统目录。

SELECT  Name from Sysobjects where xtype = 'u' 

此查询将返回数据库中所有用户定义的表

我认为这个 SQL 应该在你的数据库中返回一个包含 tableNames 的表:

SELECT * FROM information_schema.tables

您可以使用 LINQ 查询相当容易地获取所有表名称:

public List<string> GetSqlTables(SqlConnection conn)
    => (from DataRow row in conn.GetSchema("Tables").Rows.Cast<DataRow>() 
        select row["TABLE_NAME"].ToString()).ToList();

.Net Core 扩展使用SqlConnection打开/关闭连接。

public static class SQLExtensions
{
    public static List<string> GetTableNames(this SqlConnection connection)
    {
        using (connection)
        {
            connection.Open();

            return connection.GetSchema("Tables")
                             .Rows
                             .Cast<DataRow>()
                             .Select(row => row["TABLE_NAME"].ToString())
                             .OrderBy(nme => nme)
                             .ToList();

        } // Auto Close exiting the block
    }
}
用法(Linqpad)
var connectionStr = @"Data Source=.;Integrated Security=SSPI;Initial Catalog=Rasa";

(new SqlConnection(connectionStr).GetTableNames()).Dump();

这是我的解决方案:

    public void opencon()
    {
        if (conn == null)
        {
            conn = new SqlConnection(@"Your connection");
        }
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }
    }
    public void Closecon()
    {
        if ((conn != null) && (conn.State == ConnectionState.Open))
        {
            conn.Close();
        }
    }
   public void GetTables(ComboBox cb)
    {
            chuoiketnoi();
            DataTable schema = conn.GetSchema("Tables");
            foreach (DataRow row in schema.Rows)
            {
                cb.Items.Add(row[2].ToString());
            }
            dongketnoi();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM