问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何将已经绑定到DataTable中的数据转换为List中的数据

发布网友 发布时间:2022-04-07 17:43

我来回答

4个回答

懂视网 时间:2022-04-07 22:04

public class DataTableToList<T>whereT :new() 2 3 { 4 5 ///<summary> 6 7 ///利用反射将Datatable转换成List模型 8 9 ///</summary> 10 11 ///<param name="dt"></param> 12 13 ///<returns></returns> 14 15 public static List<T> ConvertToList(DataTabledt) 16 17 { 18 19 List<T> list =newList<T>(); 20 21 Typetype =typeof(T); 22 23 stringtempName =string.Empty; 24 25 foreach(DataRowdrindt.Rows) 26 27 { 28 29 T t =newT(); 30 31 PropertyInfo[] propertys = 32 t.GetType().GetProperties(); 33 34 foreach(PropertyInfopiinpropertys) 35 36 { 37 38 tempName = pi.Name; 39 40 if(dt.Columns.Contains(tempName)) 41 42 { 43 44 if(!pi.CanWrite) 45 46 { 47 48 continue; 49 50 } 51 52 var value = dr[tempName]; 53 54 if(value !=DBNull.Value) 55 56 { 57 58 pi.SetValue(t, value,null); 59 60 } 61 62 } 63 64 } 65 66 list.Add(t); 67 68 } 69 70 returnlist; 71 72 } 73 74 }

 

2. SqlDataReader转IList

 1  /// <summary>
 2  /// 判断SqlDataReader是否存在某列
 3  /// </summary>
 4  /// <param name="dr">SqlDataReader</param>
 5  /// <param name="columnName">列名</param>
 6  /// <returns></returns>
 7  private bool readerExists(SqlDataReader dr, string columnName)
 8  {
 9 
10  dr.GetSchemaTable().DefaultView.RowFilter = "ColumnName= ‘" + columnName + "‘";
11 
12  return (dr.GetSchemaTable().DefaultView.Count > 0);
13 
14  }
15 
16  ///<summary>
17  ///利用反射和泛型将SqlDataReader转换成List模型
18  ///</summary>
19  ///<param name="sql">查询sql语句</param>
20  ///<returns></returns>
21 
22  public IList<T> ExecuteToList<T>(string sql) where T : new()
23 
24  {
25  IList<T> list;
26 
27  Type type = typeof (T);
28 
29  string tempName = string.Empty;
30 
31  using (SqlDataReader reader = ExecuteReader(sql))
32   {
33   if (reader.HasRows)
34   {
35   list = new List<T>();
36   while (reader.Read())
37    {
38    T t = new T();
39 
40    PropertyInfo[] propertys = t.GetType().GetProperties();
41 
42    foreach (PropertyInfo pi in propertys)
43    {
44    tempName = pi.Name;
45 
46    if (readerExists(reader, tempName))
47     {
48     if (!pi.CanWrite)
49     {
50     continue;
51     }
52     var value = reader[tempName];
53 
54     if (value != DBNull.Value)
55     {
56     pi.SetValue(t, value, null);
57     }
58 
59     }
60 
61    }
62 
63    list.Add(t);
64 
65    }
66   return list;
67   }
68   }
69  return null;
70  }

 

3、结果集从存储过程获取

