解决CodeSmith无法获取MySQL表及列Description说明注释的方案
public ExtendedProperty[] GetExtendedProperties(string connectionString, SchemaObjectBase schemaObject) { List<ExtendedProperty> extendedProperties = new List<ExtendedProperty>(); if (schemaObject is ColumnSchema) { ColumnSchema columnSchema = schemaObject as ColumnSchema; string commandText = string.Format(@"SELECT EXTRA, COLUMN_DEFAULT, COLUMN_TYPE,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{0}' AND TABLE_NAME = '{1}' AND COLUMN_NAME = '{2}'", columnSchema.Table.Database.Name, columnSchema.Table.Name, columnSchema.Name); using (DbConnection connection = CreateConnection(connectionString)) { connection.Open(); DbCommand command = connection.CreateCommand(); command.CommandText = commandText; command.Connection = connection; using (IDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection)) { while (reader.Read()) { string extra = reader.GetString(0).ToLower(); bool columndefaultisnull = reader.IsDBNull(1); string columndefault = ""; if (!columndefaultisnull) { columndefault = reader.GetString(1).ToUpper(); } string columntype = reader.GetString(2).ToUpper(); string columncomment = reader.GetString(3); bool isIdentity = (extra.IndexOf("auto_increment") > -1); extendedProperties.Add(new ExtendedProperty(ExtendedPropertyNames.IsIdentity, isIdentity, columnSchema.DataType)); if (isIdentity) { /* MySQL auto_increment doesn't work exactly like SQL Server's IDENTITY I believe that auto_increment is equivalent to IDENTITY(1, 1) However, auto_increment behaves differently from IDENTITY when used with multi-column primary keys. See the MySQL Reference Manual for details. */ extendedProperties.Add(new ExtendedProperty(ExtendedPropertyNames.IdentitySeed, 1, columnSchema.DataType)); extendedProperties.Add(new ExtendedProperty(ExtendedPropertyNames.IdentityIncrement, 1, columnSchema.DataType)); } extendedProperties.Add(new ExtendedProperty("CS_ColumnDefaultIsNull", columndefaultisnull, DbType.Boolean)); // Added for Backwards Compatibility. extendedProperties.Add(new ExtendedProperty(ExtendedPropertyNames.DefaultValue, columndefault, DbType.String)); extendedProperties.Add(new ExtendedProperty("CS_ColumnDefault", columndefault, DbType.String)); // Added for Backwards Compatibility. extendedProperties.Add(new ExtendedProperty(ExtendedPropertyNames.SystemType, columntype, DbType.String)); extendedProperties.Add(new ExtendedProperty("CS_ColumnType", columntype, DbType.String)); // Added for Backwards Compatibility. extendedProperties.Add(new ExtendedProperty("CS_ColumnExtra", extra.ToUpper(), DbType.String)); extendedProperties.Add(new ExtendedProperty("CS_Description", columncomment, DbType.String)); } if (!reader.IsClosed) reader.Close(); } if (connection.State != ConnectionState.Closed) connection.Close(); } } if (schemaObject is TableSchema) { TableSchema tableSchema = schemaObject as TableSchema; string commandText = string.Format(@"SHOW CREATE TABLE `{0}`.`{1}`", tableSchema.Database.Name, tableSchema.Name); using (DbConnection connection = CreateConnection(connectionString)) { connection.Open(); DbCommand command = connection.CreateCommand(); command.CommandText = commandText; command.Connection = connection; using (IDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection)) { while (reader.Read()) { string createtable = reader.GetString(1); //extendedProperties.Add(new ExtendedProperty("CS_CreateTableScript", createtable, DbType.String)); extendedProperties.Add(new ExtendedProperty("TS_Description", createtable, DbType.String)); int engineIndex = createtable.LastIndexOf("ENGINE"); int commentIndex = createtable.LastIndexOf("COMMENT="); string tableDescription = reader.GetString(0); if (commentIndex > engineIndex) { tableDescription = createtable.Substring(commentIndex + 9).Replace("'", ""); } extendedProperties.Add(new ExtendedProperty("CS_Description", tableDescription, DbType.String)); } if (!reader.IsClosed) reader.Close(); } if (connection.State != ConnectionState.Closed) connection.Close(); } } return extendedProperties.ToArray(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!