//DataSet与泛型集合间的互相转换
//利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值。
//注意:从DataSet到IList<T>的转换,自定义类型的公开属性必须与DataTable中的字段名称
//一致,才能到达想要的结果。建议DataTable的定义从数据库来,自定义类型用O/R Mapping的方式获得。
//处理Null值很好,不想别的遇到数据库NULL值会报错 

//代码说明 

/// <summary>
/// 泛型集合与DataSet互相转换
/// </summary>
using System.Data;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using System;
public class IListDataSet
{ /// <summary>
/// 集合装换DataSet
/// </summary>
/// <param name="list">集合</param>
/// <returns></returns>
/// 2008-08-01 22:08 HPDV2806
public static DataSet ToDataSet(IList p_List)
{
DataSet result = new DataSet();
DataTable _DataTable = new DataTable();
if (p_List.Count > )
{
PropertyInfo[] propertys = p_List[].GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
_DataTable.Columns.Add(pi.Name, pi.PropertyType);
} for (int i = ; i < p_List.Count; i++)
{
ArrayList tempList = new ArrayList();
foreach (PropertyInfo pi in propertys)
{
object obj = pi.GetValue(p_List[i], null);
tempList.Add(obj);
}
object[] array = tempList.ToArray();
_DataTable.LoadDataRow(array, true);
}
}
result.Tables.Add(_DataTable);
return result;
} /// <summary>
/// 泛型集合转换DataSet
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">泛型集合</param>
/// <returns></returns>
/// 2008-08-01 22:43 HPDV2806
public static DataSet ToDataSet<T>(IList<T> list)
{
return ToDataSet<T>(list, null);
} /// <summary>
/// 泛型集合转换DataSet
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="p_List">泛型集合</param>
/// <param name="p_PropertyName">待转换属性名数组</param>
/// <returns></returns>
/// 2008-08-01 22:44 HPDV2806
public static DataSet ToDataSet<T>(IList<T> p_List, params string[] p_PropertyName)
{
List<string> propertyNameList = new List<string>();
if (p_PropertyName != null)
propertyNameList.AddRange(p_PropertyName); DataSet result = new DataSet();
DataTable _DataTable = new DataTable();
if (p_List.Count > )
{
PropertyInfo[] propertys = p_List[].GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
if (propertyNameList.Count == )
{
// 没有指定属性的情况下全部属性都要转换
_DataTable.Columns.Add(pi.Name, pi.PropertyType);
}
else
{
if (propertyNameList.Contains(pi.Name))
_DataTable.Columns.Add(pi.Name, pi.PropertyType);
}
} for (int i = ; i < p_List.Count; i++)
{
ArrayList tempList = new ArrayList();
foreach (PropertyInfo pi in propertys)
{
if (propertyNameList.Count == )
{
object obj = pi.GetValue(p_List[i], null);
tempList.Add(obj);
}
else
{
if (propertyNameList.Contains(pi.Name))
{
object obj = pi.GetValue(p_List[i], null);
tempList.Add(obj);
}
}
}
object[] array = tempList.ToArray();
_DataTable.LoadDataRow(array, true);
}
}
result.Tables.Add(_DataTable);
return result;
} /// <summary>
/// DataSet装换为泛型集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="p_DataSet">DataSet</param>
/// <param name="p_TableIndex">待转换数据表索引</param>
/// <returns></returns>
/// 2008-08-01 22:46 HPDV2806
public static IList<T> DataSetToIList<T>(DataSet p_DataSet, int p_TableIndex)
{
if (p_DataSet == null || p_DataSet.Tables.Count < )
return null;
if (p_TableIndex > p_DataSet.Tables.Count - )
return null;
if (p_TableIndex < )
p_TableIndex = ; DataTable p_Data = p_DataSet.Tables[p_TableIndex];
// 返回值初始化
IList<T> result = new List<T>();
for (int j = ; j < p_Data.Rows.Count; j++)
{
T _t = (T)Activator.CreateInstance(typeof(T));
PropertyInfo[] propertys = _t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
for (int i = ; i < p_Data.Columns.Count; i++)
{
// 属性与字段名称一致的进行赋值
if (pi.Name.Equals(p_Data.Columns[i].ColumnName))
{
// 数据库NULL值单独处理
if (p_Data.Rows[j][i] != DBNull.Value)
pi.SetValue(_t, p_Data.Rows[j][i], null);
else
pi.SetValue(_t, null, null);
break;
}
}
}
result.Add(_t);
}
return result;
} /// <summary>
/// DataSet装换为泛型集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="p_DataSet">DataSet</param>
/// <param name="p_TableName">待转换数据表名称</param>
/// <returns></returns>
/// 2008-08-01 22:47 HPDV2806
public static IList<T> DataSetToIList<T>(DataSet p_DataSet, string p_TableName)
{
int _TableIndex = ;
if (p_DataSet == null || p_DataSet.Tables.Count < )
return null;
if (string.IsNullOrEmpty(p_TableName))
return null;
for (int i = ; i < p_DataSet.Tables.Count; i++)
{
// 获取Table名称在Tables集合中的索引值
if (p_DataSet.Tables[i].TableName.Equals(p_TableName))
{
_TableIndex = i;
break;
}
}
return DataSetToIList<T>(p_DataSet, _TableIndex);
}
} /*****************
使用范围 1. 可以用在业务层中数据获取,获取DataSet的同时也可以转为IList集合为调用者所使用。 2. 在WebServices中传输自定义类型使用,即传递参数都用DataSet类型(WebServices直接支持的数据类型),在使用前将其转换为IList来使用。
* ******************************/


http://www.cnblogs.com/envelope/archive/2010/04/20/1716343.html

最新文章

  1. Intel Media SDK H264 encoder GOP setting
  2. Element is not currently interactable and may not be manipulated
  3. LeetCode 328. Odd Even Linked List
  4. ruby学习网站
  5. JDBC接口规范
  6. Slow HTTP Denial of Service Attack
  7. allegro生成光绘文件时,通过cam打开,*.drl钻孔文件不识别,为Unknow类型
  8. pancake sort的几个问题
  9. Myeclipse8.5注册码
  10. 10.8 OSInstall破解
  11. Jquery:强大的选择器&lt;一&gt;
  12. asp.net 追加文本(追加写入记事本)
  13. block 解析 - 成员变量
  14. Ubuntu 12.04 安装JDK 8和Eclipse
  15. vsftp FTP服务器外网访问设置
  16. 如何快速高效地完成一个Android项目?
  17. sqlserver安装检测不通过 (重新启动失败)
  18. bzoj4025二分图(线段树分治 并查集)
  19. Java集合—Set集和Map集
  20. Fortran中的指针使用

热门文章

  1. MapReduce序列化及分区的java代码示例
  2. Waltz of love
  3. 动态的GRE OVER IPSEC的实验模拟与分析
  4. win10安装kali组双系统
  5. keil5最新版安装与破解
  6. java 写一个单例设计程序,打印出该对象的地址
  7. golang 并发执行函数func类型slice
  8. pylearn2报错缺少theano.compat.six
  9. .Net 面试题 汇总(五)
  10. Spark性能优化--开发调优与资源调优