简单代码生成器原理剖析(二)

上篇《简单代码生成器原理剖析(一)》分 析了代码生成器的原理,查询数据库系统视 图:INFORMATION_SCHEMA.TABLES、 INFORMATION_SCHEMA.COLUMNS  可以获得数据库中表、列的相关信息,再运用StringBuilder类的其AppendLine方法追加字符串,最后早运用 File.WriteAllText方法将字符串写入文件。

第二版代码生成器在第一版的基础上扩展了以下功能:

  • 使用了部分类(partial):当使用大项目或自动生成的代码(如由 Windows 窗体设计器提供的代码)时,将一个类、结构或接口类型拆分到多个文件中的做法就很有用。 分部类型可能包含分部方法。
  • 使用可空类型:由于数据库中表中数据很有可能是NULL,可空类型使得数据从表中读取出来赋值给值类型更加兼容。
  • 增加了ToModel方法:将数据库表中一行数据封装成Model类的对象返回。

Model的实现:

        /// <summary>        /// Model        /// </summary>        public static void CreateModel(CodeBuilderArgs args,string tableName)        {            DataTable dt = ExecuteDataTable(args.ConnectionString, "select * from INFORMATION_SCHEMA.COLUMNS where [email protected]_NAME"                ,new SqlParameter("TABLE_NAME",tableName));            StringBuilder sb = new StringBuilder();            sb.AppendLine("using System;");            sb.AppendLine("using System.Collections.Generic;");            sb.AppendLine("using System.Linq;");            sb.AppendLine("using System.Text;");            sb.AppendLine("namespace " + args .Namespace+ ".Model");            sb.AppendLine("{");            sb.AppendLine("partial class " + tableName);            sb.AppendLine("{");            foreach (DataRow row in dt.Rows)            {                string colName = Convert.ToString(row["COLUMN_NAME"]);                string colType = Convert.ToString(row["DATA_TYPE"]);

                Type netType = GetTypeByDBType(colType);                string netTypeName;                if (netType.IsValueType)                {                    netTypeName = netType + "?";                }                else                {                    netTypeName = netType.ToString();                }                sb.AppendLine("public " +netTypeName +" "+ colName + " { get; set; }");            }            sb.AppendLine(" }");            sb.AppendLine(" }");            string modelDir = Path.Combine(args.OutputDir, "Model");            string modelFile = Path.Combine(modelDir, tableName+".cs");            Directory.CreateDirectory(modelDir);            File.WriteAllText(modelFile, sb.ToString());        }

