文档章节

DataReader,DataTable利用泛型填充实体类

深圳大道
 深圳大道
发布于 2016/12/29 15:34
字数 475
阅读 7
收藏 0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
///TestTableModel 的摘要说明
/// </summary>
public class TestTableModel
{
    public int D_Id { get; set; }
    public string D_Name { get; set; }
    public string D_Password { get; set; }
    public string D_Else { get; set; }
    public decimal D_Amount { get; set; }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Reflection;

namespace MSCL
{
    /// <summary>
    ///ObjectToList 的摘要说明
    /// </summary>
    public static class ObjectToList
    {
        /*  --示例
            IDataReader dr = MSCL.SqlHelper.GetSqlDataReader("select * from TestTable where d_id in(6,7,8)");
            List<TestTableModel> t1 = MSCL.ObjectToList.DataReaderToList<TestTableModel>(dr);
            for (int i = 0; i < t1.Count; i++)
            {
                Response.Write(t1[i].D_Id + "<br/>");
                Response.Write(t1[i].D_Name + "<br/>");
                Response.Write(t1[i].D_Password + "<br/>");
                Response.Write(t1[i].D_Else + "<br/>");
                Response.Write(t1[i].D_Amount + "<br/>");
            }   
            dr.Dispose();
            dr.Close();
         */

        /// <summary>
        /// DataReader利用泛型填充实体类
        /// </summary>
        /// <typeparam name="T">实体类</typeparam>
        /// <param name="reader">DataReader</param>
        /// <returns></returns>
        public static List<T> DataReaderToList<T>(IDataReader reader)
        {
            //实例化一个List<>泛型集合
            List<T> DataList = new List<T>();
            while (reader.Read())
            {
                T RowInstance = Activator.CreateInstance<T>();//动态创建数据实体对象
                //通过反射取得对象所有的Property
                foreach (PropertyInfo Property in typeof(T).GetProperties())
                {
                    try
                    {
                        //取得当前数据库字段的顺序
                        int Ordinal = reader.GetOrdinal(Property.Name);
                        if (reader.GetValue(Ordinal) != DBNull.Value)
                        {
                            //将DataReader读取出来的数据填充到对象实体的属性里
                            Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), null);
                        }
                    }
                    catch
                    {
                        break;
                    }
                }
                DataList.Add(RowInstance);
            }
            return DataList;
        }

        /// <summary>
        /// DataTable利用泛型填充实体类
        /// </summary>
        /// <typeparam name="T">实体类</typeparam>
        /// <param name="dt">DataTable</param>
        /// <returns></returns>
        public static List<T> DataTableToList<T>(DataTable dt) where T : new()
        {
            var list = new List<T>();
            if (dt == null) return list;
            var len = dt.Rows.Count;

            for (var i = 0; i < len; i++)
            {
                var info = new T();
                foreach (DataColumn dc in dt.Rows[i].Table.Columns)
                {
                    var field = dc.ColumnName;
                    var value = dt.Rows[i][field].ToString();
                    if (string.IsNullOrEmpty(value)) continue;
                    if (IsDate(value))
                    {
                        value = DateTime.Parse(value).ToString();
                    }

                    var p = info.GetType().GetProperty(field);

                    try
                    {
                        if (p.PropertyType == typeof(string))
                        {
                            p.SetValue(info, value, null);
                        }
                        else if (p.PropertyType == typeof(int))
                        {
                            p.SetValue(info, int.Parse(value), null);
                        }
                        else if (p.PropertyType == typeof(bool))
                        {
                            p.SetValue(info, bool.Parse(value), null);
                        }
                        else if (p.PropertyType == typeof(DateTime))
                        {
                            p.SetValue(info, DateTime.Parse(value), null);
                        }
                        else if (p.PropertyType == typeof(float))
                        {
                            p.SetValue(info, float.Parse(value), null);
                        }
                        else if (p.PropertyType == typeof(double))
                        {
                            p.SetValue(info, double.Parse(value), null);
                        }
                        else
                        {
                            p.SetValue(info, value, null);
                        }
                    }
                    catch (Exception)
                    {
                        //p.SetValue(info, ex.Message, null); 
                    }
                }
                list.Add(info);
            }
            dt.Dispose(); dt = null;
            return list;
        }

        /// <summary>
        /// 是否是时间
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        private static bool IsDate(string d)
        {
            DateTime d1;
            double d2;
            return !double.TryParse(d, out d2) && DateTime.TryParse(d, out d1);
        }
    }
}

本文转载自:http://blog.csdn.net/smartsmile2012/article/details/11147561

深圳大道
粉丝 3
博文 877
码字总数 0
作品 0
深圳
架构师
私信 提问
一个分层架构设计的例子(1)

一般来说,对系统的分层,一般都需要下面几个层:实体层(Entity)、数据访问层(DAL)、业务逻辑层(BLL)、界面层(UI);而数据访问层,一般也会加入一个接口层(IDAL)。 在其中的实体层,一般是根据...

walb呀
2017/12/04
0
0
List泛型与DataTable相互转换

public static class ExtensionMethods { /// /// 将List转换成DataTable /// /// /// /// public static DataTable ToDataTable(this IList data) { Proper...

岁月不改
2018/11/22
0
0
IBatis.net使用说明

IBatis.net是移植于java版本,所以在.net平台上的操作和java平台上的操作基本没有什么太大的差别。严格来说,ibatis.net并不算的上是一种orm,因为它的sql语句均写到了配置文件中,没有自己专...

JungleKing
2016/11/23
25
0
ado.net之实用篇

一.概念理解 ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的Microsoft技术中访问数据。之所以使用ADO.NET名称,是因为Microsoft希望表明,这是在NET编程环...

老杨纪事
2017/03/30
0
0
DataReader与DataSet有什么区别?

dataset表示一个数据集,是数据在内存中的缓存。 可以包括多个表 DatSet 连接数据库时是非面向连接的。把表全部读到Sql中的缓冲池,并断开于数据库的连接 datareader 连接数据库时是面向连接...

hopegaosh
2011/04/02
186
0

没有更多内容

加载失败,请刷新页面

加载更多

c语言实现Sqlite3的创建db和增删改查db操作

SQLite,是一款轻型的数据库,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中使用广泛,现在准备学习一下sqlite3的使用方法并写一个测试demo,后面在项目智能...

jorin_zou
3分钟前
2
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第2题

choose three Which three are true about the CREATE TABLE command? A) It can include the CREATE...INDEX statement for creating an index to enforce the primary key constraint. B) ......

oschina_5359
6分钟前
2
0
如何在二维码中循环批量插入图片

现在二维码种类比较多,为了突出二维码的个性及吸引客户,很多朋友都喜欢在二维码上插入图片。想要每个二维码都与众不同,但是有的时候需要批量插入图片数量有限,如果制作的二维码比较多的话...

中琅软件
7分钟前
2
0
LTR那点事—AUC及其与线上点击率的关联详解

LTR(Learning To Rank)学习排序是一种监督学习(SupervisedLearning)的排序方法,现已经广泛应用于信息索引,内容推荐,自然语言处理等多个领域。以推荐系统为例,推荐一般使用多个子策略...

达观数据
8分钟前
2
0
IntelliJ 如何显示代码的代码 docs

希望能够在 IntelliJ 代码上面显示方法的 docs。 如何进行显示? 你可以使用 Ctrl + Q 这个快捷键来查看方法的 Docs。 https://blog.ossez.com/archives/3061...

honeymoose
11分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部