首页 > 解决方案 > 如何在 c# 树视图中获取包含所有表和过程、视图等的数据库名称

问题描述

实际上,我想获取数据库名称,就像在 SQL Management Studio 中一样,左侧 Spinner Bar 与 C# 树视图中的相同。

我正在开发一个通过应用程序进行数据库控制的系统,因此我获取了所有数据库名称和所有表名称,但我没有获取每个数据库及其表,就像在 SQL Management Studio 中一样,其中一个数据库有 4 到 5 个节点,包括(表格、视图、程序等)。而且我在一个列表中获取,所以我想在树视图中获取,就像在 SQL Management Studio 中一样。

对于后端(业务逻辑),我使用了它并获取了所有数据库名称和所有没有相应序列的表。

 public List<string> GetDatabaseList()
        {
            List<string> list = new List<string>();
            using (SqlConnection con = new SqlConnection(MyConString))
            {
                con.Open();
                using (SqlCommand cmd = new SqlCommand("SELECT name from 
sys.databases", con))
                {
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            list.Add(dr[0].ToString());
                        }
                    }
                }
            }
            return list;
        }

 public List<string> GetTableList()
        {
            List<string> list = new List<string>();
            using (SqlConnection con = new SqlConnection(MyConString))
            {
                con.Open();
                using (SqlCommand cmd = new SqlCommand("SELECT name from 
sys.Tables", con))
                {
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            list.Add(dr[0].ToString());
                        }
                    }
                }
            }
            return list;
        }

并通过anycomponents.datasource由前端使用。

我的预期输出是我想获取数据库的所有相应节点就像在 SQL Management Studio 中一样,不仅是数据库和表。

标签: c#sqlsql-server

解决方案


好吧,如果您使用sys.objects它将列出所有与数据库相关的对象。您需要的唯一技巧是拥有一个sysadmin可以查看所有数据库的帐户。然后,您可以只针对每个数据库对象。

所以,你需要的是:

  1. 获取数据库名称列表
  2. 定位每个数据库对象
  3. 根据需要过滤对象。

这是一个工作示例。

public enum DbObjectType
{
    SYSTEM_TABLE,
    USER_TABLE,
    VIEW,
    SQL_STORED_PROCEDURE
}
public class SqlServerDbObjects
{
    const string connectionString = @"Data Source=.\;Initial Catalog=master;Integrated Security=True";
    public IDictionary<string, IList<string>> GetDbObjects()
    {
        var dbNameList = GetDatabaseList();

        var dbObj = new Dictionary<string, IList<string>>();

        for (int x = 0; x < dbNameList.Count; x++)
        {
            var name = dbNameList[x];

            var objList = GetDatabaseObjectsList(name, DbObjectType.USER_TABLE);

            dbObj.Add(name, objList);
        }

        return dbObj;

    }
    public IList<string> GetDatabaseList()
    {
        const string sql = "SELECT [name] FROM sys.databases WHERE database_id > 4";

        return Reader(sql, "name");
    }
    public IList<string> GetDatabaseObjectsList(string databaseName, DbObjectType objType)
    {
        StringBuilder sb = new StringBuilder(string.Empty);

        if (string.IsNullOrEmpty(databaseName))
            throw new NullReferenceException("You must specify a database");
        else
            sb.Append($"SELECT [name] FROM [{databaseName}].sys.objects WHERE [type_desc] = '{objType.ToString()}'");

        return Reader(sb.ToString(), "name");
    }
    public IList<string> Reader(string query, string columnName)
    {
        var list = new List<string>();

        try
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                connection.Open();

                using (SqlDataReader dataReader = command.ExecuteReader())
                {
                    while (dataReader.Read())
                    {
                        list.Add(dataReader[columnName].ToString());
                    }
                }


            }

            return list;
        }
        catch (SqlException ex)
        {
            // do stuff for handling sql errors.
            return null;
        }
    }

}

然后你就这样做:

var test =  new SqlServerDbObjects().GetDbObjects();

我试图让它尽可能简单,所以你可以理解。


推荐阅读