DAL(数据访问层)的实现:

        /// <summary>        ///DAL        /// </summary>        /// <param name="args"></param>        /// <param name="tableName"></param>        public static void CreateDAL(CodeBuilderArgs args, string tableName)        {            StringBuilder sb = new StringBuilder();            DataTable dt = ExecuteDataTable(args.ConnectionString, "select * from INFORMATION_SCHEMA.COLUMNS where [email protected]_NAME"    , new SqlParameter("TABLE_NAME", tableName));            sb.AppendLine("using System;");            sb.AppendLine("using System.Collections.Generic;");            sb.AppendLine("using System.Linq;");            sb.AppendLine("using System.Text;");            sb.AppendLine("using "+args.Namespace+".Model;");            sb.AppendLine("using System.Data.SqlClient;");            sb.AppendLine("using System.Data;");            sb.AppendLine("namespace "+args.Namespace+".DAL");            sb.AppendLine("{");            sb.AppendLine("partial class "+tableName+"DAL");            sb.AppendLine("{");            sb.AppendLine("public int AddNew("+tableName+" model)");            sb.AppendLine("{");

            string[] cols = GetColsWithoutId(GetCols(dt, new List<string>())).ToArray();            var colsParameters=from e in cols select"@"+ e;            sb.AppendLine("string sql = \"insert into " + tableName + "(" + string.Join(",", cols) + ") output inserted.id values(" + string.Join(",", colsParameters.ToArray()) + ")\";");            sb.AppendLine("int id = (int)SqlHelper.ExecuteScalar(sql");

            foreach (DataRow row in dt.Rows)            {                string colName = Convert.ToString(row["COLUMN_NAME"]);                if(!(colName.ToLower()=="id"))                {                  sb.AppendLine(", new SqlParameter(\""+colName+"\", model."+colName+")");                   }

            }            sb.AppendLine(");");            sb.AppendLine("return id;");            sb.AppendLine("}");

            var par=from e in cols select e+"="+"@"+e;            sb.AppendLine("public bool Update("+tableName+" model)");            sb.AppendLine("{");            sb.AppendLine("string sql = \"update "+tableName+" set "+string.Join(",",par.ToArray())+" where [email protected]\";");            sb.AppendLine("int rows = SqlHelper.ExecuteNonQuery(sql");            foreach (DataRow row in dt.Rows)            {                string colName = Convert.ToString(row["COLUMN_NAME"]);                sb.AppendLine(", new SqlParameter(\"" + colName + "\", model." + colName + ")");               }            sb.AppendLine(");");            sb.AppendLine("return rows>0;");            sb.AppendLine("}");            sb.AppendLine("public bool Delete(int id)");            sb.AppendLine("{");            sb.AppendLine("int rows = SqlHelper.ExecuteNonQuery(\"delete from "+tableName+" where [email protected]\",");            sb.AppendLine("new SqlParameter(\"id\", id));");            sb.AppendLine("return rows > 0;");            sb.AppendLine("}");            sb.AppendLine("private static "+tableName+" ToModel(DataRow row)");            sb.AppendLine("{");            sb.AppendLine(""+tableName+" model = new "+tableName+"();");            foreach (DataRow row in dt.Rows)            {                string colName = Convert.ToString(row["COLUMN_NAME"]);                string colType = Convert.ToString(row["DATA_TYPE"]);                Type netType = GetTypeByDBType(colType);                string netTypeName;                if (netType.IsValueType)                {                    netTypeName = netType + "?";                }                else                {                    netTypeName = netType.ToString();                }                sb.AppendLine("model."+colName+" = row.IsNull(\""+colName+"\") ? null : "+"("+netTypeName+")"+"row[\""+colName+"\"];");            }            sb.AppendLine("return model;");            sb.AppendLine("}");            //            sb.AppendLine("public "+tableName+" Get(int id)");            sb.AppendLine("{");            sb.AppendLine("DataTable dt = SqlHelper.ExecuteDataTable(\"select * from "+tableName+"  where [email protected]\",");            sb.AppendLine("new SqlParameter(\"id\", id));");            sb.AppendLine("if(dt.Rows.Count > 1)");            sb.AppendLine("{");            sb.AppendLine("throw new Exception(\"more than 1 row was found\");");            sb.AppendLine("}");            sb.AppendLine("if(dt.Rows.Count <= 0)");            sb.AppendLine("{");            sb.AppendLine("return null; ");            sb.AppendLine("}");            sb.AppendLine("DataRow row = dt.Rows[0];");            sb.AppendLine(""+tableName+" model = ToModel(row);");            sb.AppendLine("return model;");            sb.AppendLine("}");            sb.AppendLine("public IEnumerable<"+tableName+">ListAll()");            sb.AppendLine("{");            sb.AppendLine("List<"+tableName+"> list = new List<"+tableName+">();");            sb.AppendLine("DataTable dt = SqlHelper.ExecuteDataTable(\"select * from "+tableName+"\");");            sb.AppendLine("foreach (DataRow row in dt.Rows)");            sb.AppendLine("{");            sb.AppendLine("list.Add(ToModel(row));");            sb.AppendLine("}");            sb.AppendLine("return list;");            sb.AppendLine("}");            sb.AppendLine("}");            sb.AppendLine("}");            string DALlDir = Path.Combine(args.OutputDir,"DAL");            string DALFile = Path.Combine(DALlDir,tableName+"DAL.cs");            Directory.CreateDirectory(DALlDir);            File.WriteAllText(DALFile,sb.ToString());        }        private static IEnumerable<string> GetColsWithoutId(List<string> cols)        {            var colArray = from col in cols where col.ToLower() != "id" select col;            return colArray;        }        private static List<string> GetCols(DataTable dt, List<string> cols)        {            foreach (DataRow row in dt.Rows)            {                string colName = Convert.ToString(row["COLUMN_NAME"]);                cols.Add(colName);            }            return cols;        }

BLL的实现:

        /// <summary>        /// BLL        /// </summary>        /// <param name="args"></param>        /// <param name="tableName"></param>        public static void CreateBLL(CodeBuilderArgs args,string tableName)        {            StringBuilder sb = new StringBuilder();            sb.AppendLine("using System;");            sb.AppendLine("using System.Collections.Generic;");            sb.AppendLine("using System.Linq;");            sb.AppendLine("using System.Text;");            sb.AppendLine("using "+args.Namespace+".Model;");            sb.AppendLine("using "+args.Namespace+".DAL;");            sb.AppendLine("namespace "+args.Namespace+".BLL");            sb.AppendLine("{");            sb.AppendLine("partial class "+tableName+"BLL");            sb.AppendLine("{");            sb.AppendLine("public int AddNew("+tableName+" model)");            sb.AppendLine("{");            sb.AppendLine("return new "+tableName+"DAL().AddNew(model);");            sb.AppendLine("}");            sb.AppendLine("public bool Delete(int id)");            sb.AppendLine("{");            sb.AppendLine("return new "+tableName+"DAL().Delete(id);");            sb.AppendLine("}");            sb.AppendLine("public bool Update("+tableName+" model)");            sb.AppendLine("{");            sb.AppendLine("return new "+tableName+"DAL().Update(model);");            sb.AppendLine("}");            sb.AppendLine("public "+tableName+" Get(int id)");            sb.AppendLine("{");            sb.AppendLine("return new "+tableName+"DAL().Get(id);");            sb.AppendLine("}");            sb.AppendLine("public IEnumerable<"+tableName+"> ListAll()");            sb.AppendLine("{");            sb.AppendLine("return new "+tableName+"DAL().ListAll();");            sb.AppendLine("}");            sb.AppendLine("}");            sb.AppendLine("}");            string BLLDir = Path.Combine(args.OutputDir,"BLL");            string BLLFile = Path.Combine(BLLDir,tableName+"BLL.cs");            Directory.CreateDirectory(BLLDir);            File.WriteAllText(BLLFile,sb.ToString());        }

