第二道菜——改造对象参数
原创者:星火幽蓝 创建时间: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
原创者:星火幽蓝 我的邮箱:nihaowoshijiang@126.com