DataReader、Table、DataSet和Entity相互转化

 public class CommonService
    {
        #region DataReader转化
        /// <summary>
        /// 将DataReader转化为Table
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        public static DataTable DataReaderToTable(SqlDataReader reader)
        {
            var dt = new DataTable();
            if (reader.HasRows)
            {
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    var column = new DataColumn();
                    column.DataType = reader.GetFieldType(i);
                    column.ColumnName = reader.GetName(i);

                    dt.Columns.Add(column);
                }
                while (reader.Read())
                {
                    object[] rowObjects = new object[reader.FieldCount];
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        rowObjects.SetValue(reader.GetValue(i), i);
                    }

                    dt.LoadDataRow(rowObjects, true);
                }
            }
            else
            {
                dt = null;
            }

            return dt;
        }

        /// <summary>
        /// 将DataReader转化为Entity
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="reader"></param>
        /// <returns></returns>
        public static List<T> DataReaderToEntity<T>(SqlDataReader reader) where T : new()
        {
            var list = new List<T>();
            T t = default(T);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    t = (T)Activator.CreateInstance(typeof(T));
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        PropertyInfo property = t.GetType().GetProperty(reader.GetName(i), BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase);
                        if (Convert.IsDBNull(reader.GetValue(i)))
                        {
                            property.SetValue(t, null, null);
                        }
                        else
                        {
                            property.SetValue(t, reader.GetValue(i), null);
                        }

                        list.Add(t);
                    }
                }
            }

            return list;
        }
        #endregion

        #region DataTable转化
        /// <summary>
        /// Table转化为Entity
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="table"></param>
        /// <returns></returns>
        public static List<T> TableToEntity<T>(DataTable table) where T : new()
        {
            var list = new List<T>();
            T t = default(T);
            t = (T)Activator.CreateInstance(typeof(T));

            if (table == null || table.Rows.Count == 0)
            {

            }
            else
            {
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    foreach (DataColumn column in table.Columns)
                    {
                        PropertyInfo propertyInfo = t.GetType().GetProperty(column.ColumnName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                        if (Convert.IsDBNull(table.Rows[i][column.ColumnName]))
                        {
                            propertyInfo.SetValue(t, null, null);
                        }
                        else
                        {
                            propertyInfo.SetValue(t, table.Rows[i][column.ColumnName], null);
                        }
                    }

                    list.Add(t);
                }
            }

            return list;
        }

        /// <summary>
        /// Table转化为DataSet
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        public static DataSet TableToDataSet(DataTable table)
        {
            var dataSet = new DataSet();
            dataSet.Tables.Add(table);

            return dataSet;
        }
        #endregion

        #region Entity转化为Table

        public static DataTable EntityToTable<T>(List<T> list) where T : new()
        {
            var table = new DataTable();

            if (list == null || list.Count == 0)
            {

            }
            else
            {
                T t = list.FirstOrDefault();
                List<PropertyInfo> propertyInfos = t.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase).ToList();
                foreach (var propertyInfo in propertyInfos)
                {
                    table.Columns.Add(propertyInfo.Name, propertyInfo.PropertyType);
                }
                object[] objects = new object[propertyInfos.Count];

                for (int i = 0; i < list.Count; i++)
                {
                    foreach (var propertyInfo in propertyInfos)
                    {
                        objects.SetValue(propertyInfo.GetValue(list[i], null), propertyInfos.IndexOf(propertyInfo));
                    }

                    table.LoadDataRow(objects, true);
                }
            }

            return table;
        }

        #endregion
    }
时间: 2024-10-21 22:16:50

DataReader、Table、DataSet和Entity相互转化的相关文章

DataReader 和 DataSet 的区别

摘自:http://www.cnblogs.com/zhjjNo1/archive/2009/08/26/1554420.html 第一种解释 DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection(俗称:非断开式连接),在线操作数据库时,任何对SqlConnection的操作都会引发DataReader的异常.因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的.由于DataReader的特殊性和高性能,所以Dat

