第二道菜——改造对象参数

原创者:星火幽蓝                  创建时间:2009-10-1

(1)在没有引入对象参数的时候,数据访问层是这样的:

数据访问层:

public int Register(string SAccount, string SPwd, string Gender, string SearchArea, string SID,

string SName, string SIdentityNum, string STel, …………)

    {

        Database db = new Database();

        SqlParameter[] paras =

        {

            db1.MakeInParam("@SAccount",SqlDbType.NVarChar,20,SAccount),

            db1.MakeInParam("@SPwd",SqlDbType.NVarChar,20,SPwd),

            db1.MakeInParam("@Gender",SqlDbType.NChar,2,Gender),

            db1.MakeInParam("@SearchArea",SqlDbType.NVarChar,20,SearchArea),

            db1.MakeInParam("@SID",SqlDbType.NVarChar,20,SID),

            db1.MakeInParam("@SName",SqlDbType.NVarChar,20,SName),

            db1.MakeInParam("@SIdentityNum",SqlDbType.Int,SIdentityNum),

            db1.MakeInParam("@STel",SqlDbType.NVarChar,20,STel),

            ……………….

    };

        return db.RunProc("StudentRegister", paras);
}

其中StudentRegister是存储过程,只是一个插入的SQL语句,我就不贴出来了。
Database 是一个相当于SqlHelper的类,其中 db.RunProc("StudentRegister", paras);是执行存储过程的方法。
以上可以看到一堆很长的制作
SqlParameter参数的代码。
这是很让人苦恼的做法,当这个用户表增加了一个字段,修改函数的过程中,还要多制造一个参数。


(2)刚才采用对象参数“好像”难逃此劫。例如以下:

public int Register(StudentModel model)

 {

        Database db = new Database();

        SqlParameter[] paras =

        {

            db1.MakeInParam("@SAccount",SqlDbType.NVarChar,20,model.SAccount),

            db1.MakeInParam("@SPwd",SqlDbType.NVarChar,20,model.SPwd),

            db1.MakeInParam("@Gender",SqlDbType.NChar,2,model.Gender),

            db1.MakeInParam("@SearchArea",SqlDbType.NVarChar,20,model.SearchArea),

            db1.MakeInParam("@SID",SqlDbType.NVarChar,20,model.SID),

            db1.MakeInParam("@SName",SqlDbType.NVarChar,20,model.SName),

            db1.MakeInParam("@SIdentityNum",SqlDbType.Int,model.SIdentityNum),

            db1.MakeInParam("@STel",SqlDbType.NVarChar,20,model.STel),

            ……………….

    };

                return db.RunProc("StudentRegister", paras);
}



(3)办法是人想出来的,这么多重复代码我才不干,以下是我的想法:
在数据访问层不是要
SqlParameter的数组嘛,我们让实体类自己制作不就可以了嘛!
所以我一开始的想法是:

namespace Model

{

    public class EmployeeModel : IModel

    {

        private string m_EAccount;

        public string EAccount

        {

            get { return m_EAccount; }

            set { m_EAccount = value; }

        }

 

        private string m_Psw;

        public string Psw

        {

            get { return m_Psw; }

            set { m_Psw = value; }

        }

 

        private string m_Name;

        public string Name

        {

            get { return m_Name; }

            set { m_Name = value; }

        }

 

        private string m_Gender;

        public string Gender

        {

            get { return m_Gender; }

            set { m_Gender = value; }

        }
   

        public SqlParameter[] ConvertToParams()

        {

            List<SqlParameter> list = new List<SqlParameter>();

            if (m_SAccount != null) list.Add(new SqlParameter("@SAccount", m_SAccount));

            if (m_SPwd != null) list.Add(new SqlParameter("@SPwd", m_SPwd));

            if (m_SearchArea != null) list.Add(new SqlParameter("@SearchArea", m_SearchArea));

            if (m_SID != null) list.Add(new SqlParameter("@SID", m_SID));

            if (m_SName != null) list.Add(new SqlParameter("@SName", m_SName));

            if (m_Gender != null) list.Add(new SqlParameter("@Gender", m_Gender));

            if (m_SIdentityNum != null) list.Add(new SqlParameter("@SIdentityNum", m_SIdentityNum));

            if (m_STel != null) list.Add(new SqlParameter("@STel", m_STel));

            return list.ToArray();

        }
}


所以数据访问层可以改成:

public int Register(StudentModel model)
{

        Database db = new Database();

        SqlParameter[] paras =model.ConvertToParams();

                 return db.RunProc("StudentRegister", paras);
         }
  }

在数据访问层简单了很多呢,呵呵!但是在实体类中,我们很麻烦,我们将其转化为SqlParameter对象数组要遍历所有的属性,这些代码还要自己写,还是不够方便。要怎样才会更方便呢,请看下一道菜,O(∩_∩)O~
源码:3.改造对象参数.rar

posted @ 2009-10-01 13:01  星火幽蓝  阅读(216)  评论(0)    收藏  举报