在网上查了一下,发现有些人写的效率不高.自己修改了一下.
根据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转化为实体对象。 支持发杂对象,如: Class A { public int x; public B y; } Class B { public int z; }
SqlDataReader形成的是数据流,并且数据流是以只进且只读的形式。我们可以形容它向一股瀑布一样,只往前进。
在C#编程中,`ExecuteReader`方法是用于执行SQL查询或存储过程并返回一个`DataReader`对象,它提供了一种高效的方式连续读取数据库中的数据流,而不一次性加载所有结果到内存。当我们处理大量数据时,这种方法尤其...
本文将详细介绍如何使用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; } // 构造函数...
3. **使用GetSchemaTable方法获取列信息**:利用DataReader的`GetSchemaTable()`方法来获取表结构信息,包括列名、数据类型等。 4. **构建DataTable的列结构**:根据获取的列信息添加列到DataTable中。 5. **填充...
C#的Json操作类,支持数组,DataTable,DataReader等转Json
DataReader实体自动映射
在C#中,此类可能会包含一些属性和方法,以帮助处理从DataReader获取的数据。 6. **C#实例代码**: 压缩包可能包含了一个使用DataReader的示例程序,展示如何从数据库中获取数据,处理结果,并可能利用"contract...
### C# 版 Oracle 数据库通用操作类解析 在现代软件开发中,数据库操作是必不可少的一部分,而 C# 结合 Oracle 数据库的应用尤为广泛。本文将深入探讨一个用于简化 Oracle 数据库操作的 C# 类——`ConnForOracle`。...
MySQL数据库生成实体类代码主要涉及的是C#编程语言与MySQL数据库的交互,以及代码自动生成技术。在软件开发中,实体类通常代表数据库中的表,它们提供了数据模型的面向对象表示,使得开发者能够更容易地操作数据库。...
03.DataReader的辅助类 MyDataReaderHelper.cs 04.DataTable操作辅助类 MyDataTableHelper.cs 05.DateTime的辅助类 MyDateTimeHelper.cs 06.常用的目录操作辅助类 MyDirHelper.cs 07.枚举操作辅助类 MyEnumHelper ...
在C#编程中,"Helper"类是一种常见的设计模式,用于封装特定功能或一组相关功能,使得代码更易于理解和维护。这些Helper类通常包含了对常用数据类型、文件操作、网络通信等的便捷处理方法。以下将详细介绍标题和描述...
这个类通常被用在C#应用程序中,以执行SQL命令和存储过程。SqlHelper类的设计目标是提高代码的可重用性和安全性,通过参数化查询来防止SQL注入攻击。 SqlHelper类位于`System.Data.SqlClient`命名空间下,它是ADO...
这个"c#操作MySQL数据库封装类"很可能是为了简化数据库交互,提供一个易于使用的接口,以提高代码的可读性和可维护性。下面我们将详细讨论如何在C#中封装MySQL数据库操作类以及涉及的关键知识点。 1. **数据库连接*...
- Code First:基于代码模型创建数据库,通过定义POCO(Plain Old CLR Object)实体类和上下文类实现。 - Model First:基于数据库模型创建代码,使用EF Designer工具设计数据库模型。 - Database First:基于...
本文将详细介绍如何在C#中将`DataReader`转换为`IEnumerable`,以及这样做的原因和应用场景。 首先,让我们理解这两个概念。`SqlDataReader`是ADO.NET的一部分,它提供了一种按需从数据库检索数据的方法,而不必一...
在C#中,我们可以使用`System.Reflection`命名空间中的类来获取类型信息,创建对象,以及调用方法。在数据库操作中,反射可以用来动态执行未知或在编译时不确定的数据库命令。 **数据库清理** 数据库清理通常涉及...
操作类中包含: 1. 过滤特殊字符 2. 格式化字符型、日期型、布尔型 3. List转换成Json 4. 对象转换为Json 5. 对象集合转换Json 6. 普通集合转换Json 7. DataSet转换为Json 8. Datatable转换为Json 9. DataReader转换...