以上代码,经过优化后,速度几乎和直接用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的一倍左右,可以接受