前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单代码生成器原理剖析(二)

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

作者头像
用户1161731
发布2018-01-11 12:15:05
7000
发布2018-01-11 12:15:05
举报
文章被收录于专栏:木宛城主木宛城主

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

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

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

Model的实现:

代码语言:javascript
复制
        /// <summary>
        /// Model
        /// </summary>
        public static void CreateModel(CodeBuilderArgs args,string tableName)
        {
            DataTable dt = ExecuteDataTable(args.ConnectionString, "select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@TABLE_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(数据访问层)的实现:

代码语言:javascript
复制
        /// <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 TABLE_NAME=@TABLE_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 id=@id\";");
            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 id=@id\",");
            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 id=@id\",");
            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的实现:

代码语言:javascript
复制
        /// <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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-03-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档