这个代码生成器比较简单啦。最近在自学传智播客.net的三层架构。没有代码生成器怎么混?于是写一个呗。
开发软件:vs2010。
源代码:点此下载(包括代码生成器和生成代码的示例,包括后记1~5中的修改)。
功能:根据数据库中的表,动态生成model,DAL,BLL的代码。
备注:1.生成代码没有调整格式。手工调整代码格式的快捷键:按住ctrl,再依次按k和f。
2.祝大家五一快乐=w=
3.csdn的上传资源功能,我就不多说了。
效果:
1.界面:
2.生成代码的示例:
model:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 大龙的代码生成器生成的三层架构.model
{
partial class T_pet
{
public Int32 id { get; set; }
public string petName { get; set; }
public string forename { get; set; }
public string AAA { get; set; }
}
}
DAL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using 大龙的代码生成器生成的三层架构.model;
using System.Data.SqlClient;
using System.Data;
using 大龙的三层架构.DAL;
namespace 大龙的代码生成器生成的三层架构.DAL
{
partial class T_petDAL
{
public int add(T_pet model)
{
return Convert.ToInt32(sqlHelper.executeScalar(
"insert into T_pet (petName,forename,AAA) output inserted.id values(@petName,@forename,@AAA)"
, new SqlParameter("petName", model.petName)
, new SqlParameter("forename", model.forename)
, new SqlParameter("AAA", model.AAA)
));
}
public int delete(int id)
{
string sqlText = @"delete from T_pet where id =@id ";
return sqlHelper.executeNonQuery(sqlText, new SqlParameter("id", id));
}
public int update(T_pet model)
{
string sqlText = @"update T_pet set petName=@petName,forename=@forename,AAA=@AAA where id =@id ";
return sqlHelper.executeNonQuery(sqlText
, new SqlParameter("id", model.id)
, new SqlParameter("petName", model.petName)
, new SqlParameter("forename", model.forename)
, new SqlParameter("AAA", model.AAA)
);
}
public T_pet get(int id)
{
string sqlText = @"select * from T_pet where id = @id";
DataTable dt = sqlHelper.executeDataTable(sqlText, new SqlParameter("id", id));
if (dt.Rows.Count <= 0) { return null; }
else
{
T_pet o = new T_pet();
DataRow dr = dt.Rows[0];
o.id = (Int32)dr["id"];
o.petName = (string)dr["petName"];
o.forename = (string)dr["forename"];
o.AAA = (string)dr["AAA"];
return o;
}
}
public IEnumerable<T_pet> getAll()
{
string sqlText = @"select * from T_pet";
DataTable dt = sqlHelper.executeDataTable(sqlText);
if (dt.Rows.Count <= 0) { return null; }
else
{
List<T_pet> os = new List<T_pet>();
foreach (DataRow dr in dt.Rows)
{
T_pet o = new T_pet();
o.id = (Int32)dr["id"];
o.petName = (string)dr["petName"];
o.forename = (string)dr["forename"];
o.AAA = (string)dr["AAA"];
os.Add(o);
}
return os;
}
}
}
}
BLL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using 大龙的代码生成器生成的三层架构.model;
using 大龙的代码生成器生成的三层架构.DAL;
namespace 大龙的代码生成器生成的三层架构.BLL
{
partial class T_petBLL
{
public int add(T_pet model)
{
return new T_petDAL().add(model);
}
public int delete(int id)
{
return new T_petDAL().delete(id);
}
public int update(T_pet model)
{
return new T_petDAL().update(model);
}
public T_pet get(int id)
{
return new T_petDAL().get(id);
}
public IEnumerable<T_pet> getAll()
{
return new T_petDAL().getAll();
}
}
}
后记:
生成器需要修改的地方还很多,我主要做了如下修改:
1.值类型改为可空类型。
因为数据库中的年龄字段可能为null,而值类型不能为null。
比如:int改为int?。
2.DAL中的查找方法做相应更改。
因为数据库中的数据可能为null,而且此null不是c#中的null,而是c#中的DBNull.Value。为什么不一样呢?因为c#中的null表示没有赋值,而数据库中的null表示不知道是否赋值,还记否,数据库中查询字段为null的语句是“where age is null”而非“where age = null”。
比如:
model.postcode = (string)dr["postcode"];
改为
model.postcode = dr.IsNull("postcode") ? null : (string)dr["postcode"];
或者
if (dr["postcode"] == DBNull.Value) { model.postcode = null; }
else { model.postcode = (string)dr["postcode"]; }
3.DAL中的插入方法做相应更改。
因为插入的时候有些字段可能为空。
比如:
return Convert.ToInt32(sqlHelper.executeScalar(
"insert into dbo.person (age) output inserted.id values(@age) "
, new SqlParameter("age", null)
));
改为:
object o = DBNull.Value;
return Convert.ToInt32(sqlHelper.executeScalar(
"insert into dbo.person (age) output inserted.id values(@age) "
, new SqlParameter("age", (model.age == null) ? o : model.age)
));
额外小知识:
a.三元表达式的类型
b ? x : y
如果 X 和 Y 的类型相同,则此类型为该条件表达式的类型。
否则,如果存在从 X 到 Y 的隐式转换,但不存在从 Y 到 X 的隐式转换,则 Y 为条件表达式的类型。
否则,如果存在从 Y 到 X 的隐式转换,但不存在从 X 到 Y 的隐式转换,则 X 为条件表达式的类型。
否则,无法确定条件表达式的类型
b.运行时没有报错,但也没有显示数据
object s = null;
string s1 = (string)s;//不报错
string s2 = s.ToString();//调用s指向的对象的ToString方法,将方法的返回值赋值给s2。所以如果s为null,也就是没有指向任何的对象,则会报错
4.普通代码换成小清新代码(特别感谢我的好友GX提供)
普通代码:
sb.AppendLine("model." + dr["column_name"].ToString() + " = dr.IsNull(\"" + dr["column_name"].ToString() + "\") ? null : (" + type + ")dr[\"" + dr["column_name"].ToString() + "\"];");
小清新代码:
sb.AppendLine(string.Format(" model.{0} = dr.IsNull(\"{0}\") ? null : ({1})dr[\"{0}\"];", dr["column_name"].ToString(),type));
优点:
a.代码模块性更强
b.代码复用率更高
5.BLL和DAL添加toModel()方法
示例:
public person toModel(DataRow dr)
{
person model = new person();
model.id = dr.IsNull("id") ? null : (Int32?)dr["id"];
model.name = dr.IsNull("name") ? null : (string)dr["name"];
model.age = dr.IsNull("age") ? null : (Int32?)dr["age"];
return model;
}
6.修改冗余代码
原示例代码:
public IEnumerable<t_scripts> getAll()
{
string sqlText = @"select * from t_scripts";
DataTable dt = sqlHelper.executeDataTable(sqlText);
if (dt.Rows.Count <= 0) { return null; }//没有必要判断,因为如果dt为count=0的datatable,下面的foreach将跳过循环,往下进行。
else
{
List<t_scripts> models = new List<t_scripts>();
foreach (DataRow dr in dt.Rows)
{
t_scripts model = new t_scripts();
model.id = dr.IsNull("id") ? null : (Int32?)dr["id"];
model.parentId = dr.IsNull("parentId") ? null : (Int32?)dr["parentId"];
model.name = dr.IsNull("name") ? null : (string)dr["name"];
model.content = dr.IsNull("content") ? null : (string)dr["content"];
models.Add(model);
}
return models;
}
}
修改后示例代码:
public IEnumerable<t_scripts> getAll()
{
string sqlText = @"select * from t_scripts";
DataTable dt = sqlHelper.executeDataTable(sqlText);
List<t_scripts> models = new List<t_scripts>();
foreach (DataRow dr in dt.Rows)
{
t_scripts model = new t_scripts();
model.id = dr.IsNull("id") ? null : (Int32?)dr["id"];
model.parentId = dr.IsNull("parentId") ? null : (Int32?)dr["parentId"];
model.name = dr.IsNull("name") ? null : (string)dr["name"];
model.content = dr.IsNull("content") ? null : (string)dr["content"];
models.Add(model);
}
return models;
}
易混示例代码:
public t_scripts get(int id)
{
string sqlText = @"select * from t_scripts where id = @id";
DataTable dt = sqlHelper.executeDataTable(sqlText, new SqlParameter("id", id));
if (dt.Rows.Count <= 0) { return null; }//必须要判断,否则dt.Rows[0]取不到值,就会报错。
else
{
t_scripts model = new t_scripts();
DataRow dr = dt.Rows[0];
model.id = dr.IsNull("id") ? null : (Int32?)dr["id"];
model.parentId = dr.IsNull("parentId") ? null : (Int32?)dr["parentId"];
model.name = dr.IsNull("name") ? null : (string)dr["name"];
model.content = dr.IsNull("content") ? null : (string)dr["content"];
return model;
}
}