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语句性能不是很好
要有一个记录访问频率的列表,
只缓存访问频繁的页面数据
不知道该如何调节两者的矛盾......
另外:如果有新记录添加的话,
在添加成功之后直接把新记录添加到缓冲区中,
可以这又会造成记录数不匹配;
总之矛盾呀。。。。。哪位仁兄有更好的法,请指明出来,谢谢先
本文地址:http://com.8s8s.com/it/it43095.htm