zoukankan      html  css  js  c++  java
  • 完美解决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

  • 相关阅读:
    大一秋学期记录
    韦尼克区受损者如何说话
    暑假训练idea汇总
    高三树洞
    OI回忆录
    NOI2018游记
    收藏
    PKUSC2018游记
    CTSC/APIO2018游记
    Caused by: org.xml.sax.SAXParseException: 外部 DTD: 无法读取外部 DTD 'mybatis-generator-config_1_0.dtd'
  • 原文地址:https://www.cnblogs.com/sexycrane/p/10436461.html
Copyright © 2011-2022 走看看