1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > (转)简单代码生成器原理剖析(二)

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

时间:2019-04-13 07:32:08

相关推荐

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

原文地址:/OceanEyes/archive//03/08/codebuilder.html

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

string modelFile = bine(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 = bine(args.OutputDir,"DAL");

string DALFile = bine(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 = bine(args.OutputDir,"BLL");

string BLLFile = bine(BLLDir,tableName+"BLL.cs");

Directory.CreateDirectory(BLLDir);

File.WriteAllText(BLLFile,sb.ToString());

}

复制代码详细代码可参考:/Project/Detail-11919.shtml

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。