zoukankan      html  css  js  c++  java
  • (转)手写代码生成器

    原文地址:http://www.cnblogs.com/zysbk/archive/2012/11/18/2772312.html

    手写代码生成器

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

    像其中的一个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选择器)  
  • 相关阅读:
    URAL——DFS找规律——Nudnik Photographer
    URAL1353——DP——Milliard Vasya's Function
    URAL1203——DPor贪心——Scientific Conference
    递推DP HDOJ 5389 Zero Escape
    区间DP UVA 1351 String Compression
    树形DP UVA 1292 Strategic game
    Manacher HDOJ 5371 Hotaru's problem
    同余模定理 HDOJ 5373 The shortest problem
    递推DP HDOJ 5375 Gray code
    最大子序列和 HDOJ 1003 Max Sum
  • 原文地址:https://www.cnblogs.com/fcsh820/p/2780216.html
Copyright © 2011-2022 走看看