您的位置:首页 > 数据库

利用泛型和反射,将从数据库select出来的集合直接转换成对象

2012-06-30 17:55 591 查看
现在的版本是直接利用反射的,下一步将改编成利用快速反射

public static T ExcuteEntity<T>(SQLiteCommand cmd)
{
Type entityType = typeof(T);
PropertyInfo[] fieldinfos = entityType.GetProperties();
T entity = (T)Activator.CreateInstance(entityType);
DbDataReader reader = null;
if (conn == null || conn.Length == 0)
throw new ArgumentNullException("connectionString");
SQLiteConnection con = new SQLiteConnection(conn);
SQLiteTransaction trans = null;
PrepareCommand(cmd, con, ref trans, false, cmd.CommandType, cmd.CommandText);
try
{
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
reader.Read();
}
catch (Exception ex)
{
throw ex;
}
foreach (PropertyInfo field in fieldinfos)
{
int col=reader.GetOrdinal(field.Name);
if (col != -1)
{
Type mytype = reader.GetFieldType(col);
entityType.GetProperty(field.Name).SetValue(entity, Convert.ChangeType(reader.GetValue(col), mytype), null);
}
else {
continue;
}
}
return entity;
}

public static List<T> ExecuteCollection<T>(SQLiteCommand cmd) {
List<T> result = new List<T>();
Type entityType = typeof(T);
PropertyInfo[] fieldinfos = entityType.GetProperties();
DbDataReader reader = null;
if (conn == null || conn.Length == 0)
throw new ArgumentNullException("connectionString");
SQLiteConnection con = new SQLiteConnection(conn);
SQLiteTransaction trans = null;
PrepareCommand(cmd, con, ref trans, false, cmd.CommandType, cmd.CommandText);
try
{
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
throw ex;
}
while (reader.Read()) {
T entity = (T)Activator.CreateInstance(entityType);
foreach (PropertyInfo field in fieldinfos)
{
int col = reader.GetOrdinal(field.Name);
if (col != -1)
{
Type mytype = reader.GetFieldType(col);
entityType.GetProperty(field.Name).SetValue(entity, Convert.ChangeType(reader.GetValue(col), mytype), null);
}
else
{
continue;
}
}
result.Add(entity);
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