如何获取SQL Server存储过程结果的数据类型与列名?
用Dapper操作SQL Server时,快速生成C#强类型类的实用方案
我平时用C#结合Dapper做SQL Server数据库开发的时候,一直偏爱用和数据库表结构一一对应的强类型类来做对象映射——不管是从数据库查数据转成C#对象,还是把C#对象存回数据库,都省心又不容易出错。
为了能快速基于SQL Server的表定义生成对应的强类型类,还能写单元测试确保数据层和数据库结构始终同步,我一直在用下面这个SQL查询语句:
SELECT SchemaName = c.table_schema, TableName = c.table_name, ColumnName = c.column_name, SqlDataType = c.data_type, IsNullable = c.is_nullable, MaxLength = c.character_maximum_length, NumericPrecision = c.numeric_precision, NumericScale = c.numeric_scale FROM information_schema.columns c INNER JOIN information_schema.tables t ON c.table_schema = t.table_schema AND c.table_name = t.table_name WHERE t.table_type = 'BASE TABLE' -- 仅查询实体表,排除视图 ORDER BY c.table_schema, c.table_name, c.ordinal_position
这个查询的实用价值
- 它会从SQL Server的系统视图
information_schema里提取所有实体表的核心信息:包括表的架构、表名、列名、SQL数据类型、列是否允许为空、字符类型的最大长度,还有数值类型的精度和小数位数。这些信息刚好是我们编写C#强类型类时的关键参考。 - 你可以把查询结果导出成CSV,或者直接在SSMS里查看,对照着就能快速写出对应的C#类——比如SQL的
nvarchar(50)对应C#的string,int对应int,bit对应bool,datetime对应DateTime,如果列允许为空,就用可空类型(比如int?、DateTime?)。 - 要是想更进一步自动化,还可以基于这个查询的结果写个小工具(比如C#控制台程序),直接生成对应的类文件,彻底省去手动敲代码的麻烦。
- 做单元测试的时候,你可以定期运行这个查询,把结果和现有C#类的属性做对比,一旦数据库表结构有改动,就能第一时间发现数据层的类需要更新,避免出现对象映射错误。
内容的提问来源于stack exchange,提问作者Dave Smash
相关产品推荐
相关产品推荐

