解决CodeSmith不能生成表和字段注释的代码修改
注意,下面的代码修改的是CodeSmith根目录下的/SchemaProviders/SchemaExplorer.MySQLSchemaProvider.dll(里面另外一个GetDbType(..)和GetTableColumns(..)也是很重要的方法,其中GetDbType是将数据库中的类型统一映射成CodeSmith的使得多种数据库在CodeSmith的csmap里写映射表时可以统一)
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 isUnsigned = columntype.ToLower().IndexOf("unsigned", StringComparison.Ordinal) > -1; 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));
extendedProperties.Add(new ExtendedProperty("CS_IsUnsigned", isUnsigned, DbType.Boolean)); } 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("CS_ShowCreateTable", createtable, DbType.String)); int engineIndex = createtable.LastIndexOf("ENGINE", StringComparison.Ordinal); int commentIndex = createtable.LastIndexOf("COMMENT=", StringComparison.Ordinal); string tableDescription = string.Empty; if (commentIndex > engineIndex && engineIndex != -1 && commentIndex != -1) { tableDescription = createtable.Substring(commentIndex + 9).Replace("'", ""); } else { tableDescription = reader.GetString(0); }
extendedProperties.Add(new ExtendedProperty("CS_Description", tableDescription, DbType.String));
} if (!reader.IsClosed) reader.Close(); } if (connection.State != ConnectionState.Closed) connection.Close(); } } return extendedProperties.ToArray(); }
posted on 2016-11-25 15:05 Silentdoer 阅读(608) 评论(0) 收藏 举报
浙公网安备 33010602011771号