Silentdoer

导航

解决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)    收藏  举报