using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Reflection;
namespace DatasetConvertList
{
//首先定义类,类下面的属性成员用来接收从table表里取出的对应字段
public class UserInfo
{
public int ID{get;set;}
public int Age{get;set;}
public string Nanme{get;set;}
}
class DataTableTolist
{
/// <summary>
/// 获取List<UserInfo>泛型集合 其实也就是//将DataTable转化成list<T> where T:class
/// </summary>
/// <param name="connStr">数据库连接字符串</param>
/// <param name="sql">sqL语句</param>
/// <param name="parameter">sql语句的参数</param>
/// <returns>返回一个list</returns>
public IList<UserInfo> GetUserInfoAll(string connStr, string sql, params SqlParameter[] parameter) //定义一个返回值是list<Userinfo>的方法,
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
foreach (SqlParameter p in parameter)
{
cmd.Parameters.Add(p);
}
IList<UserInfo> list = new List<UserInfo>();//定义一个list 到时候用来存放【已经将table表字段转换成Userinfo类属性成员的】类,也就是说list的成员就是Userinfo类的实例,而Userinfo的成员其实就是table表的字段
//using (SqlDataAdapter dapter=new SqlDataAdapter (cmd))
//{
// dapter.Fill(list);
//}
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
UserInfo userinto = new UserInfo(); //实例化一个UserInof类
userinto.ID = (int)dr["id"]; //将table表的id字段赋值给UserInof类的ID属性
userinto.Age = (int)dr["age"]; //将table表的age字段赋值给UserInof类的Age属性
userinto.Nanme = (string)dr["name"]; //将table表的name字段赋值给UserInof类的Nanme属性
list.Add(userinto); //将UserInof类是实例userinfo添加到list中
}
return list; //再把这个list返回去
}
}
}
}
//================下面是将一个DataSet转换成一个list=========================
class Program
{
/// <summary>
/// 获取泛型集合,注意,指所有的类型的list哦。【不像上面已经指定了List<T>的类型是UserInfo了哦】
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="connStr">数据库连接字符串</param>
/// <param name="sql">sql语句</param>
/// <param name="parameter">sql语句的参数</param>
/// <returns></returns>
public IList<T> GetList<T>(string connStr, string sql, params SqlParameter[] parameter)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
foreach(SqlParameter par in parameter)
{
cmd.Parameters.Add(par);
}
DataSet ds = new DataSet();
using (SqlDataAdapter dapter = new SqlDataAdapter(cmd))
{
dapter.Fill(ds);
return DataSetToList<T>(ds, 0);//调用下面的DataSetToList方法将DataSet转换为List
}
}
}
}
/// <summary>
/// DataSetToList
/// </summary>
/// <typeparam name="T">转换类型</typeparam>
/// <param name="ds">一个DataSet实例,也就是数据源</param>
/// <param name="tableIndext">DataSet容器里table的下标,只有用于取得哪个table,也就是需要转换表的索引</param>
/// <returns></returns>
public IList<T> DataSetToList<T>(DataSet ds, int tableIndext)
{
//确认参数有效
if (ds == null || ds.Tables.Count <= 0 || tableIndext < 0)
{
return null;
}
DataTable dt = ds.Tables[tableIndext]; //取得DataSet里的一个表dt
IList<T> list = new List<T>(); //实例化一个list
for (int i = 0; i < dt.Rows.Count; i++)
{
//创建泛型对象。为什么这里要创建一个泛型对象呢?是因为目前我不确定泛型的类型。
T t = Activator.CreateInstance<T>();
//或者写成这样,同样也是创建一个发泛型对象。
//t = default(T);
//获取t对象类型的所有公有属性
PropertyInfo[] tMembersAll = t.GetType().GetProperties();
for (int j = 0; j < dt.Columns.Count; j++) // 1 2 3
{
//遍历tMembersAll
foreach (PropertyInfo tMember in tMembersAll)
{
//取dt表中j列的名字,并把名字转换成大写的字母。整条代码的意思是:如果列名和属性名称相同时赋值
if (dt.Columns[j].ColumnName.ToUpper().Equals(tMember.Name.ToUpper()))
{
//dt.Rows[i][j]表示取dt表里的第i行的第j列;DBNull是指数据库中当一个字段没有被设置值的时候的值,相当于数据库中的“空值”。
if (dt.Rows[i][j] != DBNull.Value)
{
//SetValue是指:将指定属性设置为指定值。 tMember是T泛型对象t的一个公有成员,整条代码的意思就是:将dt.Rows[i][j]赋值给t对象的tMember成员,参数详情请参照http://msdn.microsoft.com/zh-cn/library/3z2t396t(v=vs.100).aspx/html
tMember.SetValue(t, dt.Rows[i][j], null);
}
else
{
tMember.SetValue(t, null, null);
}
break;//注意这里的break是写在if语句里面的,意思就是说如果列名和属性名称相同并且已经赋值了,那么我就跳出foreach循环,进行j+1的下次循环
}
}
}
list.Add(t);
}
return list;
}
static void Main(string[] args)
{
}
}
}
将DataSet转换成List,布布扣,bubuko.com
原文:http://blog.csdn.net/fanbin168/article/details/23461281