上篇《简单代码生成器原理剖析(一)》分 析了代码生成器的原理,查询数据库系统视 图: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