.net反射实例(再次优化后)
来源:互联网 发布:java建立一个数组 编辑:程序博客网 时间:2024/04/29 21:32
以上代码,经过优化后,速度几乎和直接用reader读出来差不多,但没解决第二个问题,model中的属性值还是必须和数据库表中的字段名完全一样,下面是再次改进后的代码:
/// <summary>
/// 分页查询;函数中,存储过程参数含义见接口文档
/// </summary>
/// <param name="table_Name">表或视图名</param>
/// <param name="Fields">字段列表,“*”为全部字段</param>
/// <param name="limit_Condition">where条件(不用带where)</param>
/// <param name="order_By">排序关键字(不用带order by)</param>
/// <param name="order_Direction">查询顺序(升序asc或降序desc)</param>
/// <param name="page_Size">每页显示条数</param>
/// <param name="current_Page">当前页码</param>
/// <returns>返回一个数据集</returns>
public List<Model.Ppt> Select(string table_Name, string Fields, string limit_Condition, string order_By, string order_Direction, int page_Size, int current_Page)
{
SqlParameter[] para = new SqlParameter[7];
para[0] = new SqlParameter("@TableName", table_Name);
para[1] = new SqlParameter("@ReFieldsStr", Fields);
para[2] = new SqlParameter("@OrderString", order_By);
para[3] = new SqlParameter("@OrderDirection", order_Direction);
para[4] = new SqlParameter("@WhereString", limit_Condition);
para[5] = new SqlParameter("@PageSize", page_Size);
para[6] = new SqlParameter("@PageIndex ", current_Page);
List<Model.Ppt> list = new List<Model.Ppt>();
Hashtable hashValue = new Hashtable();
Model.Ppt model = new Model.Ppt();
object temp=new Model.Ppt();
object[] objPptFieldAttribute = null;
int fieldNum = 18;
PropertyInfo[] infos = model.GetType().GetProperties();
string[] field = Fields.Split(',');
using (SqlDataReader reader = SQLHelper.ExecuteReader(conn, CommandType.StoredProcedure, "PROCE_PAGECHANGE", para))
{
while (reader.Read())
{
hashValue = new Hashtable();
temp = new Model.Ppt();
foreach (string fName in field)
{
for (int i = 0; i < fieldNum; i++)
{
if ("*" == fName)
{
objPptFieldAttribute = infos.GetCustomAttributes(typeof(Map.PptFieldAttribute), false);
if (objPptFieldAttribute != null)
{
if (DBNull.Value != reader[infos.Name])
{
hashValue.Add(infos.Name, reader[((Map.PptFieldAttribute)objPptFieldAttribute[0]).FieldName]);
infos.SetValue(temp, hashValue[infos.Name], null);
}
}
}
else
{
if (infos.Name == fName)
{
objPptFieldAttribute = infos.GetCustomAttributes(typeof(Map.PptFieldAttribute), false);
if (objPptFieldAttribute != null)
{
if (DBNull.Value != reader[infos.Name])
{
hashValue.Add(infos.Name, reader[((Map.PptFieldAttribute)objPptFieldAttribute[0]).FieldName]);
infos.SetValue(temp, hashValue[infos.Name], null);
}
}
break;
}
}
}
}
list.Add((Model.Ppt)temp);
}
}
return list;
}
Model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Map;
namespace Model
{
public class Ppt : IComparable<Ppt>
{
//课件Id
private int _Ppt_Id;
[PptField("Ppt_Id","int")]
public int Ppt_Id
{
get { return _Ppt_Id; }
set { _Ppt_Id = value; }
}
//课件名
private string _Ppt_Name;
[PptField("Ppt_Name", "nvarchar")]
public string Ppt_Name
{
get { return _Ppt_Name; }
set { _Ppt_Name = value; }
}
//作者
private string _Ppt_Author;
[PptField("Ppt_Author", "nvarchar")]
public string Ppt_Author
{
get { return _Ppt_Author; }
set { _Ppt_Author = value; }
}
//课件长度
private string _Ppt_Length;
[PptField("Ppt_Length", "nvarchar")]
public string Ppt_Length
{
get { return _Ppt_Length; }
set { _Ppt_Length = value; }
}
//所属目录
private string _Ppt_Catalog;
[PptField("Ppt_Catalog", "nvarchar")]
public string Ppt_Catalog
{
get { return _Ppt_Catalog; }
set { _Ppt_Catalog = value; }
}
//发布范围
private string _Ppt_Range;
[PptField("Ppt_Range", "nvarchar")]
public string Ppt_Range
{
get { return _Ppt_Range; }
set { _Ppt_Range = value; }
}
//描述
private string _Ppt_Description;
[PptField("Ppt_Description", "text")]
public string Ppt_Description
{
get { return _Ppt_Description; }
set { _Ppt_Description = value; }
}
//WebExame链接
private string _Ppt_WebExameLink;
[PptField("Ppt_WebExameLink", "nvarchar")]
public string Ppt_WebExameLink
{
get { return _Ppt_WebExameLink; }
set { _Ppt_WebExameLink = value; }
}
//课件路径
private string _Ppt_Path;
[PptField("Ppt_Path", "nvarchar")]
public string Ppt_Path
{
get { return _Ppt_Path; }
set { _Ppt_Path = value; }
}
//题目截图
private string _Ppt_TopicImage;
[PptField("Ppt_TopicImage", "nvarchar")]
public string Ppt_TopicImage
{
get { return _Ppt_TopicImage; }
set { _Ppt_TopicImage = value; }
}
//讲师截图
private string _Ppt_LecImage;
[PptField("Ppt_LecImage", "nvarchar")]
public string Ppt_LecImage
{
get { return _Ppt_LecImage; }
set { _Ppt_LecImage = value; }
}
//目录截图
private string _Ppt_CatalogImage;
[PptField("Ppt_CatalogImage", "nvarchar")]
public string Ppt_CatalogImage
{
get { return _Ppt_CatalogImage; }
set { _Ppt_CatalogImage = value; }
}
//课件顺序
private int _Ppt_Order;
[PptField("Ppt_Order", "int")]
public int Ppt_Order
{
get { return _Ppt_Order; }
set { _Ppt_Order = value; }
}
//平均分数
private int _Ppt_Score;
[PptField("Ppt_Score", "int")]
public int Ppt_Score
{
get { return _Ppt_Score; }
set { _Ppt_Score = value; }
}
//有效点击数
private int _Ppt_Click;
[PptField("Ppt_Click", "int")]
public int Ppt_Click
{
get { return _Ppt_Click; }
set { _Ppt_Click = value; }
}
Map:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Map
{
public class PptFieldAttribute:Attribute
{
private string _FieldName;
private string _FieldType;
public PptFieldAttribute(string fieldname,string fieldtype)
{
this._FieldName = fieldname;
this._FieldType = fieldtype;
}
/// <summary>
/// 字段名
/// </summary>
public string FieldName
{
get { return this._FieldName; }
}
/// <summary>
/// 字段类型
/// </summary>
public string FieldType
{
get { return this._FieldType; }
set { this._FieldType = value; }
}
}
}
本次优化把两个问题都解决了,速度是直接reader的一倍左右,可以接受
- .net反射实例(再次优化后)
- .net反射实例(优化后)
- .net 反射实例
- .net 特性 反射 实例
- .net反射机制实例
- .NET反射实例
- .NET反射实例
- .NET反射实例
- net反射机实例说明
- .NET Reflection optimization 反射优化
- VB.NET三层登录实例(抽象工厂+反射+配置文件)
- Java反射-再次认识
- .Net 中的反射(动态创建类型实例)
- .Net 中的反射(动态创建类型实例)
- .net中创建简单反射实例
- .Net 中的反射(动态创建类型实例)
- .Net 中的反射(动态创建类型实例)
- 浅谈.NET反射机制的性能优化
- VML极道教程(二) VML入门
- Spring 中的byName与 byType
- Ext Multiselect 多项删除
- VML极道教程(三) 标记实战与line线
- 特殊字符urlencode表(陆续完善中)
- .net反射实例(再次优化后)
- 咨询顾问是怎样炼成的(来自网络,用于分享与学习)
- cookie的使用
- VML极道教程(四) oval圆rect矩型
- 线程恢复和挂起
- 关于Android的prelink
- ELDK 安装配置
- Asset Libraries and Blocks in iOS 4
- LINUX