完美解决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

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

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

原文地址:https://www.cnblogs.com/sexycrane/p/10436461.html

时间: 2024-08-30 05:00:54

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

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

public ExtendedProperty[] GetExtendedProperties(string connectionString, SchemaObjectBase schemaObject) { List<ExtendedProperty> extendedProperties = new List<ExtendedProperty>(); if (schemaObject is ColumnSchema) { ColumnSchema columnSchema =

获取数据表中列的描述值

原文:获取数据表中列的描述值 前面有写过<MS SQL为字段添加说明>https://www.cnblogs.com/insus/p/12106589.html 现如今,我们获取这些字段的描述值. 先来看一句SELECT语句: SELECT * FROM sys.extended_properties GO Source Code 如上SQL语句,虽然得到描述的值,但我们不清楚是哪一张表,和哪一个字段的说明. 因此,得使用系统另外对象来关联查询: SELECT t.[name] AS [Tab

MySQL 表和列的注释

像代码一样,可以为表以及表中的列添加注释,方便其他人知晓其功能.对于一些字段,在经过一定时间后,创建者未必也能想起其具体的含意,所以注释显得尤为重要. 注释的添加 注释的添加是通过在定义表或列的时候在末尾加上 COMMENT 关键字来实现的,最长支持 1024 个字符. 可以在创建表的时候为表和列添加相应的注释. CREATE TABLE test_comment ( id SERIAL PRIMARY KEY, col1 INT comment '列的注释' ) comment '表的注释';

CodeSmith无法获取Oracle表注释

如题:安装CodeSmith5.2版本,SQLServer没有任何问题,而Oracle就只能获取列的注释而不能获取表的注释,经过多方面查找资料后找到了一个最重要的解决方案,Sql语句,如下:select * from user_tab_comments这句Sql语句的作用就是查询系统中所有表的注释,而我们只需要加入条件就可以查询到注释,代码如下: //获得表的注释,Oracle专用 public string GetTableDescription(){ string result=""

在.net core中完美解决多租户分库分表的问题

前几天有人想做一个多租户的平台,每个租户一个库,可以进行水平扩展,应用端根据登录信息,切换到不同的租户库 计划用ef core实现,他们说做不出来,需要动态创建dbContext,不好实现 然而这个使用CRL很轻松就能解决了 以下为演示数据库,有两个库testdb和testdb2,查询结果如下 目标: 根据传入登录信息连不不同的库,查询返回结果,如登录人为01,返回d1.default,登录人为02 返回 d2.default 实际上这个需求就是分库分表的实现,通过设置数据库/表映射关系,根据传

MYSQL表根据列拆分的问题

前言:项目中有这么一个需求,对一张已经成型的表拆分出一张子表,用来保存原来表的大字段的问题.要求子表的一列是主表的主键. 数据库:MYSQL 案例: 主表:user 字段: 图1 子表:user_copy 字段:id,zid,password (user_copy.zid = user.id) 如图: 主表: 图2 操作: 1.复制主表2个字段,id和password,并修改字段id为zid 图3 2.取消zid自增,不取消会在新主键id继续增加:如图: 图4 取消zid主键自增后保存: 在zi

快速创建和mysql表对应的java domain实体类

今天创建了一个表有十几个字段,创建完之后必然要写一个与之对应的java domain实体类.这不是重复的工作吗?为什么不先把这个表的所有的字段查出来,然后放到linux环境下,用sed工具在每一行的前面加上"private String ",每一行的后面添加";".这样可以节省很多重复工作.下面上sql代码和sed命令. 查询一个mysql表所有列的列名的sql代码如下: SELECT COLUMN_NAME FROM information_schema.COLU

完美解决mysql下utf-8的乱码问题

建表时先加上default charset=utf8; 插入中文数据之前(Mysql命令提示符下)是用set names gb2312; 在php页面中设置是mysql_query('SET NAMES UTF8'); 在php页面(已设定为utf8后)中插入中文数据不会出现乱码,应该插入数据库的时候就是以utf8字符集插入中文数据的故不会出现问题! 在php页面前面不要忘了加上header('content-type;text/html;charset=utf-8'); 大家在MySQL命令提

MySQL获取Schema表名和字段信息

MySQL获取Schema表名和字段信息 获取表名 select TABLE_NAME,TABLE_TYPE,ENGINE,TABLE_ROWS,TABLE_COMMENT,CREATE_TIME,UPDATE_TIME, CHECK_TIME from information_schema.TABLES where TABLE_SCHEMA='t_shop' ; 获取字段名 select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NUL