c# - 如何在 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 中一样,不仅是数据库和表。
解决方案
好吧,如果您使用sys.objects
它将列出所有与数据库相关的对象。您需要的唯一技巧是拥有一个sysadmin
可以查看所有数据库的帐户。然后,您可以只针对每个数据库对象。
所以,你需要的是:
- 获取数据库名称列表
- 定位每个数据库对象
- 根据需要过滤对象。
这是一个工作示例。
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();
我试图让它尽可能简单,所以你可以理解。
推荐阅读
- java - XML 到 JAVA (JAXB) 错误 - “SYSTEM”和系统标识符之间需要空格
- drupal-8 - 增加 Drush 9 的内存限制(不更改 php.ini 文件)
- python - Scikit-learn 机器学习模型使用多个 CPU 进行训练
- reactjs - 在特定页面上隐藏组件
- c# - 如何拦截.net框架类库的方法?[C#]
- node.js - 如何在 Windows 中为不同的 React 项目使用不同版本的 Nodejs
- ios - 将 RSS 提要加载到 IOS Swift
- npm - @material-ui/core 是否有 Typescript 类型?
- amazon-web-services - 如何为 AWS EC2 实例、S3 存储桶设置内存不足警报?
- go - 是否关闭通道块直到接收器读取它