DataReader和DataSet区别

第一种解释 DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection(俗称:非断开式连接),在线操作数据库时,任何对SqlConnection的操作都会引发DataReader的异常.因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的.由于DataReader的特殊性和高性能,所以DataReader是只进的,你读了第一条后就不能再去读取第一条了. DataSet则是将数据一次性加载在内存中,抛弃数据库连接(俗称:断

C# 之 DataReader 和 DataSet 的区别

1. 获取数据的方式[1]DataReader 为在线操作数据, DataReader会一直占用SqlConnection连接,在其获得数据过程中其它操作不可以再使用SqlConnection连接对象. 代码如下: while(datareader.read()) { .............. } dataview.datasource=datareader; dataview.databind(); [2]DataSet为离线操作数据,DataSet会将数据一次性读入内存,然后断开连接,这

DataReader和DataSet的区别

使用DataSet是为了实现应用程序的下述功能: 1 操作结果中的多个分离的表.    2 操作来自多个源(例如来自多个数据库.XML文件和电子表格的混合数据)的数据.    3 在层之间交换数据或使用XML Web服务.与DataReader 不同,DataSet能被传递到远程客户端.    4 通过缓冲重复使用相同的行集合以提高性能(例如排序.搜索或过滤数据).    5 每行执行大量的处理.在使用DataReader返回的行上进行扩展处理将使连接存在的时间比必要的更长,从而降低效率.   

DataReader和DataSet的异同

DataReader:使用时始终占用SqlConnection,在线操作数据库:每次只在内存中加载一条数据,所以占用的内存是很小的:是只进的. 只读的. DataSet:则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即释放数据库连接SqlConnection(非连接模式) DataSet:将数据全部加载在内存中.所以比较消耗内存...但是确比DataReader要灵活..可以动态的添加行,列,数据.对数据库进行 回传更新操作(动态操作读入到内存的数据);

DataReader和DataSet的异同之处。

ADO.NET2.0提供了两个用于检索关系数据的对象:DataSet和DataReader.并且这两个对象都可以将检索的关系数据存储在内存中.在软件开发过程中经常用到这两个控件,由于这两个控件在使用和功能方面的相似,很多程序员错误地认为DataSet和DataReader是可以相互替代的.这种想法是错误的,在这我们分析一下DataSet控件和DataReader控件的区别. ■ 与数据库连接DatSet 连接数据库时是非面向连接的.把表全部读到Sql中的缓冲池,并断开于数据库的连接.Datare

[Entity Framework] Dababase First, Model 与 Table 的更新策略

在初次使用EF的Database first时,总感觉能迅速的从Data Table 快速将Entity Model快速建立出来,省去以往还要hard code撰写POCO类的功夫,但数据表设计随着开发而更新了几个版本后,常常发生Model 与 Table对不起来的情况,即便执行了"从数据库更新模型",不是字段没反映出来.就是出现错误消息,常常最后只能选择全部砍掉重练.... 在初次使用EF的Database first时,总感觉能迅速的从Data Table 快速将Entity Model快速

【ADO.NET基础知识】SqlConnection、command、DataSet 、DataTable、dataAdapter

1.使用Connection连接数据库的步骤: (1).添加命名空间 System.Data.SqlClient(注意:初学者经常会忘记) (2)定义连接字符串.连接SQL Server 数据库时: server=服务器名;database=数据库名;uid=用户名;pwd=密码;例如:要连接本机上的StudentManagement数据库,用户名为sa,密码为111 string connString="server=.;database=StudentManagement;uid=sa;pw

C#中的DataSet、string、DataTable 、对象转换成Json

C#中对象,字符串,dataTable.DataReader.DataSet,对象集合转换成Json字符串方法. public class ConvertJson { #region 私有方法 /// <summary> /// 过滤特殊字符 /// </summary> /// <param name="s">字符串</param> /// <returns>json字符串</returns> private s