如何捕获SQL Server中sp_columns的执行结果以获取表结构?
如何捕获SQL Server中sp_columns的执行结果
嘿,很高兴能帮你解决这个问题!你已经定义了ResultSchema类来接收sp_columns的返回结果,接下来只需要用ADO.NET或者轻量ORM工具(比如Dapper)来执行存储过程并完成结果映射就行,我给你两种常用的实现方案:
方案一:原生ADO.NET手动映射
这是最基础的实现方式,不需要额外依赖第三方库,完全用.NET自带的System.Data.SqlClient组件:
using System.Data; using System.Data.SqlClient; using System.Collections.Generic; // 先补全你的ResultSchema类,把sp_columns返回的所有列都对应上 public class ResultSchema { public object TABLE_QUALIFIER { get; set; } public object TABLE_OWNER { get; set; } public object TABLE_NAME { get; set; } public object COLUMN_NAME { get; set; } public object DATA_TYPE { get; set; } public object TYPE_NAME { get; set; } public object PRECISION { get; set; } public object LENGTH { get; set; } public object SCALE { get; set; } public object RADIX { get; set; } public object NULLABLE { get; set; } public object REMARKS { get; set; } public object COLUMN_DEF { get; set; } public object SQL_DATA_TYPE { get; set; } public object SQL_DATETIME_SUB { get; set; } public object CHAR_OCTET_LENGTH { get; set; } public object ORDINAL_POSITION { get; set; } public object IS_NULLABLE { get; set; } } public class TableSchemaReader { public List<ResultSchema> GetTableColumns(string connectionString, string tableName) { var columnList = new List<ResultSchema>(); using (var connection = new SqlConnection(connectionString)) { connection.Open(); // 初始化存储过程命令 using (var command = new SqlCommand("sp_columns", connection)) { command.CommandType = CommandType.StoredProcedure; // 添加表名参数,sp_columns会根据这个参数返回对应表的结构 command.Parameters.AddWithValue("@table_name", tableName); // 执行命令并读取结果 using (var reader = command.ExecuteReader()) { while (reader.Read()) { var schema = new ResultSchema { TABLE_QUALIFIER = reader["TABLE_QUALIFIER"], TABLE_OWNER = reader["TABLE_OWNER"], TABLE_NAME = reader["TABLE_NAME"], COLUMN_NAME = reader["COLUMN_NAME"], DATA_TYPE = reader["DATA_TYPE"], TYPE_NAME = reader["TYPE_NAME"], PRECISION = reader["PRECISION"], LENGTH = reader["LENGTH"], SCALE = reader["SCALE"], RADIX = reader["RADIX"], NULLABLE = reader["NULLABLE"], REMARKS = reader["REMARKS"], COLUMN_DEF = reader["COLUMN_DEF"], SQL_DATA_TYPE = reader["SQL_DATA_TYPE"], SQL_DATETIME_SUB = reader["SQL_DATETIME_SUB"], CHAR_OCTET_LENGTH = reader["CHAR_OCTET_LENGTH"], ORDINAL_POSITION = reader["ORDINAL_POSITION"], IS_NULLABLE = reader["IS_NULLABLE"] }; columnList.Add(schema); } } } } return columnList; } }
方案二:用Dapper自动映射(更简洁)
如果你不想手动写映射代码,可以用Dapper这个轻量ORM,它会自动将查询结果映射到你的ResultSchema类,代码量大大减少:
首先需要通过NuGet安装Dapper包:Install-Package Dapper(或者在Visual Studio的NuGet包管理器里搜索安装)
然后实现代码:
using Dapper; using System.Collections.Generic; using System.Data.SqlClient; // 同样确保你的ResultSchema类属性名和sp_columns返回列名完全匹配 public class ResultSchema { public object TABLE_QUALIFIER { get; set; } public object TABLE_OWNER { get; set; } public object TABLE_NAME { get; set; } public object COLUMN_NAME { get; set; } public object DATA_TYPE { get; set; } public object TYPE_NAME { get; set; } public object PRECISION { get; set; } // 其他剩余属性补全... } public class TableSchemaReader { public List<ResultSchema> GetTableColumns(string connectionString, string tableName) { using (var connection = new SqlConnection(connectionString)) { connection.Open(); // Dapper会自动匹配属性名和列名,直接返回映射后的列表 return connection.Query<ResultSchema>( "sp_columns", new { table_name = tableName }, commandType: CommandType.StoredProcedure ).ToList(); } } }
几个关键注意事项
- 属性名匹配:不管用哪种方式,
ResultSchema类的属性名必须和sp_columns返回的列名完全一致(包括下划线),否则映射会失败; - 类型优化:你可以把
object类型改成更具体的可空值类型,比如int? DATA_TYPE、string COLUMN_NAME,这样代码更健壮,避免后续类型转换的麻烦; - 参数扩展:
sp_columns还支持@table_owner(架构名)、@table_qualifier(数据库名)等参数,如果你需要查询特定架构或数据库下的表,可以在命令中添加这些参数; - 异常处理:实际使用时建议添加
try-catch块处理数据库连接、执行过程中可能出现的异常,比如连接失败、表不存在等情况。
内容的提问来源于stack exchange,提问作者Lolidze
相关产品推荐
相关产品推荐

