mysql生成model存储过程

本文介绍了一种基于MySQL存储过程的C#实体类自动生成方法。通过输入数据库名称和表名,该过程能自动创建对应的C#实体类,包括属性及注释等。它考虑了多种MySQL数据类型到C#类型的映射,并支持可空类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DELIMITER $$

USE `数据库`$$

DROP PROCEDURE IF EXISTS `GetCSharpModel`$$

CREATE DEFINER=`root`@`%` PROCEDURE `GetCSharpModel`(IN pDataBaseName VARCHAR(255),IN pTableName VARCHAR(255))
BEGIN
DECLARE vClassName VARCHAR(255);
DECLARE vClassCode MEDIUMTEXT;
DECLARE colComment VARCHAR(1024);
DECLARE colType VARCHAR(1024);
DECLARE fName VARCHAR(1024);
DECLARE fNameNew VARCHAR(1024);
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE code_cursor CURSOR FOR 
            SELECT ColumnComment,ColumnType,FieldName FROM temp1; 
DECLARE CONTINUE HANDLER FOR 
            NOT FOUND SET v_finished = 1;
            -- 生成实体类名
            SELECT REPLACE(GROUP_CONCAT(CONCAT(LOWER(LEFT(A.Field,1)),SUBSTRING(A.Field,2,(LENGTH(A.Field)-1)))),',','')
            
            FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(pTableName,'_',help_topic_id+1),'_',-1) AS FIELD 
                        FROM mysql.help_topic 
            WHERE help_topic_id < LENGTH(pTableName)-LENGTH(REPLACE(pTableName,'_',''))+1) A 
                        
            INTO vClassName ;
      -- 创建临时表
    CREATE TEMPORARY TABLE IF NOT EXISTS  temp1 ENGINE=MYISAM  
    AS (
                    SELECT  COLUMN_NAME  AS FieldName, COLUMN_COMMENT AS ColumnComment,
                        CASE  
                            WHEN DATA_TYPE='bigint' AND IS_NULLABLE = 'YES'  THEN 'long?'
                            WHEN DATA_TYPE='bit' AND IS_NULLABLE = 'YES'  THEN 'bool?'
                            WHEN DATA_TYPE='char' AND COLUMN_TYPE = 'char(36)' AND IS_NULLABLE = 'YES' THEN 'Guid?'
                            WHEN DATA_TYPE='date' AND IS_NULLABLE = 'YES'  THEN 'DateTime?'
                            WHEN DATA_TYPE='datetime' AND IS_NULLABLE = 'YES' THEN 'DateTime?'
                            WHEN DATA_TYPE='decimal' AND IS_NULLABLE = 'YES' THEN 'decimal?'
                            WHEN DATA_TYPE='float' AND IS_NULLABLE = 'YES' THEN 'float?'
                            WHEN DATA_TYPE='int' AND IS_NULLABLE = 'YES' THEN 'int?'
                            WHEN DATA_TYPE='numeric' AND IS_NULLABLE = 'YES' THEN 'decimal?'
                            WHEN DATA_TYPE='decimal' AND IS_NULLABLE = 'YES' THEN 'decimal?'
                            WHEN DATA_TYPE='double' AND IS_NULLABLE = 'YES' THEN 'double?'
                            WHEN DATA_TYPE='real' AND IS_NULLABLE = 'YES' THEN 'double?'
                            WHEN DATA_TYPE='smallint' AND IS_NULLABLE = 'YES' THEN 'short?'
                            WHEN DATA_TYPE='mediumint' AND IS_NULLABLE = 'YES' THEN 'int?'
                            WHEN DATA_TYPE='time'  AND IS_NULLABLE = 'YES' THEN 'TimeSpan?'
                            WHEN DATA_TYPE='timestamp' AND IS_NULLABLE = 'YES' THEN 'DateTime?'
                            WHEN DATA_TYPE='tinyint' AND COLUMN_TYPE = 'tinyint(1)' AND IS_NULLABLE = 'YES' THEN 'bool?'
                            WHEN DATA_TYPE='tinyint' AND IS_NULLABLE = 'YES' THEN 'byte?'
                            WHEN DATA_TYPE='year'  AND IS_NULLABLE = 'YES' THEN 'uint?'
                            
                            WHEN DATA_TYPE='bigint' THEN 'long'
                            WHEN DATA_TYPE='binary' THEN 'byte[]'
                            WHEN DATA_TYPE='bit' THEN 'bool'                
                            WHEN DATA_TYPE='char' AND COLUMN_TYPE = 'char(36)' THEN 'Guid'                    
                            WHEN DATA_TYPE='date' THEN 'DateTime'                
                            WHEN DATA_TYPE='datetime' THEN 'DateTime'    
                            WHEN DATA_TYPE='decimal' THEN 'decimal'    
                            WHEN DATA_TYPE='float' THEN 'float'
                            WHEN DATA_TYPE='image' THEN 'byte[]'
                            WHEN DATA_TYPE='int' THEN 'int'
                            WHEN DATA_TYPE='numeric' THEN 'decimal'
                            WHEN DATA_TYPE='decimal' THEN 'decimal'
                            WHEN DATA_TYPE='double' THEN 'double'
                            WHEN DATA_TYPE='real' THEN 'double'
                            WHEN DATA_TYPE='smallint' THEN 'short'
                            WHEN DATA_TYPE='mediumint' THEN 'int'
                            WHEN DATA_TYPE='text' THEN 'string'
                            WHEN DATA_TYPE='mediumtext' THEN 'string'
                            WHEN DATA_TYPE='longtext' THEN 'string'                        
                            WHEN DATA_TYPE='time' THEN 'TimeSpan'                        
                            WHEN DATA_TYPE='timestamp' THEN 'DateTime'                        
                            WHEN DATA_TYPE='tinyint' AND COLUMN_TYPE = 'tinyint(1)'  THEN 'bool'
                            WHEN DATA_TYPE='tinyint' THEN 'byte'
                            WHEN DATA_TYPE='varbinary' THEN 'byte[]'
                            WHEN DATA_TYPE='varchar' THEN 'string'
                            WHEN DATA_TYPE='year' THEN 'uint'
                            ELSE 'UNKNOWN_' + DATA_TYPE
                        END AS ColumnType
                        FROM ( SELECT  COLUMN_NAME, DATA_TYPE, COLUMN_TYPE,COLUMN_COMMENT,IS_NULLABLE  FROM INFORMATION_SCHEMA.COLUMNS  WHERE table_schema=pDataBaseName AND table_name = pTableName) A);
    SET vClassCode = '';
        
        -- 打开游标
    OPEN code_cursor;
            get_code: LOOP
                FETCH code_cursor INTO  colComment,colType,fName;
                IF v_finished = 1 THEN
                    LEAVE get_code;
                END IF;
                                
                                -- 处理字段
                                SELECT REPLACE(GROUP_CONCAT(CONCAT(LOWER(LEFT(A.Field,1)),SUBSTRING(A.Field,2,(LENGTH(A.Field)-1)))),',','')
                                FROM 
                                ( SELECT DISTINCT fName AS FIELD 
                                        FROM mysql.help_topic 
                                        WHERE help_topic_id < LENGTH(fName)-LENGTH(REPLACE(fName,'_',''))+1 ) A INTO fNameNew;
                -- 组合代码字符串
                SELECT  CONCAT(vClassCode,'\r\n\r\n', CONCAT( '/// <summary>\r\n','/// ',colComment,'\r\n/// </summary>\r\n', 'public ', colType , ' ' ,fNameNew,' { get; set; }')) 
                                INTO  vClassCode ;
            END LOOP get_code;
        CLOSE code_cursor;
        -- 删除临时表
        DROP TABLE temp1;
    
        -- 最终生成类
        SELECT CONCAT('public class ','m_',pTableName,'\r\n{', vClassCode,'\r\n}') AS ModelClass;
    END$$

DELIMITER ;

使用 call GetCSharpModel('数据库',‘表名’)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值