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("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();
            }
  • 相关阅读:
    Entity Framework框架 (一)
    webAPI的常用操作
    图片添加水印和生成验证码
    ASP.NET中Page_Load()与Page_Init()的区别
    session常用操作
    非递归解决组合问题
    TemplateDoesNotExist 异常
    [android]不解锁刷机
    论记忆化搜索
    flex builder 4
  • 原文地址:https://www.cnblogs.com/xinzheng/p/5809766.html
Copyright © 2011-2022 走看看