完美解决CodeSmith无法获取MySQL表及列Description说明注释的方案

Posted SexyCrane

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了完美解决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("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();
    }

SchemaExplorer.MySQLSchemaProvider.dll及MySQL模板下载地址:https://pan.baidu.com/s/1J9I_7rWXzvgHLI5a9CafGw

下载后直接将"%安装目录%SchemaProvidersSchemaExplorer.MySQLSchemaProvider.dll"替换掉就好

原文转自:https://blog.csdn.net/nihaoapengyou/article/details/52587986

以上是关于完美解决CodeSmith无法获取MySQL表及列Description说明注释的方案的主要内容,如果未能解决你的问题,请参考以下文章

MySql查询数据库中所有表及列的信息

使用codesmith无法连接mysql问题

CodeSmith无法获取Oracle表注释

CodeSmith介绍和常见问题解决方案

java 获取mysql 某个数据库中所有表及表的列的信息

sqlserver快照复制报错,错误号:mssql_repl20052