/// <summary>
/// 将DataReader转换为泛型集合
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="dr">DataReader</param>
/// <returns></returns>
private List<T> DataReaderToList<T>(IDataReader dr) where T : class
{
List<T> list = new List<T>();
Type t = typeof(T);
PropertyInfo[] properties = t.GetProperties();
while (dr.Read())
{
dynamic o = Activator.CreateInstance(t) as T;
foreach (PropertyInfo p in properties)
{
if (!Convert.IsDBNull(dr[p.Name]))
{
p.SetValue(o, dr[p.Name], null);
}
}
T e = o as T;
list.Add(e);
}
return list;
}
==========================
可以考虑将dr转换成一个对象,如果属性存在的话。
将BaseIPEntity的属性名及值通过反射转化为Log
/// <summary>
/// 根据一条数据记录创建实体对象
/// </summary>
public static BaseIPEntity CreateEntity(DataRow dr)
{
BaseIPEntity ent = new BaseIPEntity();
if(dr["IPID"] != DBNull.Value)ent.IPID = int.Parse(dr["IPID"].ToString());
if(dr["StartIP"] != DBNull.Value)ent.StartIP = (string)dr["StartIP"];
if(dr["EndIP"] != DBNull.Value)ent.EndIP = (string)dr["EndIP"];
if(dr["Address"] != DBNull.Value)ent.Address = (string)dr["Address"];
if(dr["Description"] != DBNull.Value)ent.Description = (string)dr["Description"];
return ent;
}
/// <summary>
/// 根据数据集合创建实体对象集合
/// </summary>
public static List<BaseIPEntity> CreateEntity(DataRow[] drs)
{
List<BaseIPEntity> ents = new List<BaseIPEntity>();
foreach (DataRow dr in drs)
{
ents.Add(CreateEntity(dr));
}
return ents;
}
/// <summary>
/// 将当前实体转化成日志记录
/// </summary>
public string ConvertEntityToLogString()
{
StringBuilder LogDetail = new StringBuilder();
LogDetail.AppendLine("IPID=" + this.IPID.ToString());
if (this.StartIP != null)LogDetail.AppendLine("StartIP=" + this.StartIP.ToString());
if (this.EndIP != null)LogDetail.AppendLine("EndIP=" + this.EndIP.ToString());
if (this.Address != null)LogDetail.AppendLine("Address=" + this.Address.ToString());
if (this.Description != null)LogDetail.AppendLine("Description=" + this.Description.ToString());
return LogDetail.ToString();
}
=============================
==========================
这是一个轻量的映射工具,不可与ORM做比较。它不参与到DB。一般用来配合SqlHelper来使用。目前实现的功能有:DataReader到List的映射、
DataReader到T的映射、List到List的映射、T到T的映射、T到数据库参数的映射。以上这些都是平时操作数据库工作量最大的部分,而且都是重
复的没有含量的工作。其实真正写SQL并不占用多少工作量。
下面来说下如何使用,并写几个各个功能下的使用示例。
首先下载:Assionsoft.AssionMapper 程序集,所有映射功能全部在这个程序集下面。不需要进行XML的配置。
1、我们不采取XML配置的映射形式,而是在实体类上标上特性的方式。通过元数据标识映射。比如下面的学生实体:
[ResultsMap( " SysNo " )] // 参与集合DataReader返回映射,如果[ResultMap]无参则默认已属性名匹配
[ObjectMap] // 参与对象映射
[ParameterMap] // 参与数据库参数映射
public int SysNo { get ; set ; }
[ResultMap( " Name " )] // 参与单体DataReader返回映射,如果[ResultMap]无参则默认已属性名匹配
[ResultsMap( " Name " )] // 参与集合DataReader返回映射,如果[ResultMap]无参则默认已属性名匹配
[ObjectMap] // 参与对象映射
[ParameterMap( " Name " )] // 参与数据库参数映射
public string Name { get ; set ; }
[ResultMap( " Gender " )] // 参与单体DataReader返回映射,如果[ResultMap]无参则默认已属性名匹配
[ResultsMap( " Gender " )] // 参与集合DataReader返回映射,如果[ResultMap]无参则默认已属性名匹配
[ObjectMap] // 参与对象映射
[ParameterMap] // 参与数据库参数映射
public bool Gender { get ; set ; }
[ResultMap( " Age " )] // 参与单体DataReader返回映射,如果[ResultMap]无参则默认已属性名匹配
[ResultsMap( " Age " )] // 参与集合DataReader返回映射,如果[ResultMap]无参则默认已属性名匹配
[ObjectMap] // 参与对象映射
[ParameterMap] // 参与数据库参数映射
public int Age { get ; set ; }
[ResultMap( " Birthday " )] // 参与单体DataReader返回映射,如果[ResultMap]无参则默认已属性名匹配
[ResultsMap( " Birthday " )] // 参与集合DataReader返回映射,如果[ResultMap]无参则默认已属性名匹配
[ObjectMap] // 参与对象映射
[ParameterMap] // 参与数据库参数映射
public DateTime Birthday { get ; set ; }
2、数据库插入增、删、改的参数映射,我们通过委托把Common.Parameter.AddWithValue传给方法进行与student的映射。
SqlConnection conn = new SqlConnection( " server=ASSIONYANG-PCJ\\SQLEXPRESS;uid=sa;pwd=123;database=Testing " );
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = " INSERT INTO ([Name],[Gender],[Age],[Birthday]) VALUES (@Name,@Gender,@Age,@Birthday) " ;
ParameterMap.SqlParameterMap < Student > (cmd.Parameters.AddWithValue, student); // 生成数据库参数
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
conn.Close();
3、DataReader返回集合的映射
4、DataReader 返回实体的映射
SqlConnection conn = new SqlConnection( " server=ASSIONYANG-PCJ\\SQLEXPRESS;uid=sa;pwd=123;database=Testing " );
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = " SELECT [SysNo],[Name],[Gender],[Age],[Birthday] FROM Student WHERE [SysNo]=@SysNo " ;
ParameterMap.SqlParameterMap < Student > (cmd.Parameters.AddWithValue, student);
SqlDataReader dataReader = cmd.ExecuteReader();
student = ResultMap.Load < Student > (dataReader); // 从DataReader返回单个实体
dataReader.Close();
conn.Close();
5、集合TO 集合的映射
IList < Student > studentResultList = new List < Student > ();
studentResultList = ResultMap.GetIList < Student, Student > (studentList); // 从集合返回集合
6、实体TO 实体的映射
Student studentResult = new Student();
studentResult = ResultMap.Load < Student, Student > (student); // 从实体返回实体
水文结束!
http://www.cnblogs.com/assion/archive/2011/03/30/2000004.html
===============================
IDataReader/DataTable扩展ToList<T> 改进版,反射速度慢的惊人!