/DataSet与泛型集合间的互相转换

//利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值。
//注意:从DataSet到IList<T>的转换,自定义类型的公开属性必须与DataTable中的字段名称
//一致,才能到达想要的结果。建议DataTable的定义从数据库来,自定义类型用O/R Mapping的方式获得。
 
//代码说明
 
 
 
/// <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 > 0)
        {
            PropertyInfo[] propertys = p_List[0].GetType().GetProperties();
            foreach (PropertyInfo pi in propertys)
            {
                _DataTable.Columns.Add(pi.Name, pi.PropertyType);
            }
 
            for (int i = 0; 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 > 0)
        {
            PropertyInfo[] propertys = p_List[0].GetType().GetProperties();
            foreach (PropertyInfo pi in propertys)
            {
                if (propertyNameList.Count == 0)
                {
                    // 没有指定属性的情况下全部属性都要转换
                    _DataTable.Columns.Add(pi.Name, pi.PropertyType);
                }
                else
                {
                    if (propertyNameList.Contains(pi.Name))
                        _DataTable.Columns.Add(pi.Name, pi.PropertyType);
                }
            }
 
            for (int i = 0; i < p_List.Count; i++)
            {
                ArrayList tempList = new ArrayList();
                foreach (PropertyInfo pi in propertys)
                {
                    if (propertyNameList.Count == 0)
                    {
                        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 < 0)
            return null;
        if (p_TableIndex > p_DataSet.Tables.Count - 1)
            return null;
        if (p_TableIndex < 0)
            p_TableIndex = 0;
 
        DataTable p_Data = p_DataSet.Tables[p_TableIndex];
        // 返回值初始化
        IList<T> result = new List<T>();
        for (int j = 0; 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 = 0; 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 = 0;
        if (p_DataSet == null || p_DataSet.Tables.Count < 0)
            return null;
        if (string.IsNullOrEmpty(p_TableName))
            return null;
        for (int i = 0; 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来使用。
 * ******************************/

DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)的更多相关文章

  1. DataSet和List 泛型之间互相转换 (转载)

    //DataSet与泛型集合间的互相转换 //利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. //注意:从DataSet到IList<T>的转换,自定义类型的公开属 ...

  2. Visual Studio各版本工程文件之间的转换 [转载]

    原网址:http://www.cnblogs.com/jmliao/p/5594179.html Visual Studio各版本工程文件之间的转换   由于VS版本比较多,低版本无法直接打开高版本的 ...

  3. 编码与乱码(05)---GBK与UTF-8之间的转换--转载

    原文地址:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html [GBK转UTF-8] 在很多论坛.网上经常有网友问“  ...

  4. C/C++ GBK和UTF8之间的转换

    { 关于GBK和UTF-8之间的转换,很多初学者会很迷茫. 一般来说GBK和UTF-8是文字的编码方式,其对应的内码是不一样的,所以GBK和UTF-8的转换需要对内码进行一一映射,然后进行转换. 对于 ...

  5. C# 中List<T>与DataSet之间的转换

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  6. DataSet和泛型之间相互转换

    取数据的时候,存储过程返回了多个结果集,后台用DataSet去接收这几个结果集,然后接收之后,需要将结果集转换为不同的实体,于是下面的代码便出现了. /// <summary> /// 将 ...

  7. Java 集合 集合与数组之间的转换

    Java 集合 集合与数组之间的转换 @author ixenos 数组转集合 Arrays.asList(T... a) 先给结论:用 Arrays.asList(T... a) 将数组转换成集合 ...

  8. 实体类与实体DTO类之间的转换

    实体类与实体DTO类之间的转换 实体类与实体DTO类之间的转换 1.通过使用第三方序列化反序列化工具Newtonsoft.Json 2.通过反射实现 3.通过表达式目录树加字典缓存实现 4. 通过表达 ...

  9. JSON字符串和JS对象之间的转换

    JSON字符串和JS对象之间的转换 1 json字符串转换为js对象 1.1 标准json格式字符串转换为Js对象  JSON字符串 str JSON.parse(str) eval(str) eva ...

随机推荐

  1. javaWeb知识的回顾

    16年7月毕业,现在工作也有3个多月了.一直是在做一些增删改查,技术上没有太大的突破,自己总结下原因,还是原理理解的不够透彻,地基没打好就盖不成高楼. 在51cto上找到了佟刚老师的视频,快进游览一遍 ...

  2. prestashop 基本设置

    不跳转 要先改这个UPDATE`ps_shop_url`SET`domain_ssl`= replace(`domain_ssl` ,'us2.try.net','www.gelchaussures. ...

  3. hdu 1212 Big Number(大数取模)

    Problem Description As we know, Big Number is always troublesome. But it's really important in our A ...

  4. centos6.5中gitlab的搭建

    使用gitlab官网给的源码进行安装,步骤如下: Install a GitLab CE Omnibus package on CentOS 6 (and RedHat/Oracle/Scientif ...

  5. Windows安装Composer出现【Composer Security Warning】警告

    提示信息: The openssl extension is missing from the PHP version you specified.This means that secure HTT ...

  6. nuget pack 时不包含依赖包(而不是引用项目的dll,区别于IncludeReferencedProjects)

    Excluding development dependencies when creating packages Some NuGet packages are useful as developm ...

  7. Python 模块功能paramiko SSH 远程执行及远程下载

    模块 paramiko paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现 ...

  8. 判断是ios还是android

    //判断是ios还是androidvar system;var ua = navigator.userAgent.toLowerCase(); if (/iphone|ipad|ipod/.test( ...

  9. group_concat()函数总结

    group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组, ...

  10. List、Set、Map集合存放null解析及HashMap、Hashtable异同点解析

    1.List.Set.Map集合存放null解析: @Test public void CollectionTest() { // 测试List List<Object> list = n ...