 1 /// <summary>
 2  /// 处理存储过程
 3  /// </summary>
 4  /// <param name="spName">存储过程名</param>
 5  /// <param name="parameters">参数数组</param>
 6  /// <returns>sql数据流</returns>
 7  protected virtual SqlDataReader ExecuteReaderSP(string spName, ArrayList parameters)
 8  {
 9  SqlDataReader result = null;
10  cmd.CommandText = spName;
11  cmd.CommandType = CommandType.StoredProcedure;
12   cmd.Parameters.Clear();
13  if (parameters != null)
14   {
15   foreach (SqlParameter param in parameters)
16   {
17    cmd.Parameters.Add(param);
18   }
19   }
20  try
21   {
22   Open();
23   result = cmd.ExecuteReader(CommandBehavior.CloseConnection);
24   }
25  catch (Exception e)
26   {
27   if (result != null && (!result.IsClosed))
28   {
29    result.Close();
30   }
31   LogHelper.WriteLog("
方法异常【ExecuteReaderSP(string spName, ArrayList parameters)】" + spName, e);
32   throw new Exception(e.Message);
33   }
34  return result;
35  }

 

 1 <strong> </strong> ///<summary>
 2  ///利用反射将SqlDataReader转换成List模型
 3  ///</summary>
 4  ///<param name="spName">存储过程名称</param>
 5  ///<returns></returns>
 6 
 7  public IList<T> ExecuteQueryListSP<T>(string spName, params SqlParameter[] listParams) where T : new()
 8  {
 9  IList<T> list;
10 
11  Type type = typeof(T);
12 
13  string tempName = string.Empty;
14 
15  using (SqlDataReader reader = ExecuteReaderSP(spName, new ArrayList(listParams)))
16   {
17   if (reader.HasRows)
18   {
19   list = new List<T>();
20   while (reader.Read())
21    {
22    T t = new T();
23 
24    PropertyInfo[] propertys = t.GetType().GetProperties();
25 
26    foreach (PropertyInfo pi in propertys)
27    {
28    tempName = pi.Name;
29 
30    //for (int intField = 0; intField < reader.FieldCount; intField++)
31    //{//遍历该列名是否存在
32    //}
33 
34    if (readerExists(reader, tempName))
35     {
36     if (!pi.CanWrite)
37     {
38     continue;
39     }
40     var value = reader[tempName];
41 
42     if (value != DBNull.Value)
43     {
44     pi.SetValue(t, value, null);
45     }
46 
47     }
48 
49    }
50 
51    list.Add(t);
52 
53    }
54   return list;
55   }
56   }
57  return null;
58  }

 

作者:dasihg

转载:http://blog.csdn.net/dasihg/article/details/8943811

 

利用反射将Datatable、SqlDataReader转换成List模型

标签:

热心网友 时间:2022-04-07 19:12

封装了东西多不代表他慢,两者效率其实差不了多少,不过如果是从数据层返回的话,还是用List比较好,这样,与数据库的关系,分离的更彻底些

热心网友 时间:2022-04-07 20:30

我不太明白你的意思,是自己构造的List数据?然后手写一个Databable,然后将Databable中的数据转成List数据?

热心网友 时间:2022-04-07 22:05

最好给代码看看 类型报错 你说看不出来是那的错误
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
沈阳有哪些家居商场 沈阳都有哪些家居城 沈阳市有多少个家具城 沈阳都有什么家具城 沈阳有多少家家俱商城 沈阳家具地方有哪些 沈阳有哪些大型家居 沈阳美凯龙有什么牌子 沈阳家居市场有哪些品牌 消食片饭前还是饭后吃 在电话里投人保车险返款是真的吗? OPPOA11X怎么调成4G网络? 蒲松龄的介绍 oppoa11的手机怎么开4g的网络 蒲松龄的生平有哪些介绍? OPPOa11怎么恢复4g? 无亮码成功记录是什么意思 oppoa11版本11怎么切换4g? 4G网络怎么调OPPOA11? oppoa11PCHM10怎么调成4g网? 粤康码亮码失败是怎么回事 怎么用别人的找到他的抖音号? 能通过查抖音吗 种植葱头的妙招 小圆葱的种植方法 不是自己的微信好友知道他的怎么查抖音号 不是自己的微信好友知道他的怎么查抖音号 种植葱头田间怎么管理? 能通过查抖音吗? 怎么用别人的找到他的抖音号? 今天去人保续车险业务员说返现500元我亏了吗 OPPOr11移动数据类型显示E,而且用不了流量,怎么显示4G,用流量啊 买进股票时,价格比实际价低点,能买入成功吗 买人保车险返现,如果出了事故会全赔吗?(买了不计免赔) 美咖相机怎么能退回上一版本 人保车险有微信支付 股价低于限制性股票交易价格可以考虑买进吗 我想要下载首发的软件,叫做美咖相机,是华为安卓的手机怎么下载? 股票委托买入交易可以设定比当时股价低的交易的不?比如现在股价8.00,我设7.80委托买入可以的不?我的意 买股票可以现价比均价低的股票吗? 看好的股票能不能设置低价格等股票下跌时自动买入 设定买入股票买入价格会自动下单?假如设定3元买入,当价格低于3元系统会购买么? 买股票委托价比现价低,能买入吗 蒲松龄有怎样的人物简介? 美咖相机怎么设置默认相机,魅族手机可以设置嘛 蒲松龄 介绍 蒲松龄的详细资料是什么? 滑雪比赛动作描写作文 买股票时用最低的价格买入的吗,还是??? 美咖相机和美颜相机哪个好