手写代码生成器
在我们介绍三层的时候,大家是不是发现我们写每一个功能的时候是不是非常的麻烦呢?
像其中的一个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 类里面。
一般情况下代码生成器生成的代码不需要做任何的改动。如果觉得改动比较的大,不如去改下模板,重新生成一下。
发送邮件程序涵很多邪恶的东西,就先不发了。。。