zoukankan      html  css  js  c++  java
  • 简单代码生成器原理剖析(二)

    上篇《简单代码生成器原理剖析(一)》分析了代码生成器的原理,查询数据库系统视图: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 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(数据访问层)的实现:
     
            /// <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的实现:
            /// <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());
    }
    详细代码可参考:
  • 相关阅读:
    OpenWrt arp 命令发布
    [Cocos2d-x]Cocos2d-x 3.2 学习笔记
    智课雅思词汇---二十四、名词性后缀ary(也是形容词后缀)
    算法讲课---1、贪心
    智课雅思词汇---二十三、名词性后缀mony
    js进阶---12-11、jquery如何给动态创建出来的元素绑定事件
    js进阶---12-12、jquery事件委托怎么使用
    js进阶---12-10、jquery绑定事件和解绑事件是什么
    新东方雅思词汇---7.3、dioxide
    对啊英语音标---四、双元音常见的字母发音组合有哪些
  • 原文地址:https://www.cnblogs.com/OceanEyes/p/codebuilder.html
Copyright © 2011-2022 走看看