public interface IPage { DataTable FirstPage(); DataTable NextPage(); DataTable Page(int index); } /// <summary> /// OrderDetailEntity 的摘要说明。 /// </summary> public class OrdersEntity:IPage { private Hashtable pageIndexHsh=new Hashtable(); private int pageIndex=0; public int PageCount { get{return this.pageIndexHsh.Count ;} } public OrdersEntity() { // // TODO: 在此处添加构造函数逻辑 // string cmdstr="select {0} from {1} order by {2} desc"; cmdstr=string.Format(cmdstr,Orders.PrimaryKeyString ,Orders.TableName ,Orders.PrimaryKeyString ); SqlCommand cmd=new SqlCommand(cmdstr); Hashtable allHsh=new Hashtable(); int i=0; using (SqlConnection sqlcn=AppGlobalVar.sqlConn ()) { cmd.Connection=sqlcn; sqlcn.Open (); SqlDataReader dr=cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection ); while(dr.Read ()) { allHsh.Add(i,dr[0]); i++; } dr.Close (); } System.Collections.IDictionaryEnumerator ide=allHsh.GetEnumerator (); int pageIndex=0; i=0; while(ide.MoveNext ()) { if(i==0) { this.pageIndexHsh.Add(pageIndex,ide.Value ); pageIndex++; } i++; if(i==AppGlobalVar.AppRowsPerPage) { i=0; } } allHsh.Clear (); allHsh=null;
}
private DataTable FillPage() { string idstr=this.pageIndexHsh[pageIndex].ToString(); string opc="select top {0} * from {1} where {2}>={3}"; opc=string.Format(opc,AppGlobalVar.AppRowsPerPage ,Orders.TableName ,Orders.PrimaryKeyString ,idstr); SqlDataAdapter da=new SqlDataAdapter(opc,AppGlobalVar.sqlConn() ); DataSet ds=new DataSet(); da.Fill(ds,"PPC"); return ds.Tables["PPC"]; } public DataTable FirstPage() { this.pageIndex=0; return this.FillPage(); } public DataTable NextPage() { if(this.pageIndex==this.pageIndexHsh.Count-1 ) this.pageIndex=0; this.pageIndex ++; return this.FillPage( ); } public int CurrentPageIndex { get{return this.pageIndex;} } public DataTable Page(int index) { this.pageIndex=index;
return this.FillPage(); } } 不过这个不太好: 1:要求主键一定可以执行比较大小的操作 2:没有Cache 如果能够加上以下的功能应该可以提高性能:
------对每一个已经填充过的页面数据进行缓冲; ------数据量大的时候不可能对所有的访问过的数据进行缓冲 ------读取数据的SQL语句性能不是很好 要有一个记录访问频率的列表, 只缓存访问频繁的页面数据 不知道该如何调节两者的矛盾...... 另外:如果有新记录添加的话, 在添加成功之后直接把新记录添加到缓冲区中, 可以这又会造成记录数不匹配; 总之矛盾呀。。。。。哪位仁兄有更好的法,请指明出来,谢谢先

|