`
kevinhrw
  • 浏览: 192080 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C# DataReader反射获取实体类

    博客分类:
  • C#
阅读更多
在网上查了一下,发现有些人写的效率不高.自己修改了一下.
根据select出来的字段去反射.

        public static T ReaderToModel<T>(IDataReader dr)
        {
            try
            {
                using (dr)
                {
                    if (dr.Read())
                    {
                        Type modelType = typeof(T);
                        T model = Activator.CreateInstance<T>();
                        for (int i = 0; i < dr.FieldCount; i++)
                        {
                            PropertyInfo pi = modelType.GetProperty(GetPropertyName(dr.GetName(i)));
                            pi.SetValue(model, HackType(dr[i], pi.PropertyType), null);
                        }
                        return model;
                    }
                }
                return default(T);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static List<T> ReaderToList<T>(IDataReader dr)
        {
            using (dr)
            {               
                List<T> list = new List<T>();
                Type modelType = typeof(T);
                while (dr.Read())
                {
                    T model = Activator.CreateInstance<T>();
                    for (int i = 0; i < dr.FieldCount; i++)
                    {
                        PropertyInfo pi = modelType.GetProperty(GetPropertyName(dr.GetName(i)));
                        pi.SetValue(model, HackType(dr[i], pi.PropertyType), null);
                    }
                    list.Add(model);
                }
                return list;
            }
        }
        //这个类对可空类型进行判断转换,要不然会报错
        private static object HackType(object value, Type conversionType)
        {
            if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                if (value == null)
                    return null;

                System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);
                conversionType = nullableConverter.UnderlyingType;
            }
            return Convert.ChangeType(value, conversionType);
        }

        private static bool IsNullOrDBNull(object obj)
        {
            return ((obj is DBNull) || string.IsNullOrEmpty(obj.ToString())) ? true : false;
        }

        //取得DB的列对应bean的属性名
        private static string GetPropertyName(string column)
        {
            column = column.ToLower();
            string[] narr = column.Split('_');
            column = "";
            for (int i = 0; i < narr.Length; i++)
            {
                if (narr[i].Length > 1)
                {
                    column += narr[i].Substring(0, 1).ToUpper() + narr[i].Substring(1);
                }
                else
                {
                    column += narr[i].Substring(0, 1).ToUpper();
                }
            }
            return column;
        }
分享到:
评论

相关推荐

    DataReader反射泛型实体对象

    通过这样的方法,我们可以轻松地将数据库查询结果转换为任何预先定义好的实体类,无需为每种类型编写单独的映射代码。这在处理大量不同结构的数据时非常有用,提高了代码的可维护性和可扩展性。

    DataReader实体转换(支持复杂对象)

    高效的处理DataReader转化为实体对象。 支持发杂对象,如: Class A { public int x; public B y; } Class B { public int z; }

    C#中DataReader之應用

    SqlDataReader形成的是数据流,并且数据流是以只进且只读的形式。我们可以形容它向一股瀑布一样,只往前进。

    C#使用ExecuteReader返回DataReader

    在C#编程中,`ExecuteReader`方法是用于执行SQL查询或存储过程并返回一个`DataReader`对象,它提供了一种高效的方式连续读取数据库中的数据流,而不一次性加载所有结果到内存。当我们处理大量数据时,这种方法尤其...

    C#实现实体类自动生成(源代码)

    本文将详细介绍如何使用C#和ADO.NET来实现实体类的自动生成,以及两种不同的实现方法:一种基于SQL语句,另一种不依赖SQL。 1. ADO.NET基础 ADO.NET是.NET Framework的一部分,它提供了与数据库交互的全面解决方案...

    自定义实体类简介

    以下是一个使用C#实现自定义实体类的简单示例: ```csharp public class User { public int UserId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } // 构造函数...

    把DataReader转换成DataTable的方法

    3. **使用GetSchemaTable方法获取列信息**:利用DataReader的`GetSchemaTable()`方法来获取表结构信息,包括列名、数据类型等。 4. **构建DataTable的列结构**:根据获取的列信息添加列到DataTable中。 5. **填充...

    C#的Json操作类,支持数组,DataTable,DataReader等转Json

    C#的Json操作类,支持数组,DataTable,DataReader等转Json

    DataReader实体自动映射.txt

    DataReader实体自动映射

    datareader实例代码.rar_csharp datareader_csharp 实例_datareader_datare

    在C#中,此类可能会包含一些属性和方法,以帮助处理从DataReader获取的数据。 6. **C#实例代码**: 压缩包可能包含了一个使用DataReader的示例程序,展示如何从数据库中获取数据,处理结果,并可能利用"contract...

    C#版Oracle数据库通用操作类

    ### C# 版 Oracle 数据库通用操作类解析 在现代软件开发中,数据库操作是必不可少的一部分,而 C# 结合 Oracle 数据库的应用尤为广泛。本文将深入探讨一个用于简化 Oracle 数据库操作的 C# 类——`ConnForOracle`。...

    mysql 数据库生成实体类代码

    MySQL数据库生成实体类代码主要涉及的是C#编程语言与MySQL数据库的交互,以及代码自动生成技术。在软件开发中,实体类通常代表数据库中的表,它们提供了数据模型的面向对象表示,使得开发者能够更容易地操作数据库。...

    C# 各种通用类集合

    03.DataReader的辅助类 MyDataReaderHelper.cs 04.DataTable操作辅助类 MyDataTableHelper.cs 05.DateTime的辅助类 MyDateTimeHelper.cs 06.常用的目录操作辅助类 MyDirHelper.cs 07.枚举操作辅助类 MyEnumHelper ...

    C# 各种helper类

    在C#编程中,"Helper"类是一种常见的设计模式,用于封装特定功能或一组相关功能,使得代码更易于理解和维护。这些Helper类通常包含了对常用数据类型、文件操作、网络通信等的便捷处理方法。以下将详细介绍标题和描述...

    C# SqlHelper类 (微软官方)

    这个类通常被用在C#应用程序中,以执行SQL命令和存储过程。SqlHelper类的设计目标是提高代码的可重用性和安全性,通过参数化查询来防止SQL注入攻击。 SqlHelper类位于`System.Data.SqlClient`命名空间下,它是ADO...

    c#操作MySQL数据库封装类

    这个"c#操作MySQL数据库封装类"很可能是为了简化数据库交互,提供一个易于使用的接口,以提高代码的可读性和可维护性。下面我们将详细讨论如何在C#中封装MySQL数据库操作类以及涉及的关键知识点。 1. **数据库连接*...

    c# c sharp 数据库 操作 类 总结

    - Code First:基于代码模型创建数据库,通过定义POCO(Plain Old CLR Object)实体类和上下文类实现。 - Model First:基于数据库模型创建代码,使用EF Designer工具设计数据库模型。 - Database First:基于...

    使用C#将DataReader转换为IEnumerable

    本文将详细介绍如何在C#中将`DataReader`转换为`IEnumerable`,以及这样做的原因和应用场景。 首先,让我们理解这两个概念。`SqlDataReader`是ADO.NET的一部分,它提供了一种按需从数据库检索数据的方法,而不必一...

    C#源码 访问ACCESS数据库 通过反射调用命令 清理数据库 执行数据库优化 压缩操作

    在C#中,我们可以使用`System.Reflection`命名空间中的类来获取类型信息,创建对象,以及调用方法。在数据库操作中,反射可以用来动态执行未知或在编译时不确定的数据库命令。 **数据库清理** 数据库清理通常涉及...

    C# JSON通用转换类

    操作类中包含: 1. 过滤特殊字符 2. 格式化字符型、日期型、布尔型 3. List转换成Json 4. 对象转换为Json 5. 对象集合转换Json 6. 普通集合转换Json 7. DataSet转换为Json 8. Datatable转换为Json 9. DataReader转换...

Global site tag (gtag.js) - Google Analytics