Datatable与泛型
封装ConvertHelper
/// <summary>
/// 实体转换辅助类
/// </summary>
/// <typeparam name="T"></typeparam>
public class ModelConvertHelper
{
public List<T> ConvertTomodel<T>(DataTable dt) where T : new()
{
//定义集合
List<T> ts = new List<T>();
//获得此模型的类型
Type type = typeof(T);
//定义一个临时变量
string tempName = "";
//遍历datatable中所有的数据行
foreach (DataRow dr in dt.Rows)
{
T t = new T();
//获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();
//遍历所有属性
foreach (PropertyInfo pi in propertys)
{
//将属性名称赋值给临时变量
tempName = pi.Name;
//检查datatable是否包含此列
if (dt.Columns.Contains(tempName))
{
//判断此属性是否有setter
if (!pi.CanWrite) continue;//改属性不可写,直接跳出
//取值
object value = dr[tempName];
//如果非空,则赋给对象的属性
if (value != DBNull.Value)
{
pi.SetValue(t,value,null);
}
}
}
//对象添加到泛型集合中
ts.Add(t);
}
return ts;
}
}
如何调用?
在D层中定义list来接收返回值
然后用 ModelConvertHelper b=new ModelConvertHelper();将datatable转换为list泛型
public List<Entity.Students> inquiryStudent(Entity.Students students)
{
//实例化sqlhelper
SqlHelper sqlhelper = new SqlHelper();
SqlParameter[] sqlparams = { new SqlParameter("@cardno", students.Cardno) };
//sql 语句
string sql = @"select *from Students where CardNo=@cardno";
DataTable table = sqlhelper.ExecuteNonQuery(sql, sqlparams, CommandType.Text);
//将datatable转换为list泛型
ModelConvertHelper b = new ModelConvertHelper();
List<Entity.Students> a = b.ConvertTomodel<Entity.Students>(table);
return a;
}
区别
接触到的第一个封装好的就是sqlhelper了,然后接触到了convertHelper,感觉很是神奇啊,sqlhelper是将数据库的增删改查封装在一起,那convertHelper是将Datatable转换成list泛型的方法封装在一起,很是方便啊,现在真的能够理解面向对象这个封装的好处了
Datatable
1.DataTable造成了层与层之间严重的耦合
2.如果不用converthelper的话,那么当我不知道数据库的结构(也就是不知道数据库每列的值)时,查询学生信息的时候,我想知道学生的性别是什么,这个时候我写成”DataTable(0).性别”、”DataTable(0).1”、”DataTable(0).2……还是”DataTable(0).Sex”?显然在我不知道D层或数据库中的结构是确定不了哪种形式的取值是对的。
3.在数据很多的情况下,将数据一个一个赋值给实体,将会有很长的代码冗余
ConvertHelper
用ConvertHelper时,在查询结果数据很多的情况下,可以说是省去了很多麻烦,因为不用一个一个的将值赋给实体,直接返回一个List泛型就可以了,再其它层直接调用list泛型就可以获取数据值了,如果数据很短的话,赋值和用list泛型都是可以的。