原创者:星火幽蓝 创建时间:2009-10-1
从上道菜中,我们看到实体类不应该含有SqlParameter的对象。
所以这里就要教你一个方法,如何可以有效地做到传递参数,又可以序列化实体类。
(1)要解耦,必须要依赖抽象,而不能依赖具体的类,所以我先定义了一个实体类的接口,用它来制作SqlParameter参数。
namespace Model
{
public interface IModel
{
/// <summary>
/// 第奇数个存放参数名,第偶数个存放前一个参数的值。
/// </summary>
string[] Paras
{
get;
}
}
}
(2)具体的实体类实现这个接口。
namespace Model
{
[Serializable]
public class EmployeeModel : IModel
{
/// <summary>
/// 实体类构造函数,默认制作数据库参数
/// </summary>
public EmployeeModel()
{
m_paras = new List<string>();
}
/// <summary>
/// 第奇数个存放参数名,第偶数个存放前一个参数的值。
/// </summary>
private List<string> m_paras;
public string[] Paras
{
get { return m_paras.ToArray(); }
}
private string m_EAccount;
public string EAccount
{
get { return m_EAccount; }
set
{
m_EAccount = value;
m_paras.Add("EAccount");
m_paras.Add(value.ToString());
}
}
private string m_Psw;
public string Psw
{
get { return m_Psw; }
set
{
m_Psw = value;
m_paras.Add("Psw");
m_paras.Add(value.ToString());
}
}
}
}
(3)下面就在数据访问层利用接口制作SqlParameter参数了:
#region 把实现了IMode接口的类转化为SqlParameter参数数组
/// <summary>
/// 把Model类转化SqlParameter参数
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
private SqlParameter[] ConvertParas(IModel model)
{
if (model == null) return null;
List<SqlParameter> m_paras = new List<SqlParameter>();
string[] parasStr = model.Paras;
for (int i = 0; i < parasType.Length; i++)
{
m_paras.Add(new SqlParameter(parasStr[i * 2], parasStr[i * 2 + 1]));
}
return m_paras.ToArray();
}
#endregion
所以只要是实现了IModel的实体类,就可以直接转化为SqlParameter的数组。
在通用的DataBase中可以以下定义:
public int RunInt(string procName, IModel model)
{
SqlParameter[] prams = ConvertParas(model);
return RunInt(procName, prams);
}
在数据访问层中,只需要以下定义:
public int AddEmployee(EmployeeModel model)
{
DataBase db=new DataBase();
return db.RunInt("Employee_Add", model);
}
不知道我讲清楚了没有,不过这样做的话,真的让我方便好多。