详细代码可参考:

http://www.oksvn.com/Project/Detail-11919.shtml

时间: 2024-11-12 04:27:24

简单代码生成器原理剖析(二)的相关文章

简单代码生成器原理剖析(一)

上篇文章(深入浅出三层架构)分析了简单三层架构的实现.包括Model,DAL(数据访问层),BLL(业务逻辑层)的实现. 实际开发中,由于重复代码的操作,会花费大量时间,如果以代码生成器来自动生成三层架构代码,即节省精力,又可以节省大量的时间来做其他业务逻辑的代码,提高开发效率. 常用的代码生成器有:动软,CodeSmith 等. 简单代码生成器的基本功能描述: 一键生成Model,DAL,BLL,包括对应数据库中表的Model的自动生成,包括生成属性.添加.修改.删除.查询. 界面展示: 生成

图像处理之基础---二维卷积运算原理剖析

卷积运算(Convolution)是通过两个函数f 和g 生成第三个函数的一种数学算子,表示函数f 与经过翻转和平移与g 的重叠部分的累积.如果将参加卷积的一个函数看作区间的指示函数,卷积还可以被看作是“滑动平均”的推广.假设: f(x),g(x)是R1上的两个可积函数,并且积分是存在的.这样,随着 x 的不同取值,这个积分就定义了一个新函数h(x),称为函数f 与g 的卷积,记为h(x)=(f*g)(x). 两个向量卷积,说白了就是多项式乘法.下面用个矩阵例子说明其工作原理: a和d的卷积就是

HTTPS 原理剖析与项目场景

最近手头有两个项目,XX导航和XX产业平台,都需要使用HTTPS协议,因此,这次对HTTPS协议做一次整理与分享. 为什么使用HTTPS HTTP 协议,本身是明文传输的,没有经过任何安全处理.那么这个时候就很容易在传输过程中被中间者窃听.篡改.冒充等风险.这里提到的中间者主要指一些网络节点,是用户数据在浏览器和服务器中间传输必须要经过的节点,比如 WIFI 热点,路由器,防火墙,反向代理,缓存服务器等. HTTP 协议,中间者可以窃听隐私,使用户的敏感数据暴露无遗:篡改网页,例如往页面插的广告

【Xamain 跨平台机制原理剖析】

原文:[Xamain 跨平台机制原理剖析] [看了请推荐,推荐满100后,将发补丁地址] Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原生态Java开发Android的越来越多,人工费用成本降低. 上面说的3条,都跟钱相关,不占技术边,看起来跟本文的标题严重不符.但是,细细看来,如果这个产品的圈子打不开,再牛的技术,也是枉然.因为技术是在不断推进的, 性能问题,技术问题,实现问题,等等都可以随着时间的推动去解决,但是,Xamarin公

原理剖析-Netty之服务端启动工作原理分析(下)

一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分析Netty的源码版本为:netty-netty-4.1.22.Final: 二.三.四章节请看上一章节 四.源码分析Netty服务端启动 上一章节,我们主要分析了一下线程管理组对象是如何被实例化的,并且还了解到了每个线程管理组都有一个子线程数组来处理任务: 那么接下来我们就直接从4.6开始分析了:

[Vue源码]一起来学Vue模板编译原理(二)-AST生成Render字符串

本文我们一起通过学习Vue模板编译原理(二)-AST生成Render字符串来分析Vue源码.预计接下来会围绕Vue源码来整理一些文章,如下. 一起来学Vue双向绑定原理-数据劫持和发布订阅 一起来学Vue模板编译原理(一)-Template生成AST 一起来学Vue模板编译原理(二)-AST生成Render字符串 一起来学Vue虚拟DOM解析-Virtual Dom实现和Dom-diff算法 这些文章统一放在我的git仓库:https://github.com/yzsunlei/javascri

MapReduce/Hbase进阶提升(原理剖析、实战演练)

什么是MapReduce? MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",和他们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性.他极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上. 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一

EventBus的使用和原理剖析

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38174537 代码下载:http://download.csdn.net/detail/yuanzeyao2008/7684041 在编程过程中,当我们想通知其他组件某些事情发生时,我们通常使用观察者模式,正式因为观察者模式非常常见,所以在jdk1.5中已经帮助我们实现了观察者模式,我们只需要简单的继承一些类就可以快速使用观察者模式,在Android中也有一个类似功能的开源库EventBu

Koa框架实践与中间件原理剖析

Koa框架实践与中间件原理剖析 最近尝试用了一下Koa,并在此记录一下使用心得. 注意:本文是以读者已经了解Generator和Promise为前提在写的,因为单单Generator和Promise都能够写一篇博文来讲解介绍了,所以就不在这里赘述.网上资料很多,可以自行查阅. Koa是Express原班人马打造的一个更小,基于nodejs平台的下一代web开发框架.Koa的精妙之处就在于其使用generator和promise,实现了一种更为有趣的中间件系统,Koa的中间件是一系列generat