• 手写代码生成器


    手写代码生成器

    在我们介绍三层的时候,大家是不是发现我们写每一个功能的时候是不是非常的麻烦呢?

    像其中的一个model,如果属性特别多的时候,写起来非常的慢。

    像其中一些基本的功能我们可以使用代码生成器,然后在此基础上改下就好了。

    但是:一定要一开始手写三层,不要依赖于代码生成器,等手写熟练了以后再用代码生成器。

    先看下动软代码生成器:

                           

    一、动软代码生成器的安装

    下面我演示一下如何使用:

     

    二、连接数据库

     

    三、设定选项进行连接

    在加载数据库的时候出现: “添加服务器配置失败,请检查是否有写入权限或文件是否存在”的错误的解决办法.

    找到安装动软的目录,如果装在C盘时,默认为C:\Program Files\Maticsoft\Codematic2,给此文件夹的安全属性中当前用户添加全部权限;或添加Everyone用户,给Everyone角色添加全部权限。

     

    四、选定数据库-加载所有表

     

    五、使用代码生成器生成三层

    为了理解代码生成器的原理,我们写个简单生成model的代码生成器。

    用户可能会连接各种各样的数据库,连接字符串不能写死.让用户选择或者是自己输入也行.

    为了方便,我在文本框里面写好连接的字符串.

     

    六、画好界面,写好连接字符串

     

    七、快速try-catch方法

     

    测试连接演示

     

    八、获取数据库中的表

     

    九、将表名绑定代码

    接下来我们完成,点击一个表名一点按钮,生成一个model。

    让用户指定下命名空间,类名跟表名一样就行了。

     

    十、画好接下来用到的界面

    当我点生成的时候,就开始生成代码了.大家思考下,当我点生成的时候执行什么代码.

    首先,获取现在的表.生成代码例如像model中的很多代码是固定的.拼个字符串就行了.

    接下来的问题是,这张表中有多少个列.怎么获取表中有多少个列呢?

    用下这个事务: INFORMATION_SCHEMA.COLUMNS.

    接下来我就该写代码了.

     

    十一、生成model代码框架代码

     

    生成model代码演示

    接下来我们改写model里面属性的代码了。

     

    十二、存储数据的类

     

    十三、生成model里的属性代码的代码

    下面请大家思考下,怎样才能判断数据类型,进而使之转换。

     

    生成model里的属性演示

    插入代码位置:

    View Code
     1                //4.循环遍历listColumns(列集合)
     2                 foreach (ColumnInfo item in listColumns)
     3                 {
     4                     //注:这里我写的是自动属性的,先写字段,再写属性也行。
     5                     //问题1是数据类型是数据库中的,不是C#中的。2是属性名应该大写-所以下面封装了方法,处理这个。
     6                     sbCode.AppendLine("public string " + CheckDbType(item) + " " + ChangePropertyName(item.ColumnName));
     7                     sbCode.AppendLine("{ ");
     8                     sbCode.AppendLine("get;");
     9                     sbCode.AppendLine("set;");
    10                     sbCode.AppendLine("}");
    11                 }
    12 
    13 
    14                 sbCode.AppendLine("}");
    15                 sbCode.AppendLine("}");
    16                 txtCode.Text = sbCode.ToString();
    17             }
    18 
    19         }
    20         private string CheckDbType(ColumnInfo p)
    21         {
    22             #region 1
    23             //1.判断是不是值类型
    24             //2.判断是不是为空
    25             //3.把nverchar转换成string类型
    26             //下面这么写不太合适
    27             //string dbType = string.Empty;
    28             //switch (p.DataType.ToLower())
    29             //{
    30             //    case "char":
    31             //    case "varchar":
    32             //    case "nchar":
    33             //    case "nvarchar":
    34             //    case "text":
    35             //    case "ntext":
    36             //        dbType = "string";
    37             //        break;
    38             //    case "int":
    39             //        dbType = "int";
    40             //        break;
    41             //    case "bit":
    42             //        dbType = "bool";
    43             //        break;
    44             //    default:
    45             //        dbType = "unknow";
    46             //        break;
    47             //}
    48             //if (p.IsNullable.ToLower() == "yes")
    49             //{
    50             //    dbType += "?";
    51             //}
    52             //return dbType;
    53             #endregion
    54 
    55             #region 2
    56             Type dbType = null;
    57             switch (p.DataType.ToLower())
    58             {
    59                 case "char":
    60                 case "varchar":
    61                 case "nchar":
    62                 case "nvarchar":
    63                 case "text":
    64                 case "ntext":
    65                     dbType = typeof(string);
    66                     break;
    67                 case "int":
    68                     dbType = typeof(int);
    69                     break;
    70                 case "bit":
    71                     dbType = typeof(bool);
    72                     break;
    73             }
    74             if (dbType!=null)
    75             {
    76                 if (dbType.IsValueType && p.IsNullable.ToLower ()=="yes")
    77                 {
    78                     return dbType.ToString() + "?";  
    79                 }
    80             }
    81             return dbType.ToString();
    82             #endregion
    83             
    84         }

    十四、mygeneration

    下面为大家介绍CodeSmith代码生成器。

     

    十五、CodeSmith安装过程

    CodeSmith的好处就是自己可以写模板。

    下面我们自己写个模板

     

    十六、新建模板

    双击打开

     

    十七、在模板中哪能写C#代码

     

    十八、生成,执行

    接下来,我写个标志并且输出。

     

    十九、第一个需要说明的地方

     

    二十、发件人,收件人改成方法替代

    像这种情况,如果我要改发件人,收件人得话,比较的麻烦。所以,不光要有方法,我在里面添加几个参数。

     

    二十一、添加参数

     

    二十二、设置参数

    写完以后编译一下,软件右下角就是刚写的三个参数。

     

    二十三、又下角显示出刚设定的三个参数

    接下来看下怎么用这三个参数。

     

    二十四、参数的用法一

     

    二十五、改变参数以后,输出的内容页变了

    模板的意义:写一些固定的字符串,不固定的字符串可以用方法和参数来代替,这就是模板的意义。

    二十六、第一句话的解释

    在安装CodeSmith代码生成器的过程中可能会遇到些小问题,本人在这提供我安装好的,大家直接在自己的电脑上进行安装就行了。

     

    二十七、CodeSmith代码生成器安装过程

     

    二十八、写好的模板

    接下来我们自己写模板生成一个model。

    生成model模板需要一个命名空间,需要一个表。这两个设定成参数。

     

    二十九、model的参数设定

    添加数据库

     

    三十、给参数表设定值的步骤

    接下来生成实体model

     

    三十一、生成实体model

     

    三十二、让属性名变成大写的方法

    修改数据类型用我们现成的方法:

    插入代码位置:

    View Code
     1 public string GetCSharpTypeFromDBFieldType(ColumnSchema column)
     2     {
     3                 string type;
     4         switch (column.DataType)
     5         {
     6             case DbType.AnsiString: type= "string";break;
     7             case DbType.AnsiStringFixedLength: type= "string";break;
     8             case DbType.Binary: type= "byte[]";break;
     9             case DbType.Boolean: type= "bool";break;
    10             case DbType.Byte: type= "byte";break;
    11             case DbType.Currency: type= "decimal";break;
    12             case DbType.Date: type= "DateTime";break;
    13             case DbType.DateTime: type= "DateTime";break;
    14             case DbType.Decimal: type= "decimal";break;
    15             case DbType.Double: type= "double";break;
    16             case DbType.Guid: type= "Guid";break;
    17             case DbType.Int16: type= "short";break;
    18             case DbType.Int32: type= "int";break;
    19             case DbType.Int64: type= "long";break;
    20             case DbType.Object: type= "object";break;
    21             case DbType.SByte: type= "sbyte";break;
    22             case DbType.Single: type= "float";break;
    23             case DbType.String: type= "string";break;
    24             case DbType.StringFixedLength: type= "string";break;
    25             case DbType.Time: type= "TimeSpan";break;
    26             case DbType.UInt16: type= "ushort";break;
    27             case DbType.UInt32: type= "uint";break;
    28             case DbType.UInt64: type= "ulong";break;
    29             case DbType.VarNumeric: type= "decimal";break;
    30             default:
    31             {
    32                 type= "__UNKNOWN__" + column.NativeType;
    33                 break;
    34             }
    35         }
    36         if(column.AllowDBNull&&
    37             column.SystemType.IsValueType)
    38         {
    39             type=type+"?";
    40         }
    41         return type;
    42     }

    三十三、修改数据类型的方法:

    这里我们提供给大家已经写好的模板:

     

    三十四、添加写好的模板

     

    三十五、看下我们写好的model模板

    三十六、三层中模板的应用

     

    三十七、为模板添加作者签名

     

    三十八、处理bll层生成在指定文件夹的解决办法

    下面我们把sqlhelper也继承到主模板里面。

     

    三十九、了解清晰主模板相关信息

    好了解清楚这些,再把sqlhelper继承进来就相当的容易了。

    四十、把sqlhelper继承进主模板

     

    四十一、加载到项目里面

    接下来再说一个问题

    比如说我生成好的bLL文件

    我还需要在里面加东西,我辛辛苦苦加了很多个方法在里面。同时,我又发现代码生成器里面有个地方不完美,稍微修改了下模板。重新生成以后,发现我上午加的代码没有了。

    也就是说通过代码生成器生成的代码,跟我们手动写的代码应该分开来存储。

    在同一个命名空间下,类名一样的,加partial部分类。编译的时候,自动编译成一个类来运行。

    注意文件名不能重名。

     

    四十二、partial关键字的用法

    代码生成器生成的代码都含有partial关键字,如果我们想扩展的话,我们写在自己拓展的partial 类里面。

    一般情况下代码生成器生成的代码不需要做任何的改动。如果觉得改动比较的大,不如去改下模板,重新生成一下。

     发送邮件程序涵很多邪恶的东西,就先不发了。。。

    作者近期文章列表:

    C#基础教程(完全免费,献给代码爱好者的最好礼物。注:本作者分享自己精心整理的C#基础教程,无任何商业目的。
    希望与更多的代码爱好者交流心得,也请高手多多指点!!!)
    三层及其它内容 递归
    三层(一)
    三层相关案例(及常见的错误)
    三层实例(内涵Sql CRUD)
    SQL数据库 ADO.net 数据库的应用图解一
    数据库的应用详解二
    ADO.NET(内涵效率问题)
    ADO.NET实例教学一
    面向过程,面向对象中高级 面向过程,面向对象的深入理解一
    面向过程,面向对象的深入理解二
    面向对象的深入理解三
    winform基础 Winform基础
    winform中常用的控件
    面向过程 三种循环的比较
    C#中的方法(上)
    我们常见的数组
    面向对象 思想的转变
    C#中超级好用的类
    C#中析构函数和命名空间的妙用
    C#中超级好用的字符串
    C#中如何快速处理字符串
    值类型和引用类型及其它
    ArrayList和HashTable妙用一
    ArrayList和HashTable妙用二
    文件管理File类
    多态
    C#中其它一些问题的小节
    GDI+ 这些年我收集的GDI+代码
    这些年我收集的GDI+代码2
    HTML概述以及CSS 你不能忽视的HTML语言
    你不能忽视的HTML语言2精编篇
    你不能忽视的HTML语言3
    CSS基本相关内容--中秋特别奉献
    CSS基本相关内容2
    JavaScript基础 JavaScript基础一
    jQuery jQuery(内涵: jquery选择器)
  • 相关阅读:
    作业要求 20181009-9 每周例行报告
    20180925-1 每周例行报告
    作业要求20180925-4 单元测试,结对
    作业要求 20180925-3 效能分析
    作业要求 20180925-6 四则运算试题生成
    20180925-7 规格说明书-吉林市2日游
    20180925-5 代码规范,结对要求
    20170925-2 功能测试
    第二周例行报告
    作业要求 20180918-1 词频统计 卢帝同
  • 原文地址:https://www.cnblogs.com/zysbk/p/2772312.html
Copyright © 2020-2023  润新知