大龙的涂鸦之“代码生成器”(第二代)

这个代码生成器比较简单啦。最近在自学传智播客.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;
            }
        }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值