C#项目中MySQL不指定库名如何获取当前库所有列信息?
解答
核心结论
两个需求都可以实现,不需要在查询语句的WHERE子句中硬编码数据库名,所有配置完全依赖连接字符串即可完成。
实现原理
MySQL自带的INFORMATION_SCHEMA.COLUMNS系统表存储了所有实例下所有数据库的列元数据,配合MySQL内置的DATABASE()函数,就可以自动获取当前连接默认绑定的数据库名,该默认库就是你在连接字符串Database/Initial Catalog参数中指定的库。
可直接使用的查询语句
以下SQL不需要修改任何固定参数,会自动适配当前连接字符串绑定的数据库:
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, CHARACTER_MAXIMUM_LENGTH, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE();
注:如果你的数据库账号有多个库的访问权限,该查询也只会返回连接字符串指定库的列信息,不会涉及其他库的数据。
C# 调用示例(以MySqlConnector驱动为例)
全程不需要在代码中硬编码数据库名,仅依赖连接字符串配置:
// 仅需在连接字符串中指定Database参数即可,无需其他位置写库名 var connectionString = "server=你的服务地址;user=你的账号;password=你的密码;database=目标库名;"; using var conn = new MySqlConnection(connectionString); conn.Open(); var cmd = new MySqlCommand(@" SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, CHARACTER_MAXIMUM_LENGTH, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE(); ", conn); using var reader = cmd.ExecuteReader(); while (reader.Read()) { var tableName = reader.GetString("TABLE_NAME"); var columnName = reader.GetString("COLUMN_NAME"); var dataType = reader.GetString("DATA_TYPE"); // 按需读取其他字段即可 }
扩展适配
如果后续需要切换查询的数据库,仅需修改连接字符串中的Database参数,不需要修改任何查询逻辑;如果需要过滤掉视图仅保留业务表,在WHERE子句追加AND TABLE_TYPE = 'BASE TABLE'即可。
内容的提问来源于stack exchange,提问作者user3559195
相关产品推荐
相关产品推荐

