之前在机房合作的时候自己一直都在用的是datetable,但是在机房很作的过程中用到了list,那么究竟我们为什么要用到list呢。
优点:
之前返回datatable的时候是返回一条记录集,datatable只是将一条数据记录并返回,但是list返回的是一个实体的类,实体类中的属性名和数据库中的字段名是相对应的。
使用Datatable必须要清楚数据库中的字段名称
使用List可以直接获得类的属性,不必知道数据库中的设计,符合面向对象的特点。
那么我们应该如何使用呢
在D层新建一个ConvertSQLHeleper类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Reflection;
namespace DAL
{
public class ConvertSQLHelper
{
public List<T> ConvertToModel<T>(DataTable dt) where T : new()
{
List<T> ts = new List<T>(); //定义集合
Type type = typeof(T); //获得此模型的类型
string tempName = ""; //定义一个临时的变量
foreach (DataRow dr in dt.Rows) //遍历datatable中所有数据行
{
T t = new T();
PropertyInfo[] propertys = t.GetType().GetProperties(); //获得此模型的公共属性
foreach (PropertyInfo pi in propertys) //遍历所有属性
{
tempName = pi.Name; //将此属性赋值给临时变量
if (dt.Columns.Contains(tempName)) //检查datatable是否包含此列
{
//判断此属性是否有setter,这个啥意思呢,就是我们的实体层的{get;set;}如果我们的实体有了set方法,就说明可以赋值!
if (!pi.CanWrite) continue;
{
object value = dr[tempName]; //取值
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}
}
ts.Add(t); //对象添加到泛型集合中
}
return ts;
}
}
}
在写D层方法的过程中将Datatable类型的值转换成List
public List<CardInfo> SelectCustomer(CardInfo CardInfo)
{
SQLHelper sqlHelper = new SQLHelper();
SqlParameter[] sqlParams = { new SqlParameter("@CardID", CardInfo.CardID) };
string sql = "select * from CardInfo where CardID = @CardID";
DataTable dt = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);
ConvertSQLHelper convert = new ConvertSQLHelper();
List<CardInfo> list = convert.ConvertToModel<CardInfo>(dt);
return list;
}
这样我们的U层就可以直接得到一个List的一个实体类了。