UI分页其实是一种非常糟糕的做法,强烈建议不要使用。
以datagird为例子
数据量比较大的时候,由于读出数据比较多占用了大量的系统内存,性能底下。
数据量不是很大的时候,由于viewstate体积比较大,导致页面回发速度慢,性能还是很差。
@Richard[匿名]
可以通过对于查询的数据取Top值来进行分页,效率要比用DataGrid/GridView高一些.
-----------------------------------------
2:UI只显示其中一页,数据库实现分页
这个就是刚才上边说的DataGrid实现分页的第二种方法。优点是,效率大有提高,特别是数据量比较大的时候。
-------------------------------------------
我说得比较详细:UI分页只是一种方案,并且效率不高。我推荐的是数据库分页结合UI分页的模型。
并且,我也列举了数据库分页的例子。
你说得着一个例子只是对于sql server的,并且还不系统(可以参照我写的关于sql server数据库分页的比较)。
@Richard[匿名]
这种东西也写,唉
----------------------------------------
您有更高水平的技术文章,可以交流。
@Cure
传送到UI的数据不会多,顶多也就是那一页。
但是,从数据库取出的数据会很多,这些数据还是放在服务器内存中的,占用资源。这就是为什么UI分页方案效率比较低的原因。
数据库分页则不会,他取出的数据只有一页,需要缓存的东西少。
@周星星[匿名]
最近几天看到几篇文章,都是在作分页,但是好像都没意识到数据库分页,只是在作UI分页。所以,我写一点经验,希望对后来者有所帮助。
文章本身的价值在于你掌握的程度,如果你都知道了,对你来说就毫无价值。
我用的WilsonORM,他对常见数据库提供分页支持(sql server,oracle, my sql等),对其他数据库提供扩展(就是告诉你告诉你用什么样的语句来分页)。
@随心所欲
传送到UI的数据不会多,顶多也就是那一页。
但是,从数据库取出的数据会很多,这些数据还是放在服务器内存中的,占用资源。这就是为什么UI分页方案效率比较低的原因。
那你就搞错了,对于DataGird和GridView的UI分页的时候,虽然当前页面只显示一页的数据,但是DataGird和GridView控件会把所有的数据以viewstate的形式存入页面。所以页面的viewstate的体积会变的很大,造成回发速度变慢。
UI分页就是在数据量比较小的时侯比如只有几百条数据的时候还是一样的差,所以我推荐任何情况下都尽可能的不要用UI分页。
我早用第二种了,不过效率没有楼主说的那麽低吧。29秒,是不是看错了。
#region 分页
/// <summary>
/// 转换参数
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
private SqlParameter[] CollectionToArray(SqlParameter[] param)
{
if(param == null) return null;
SqlParameter[] ps = new SqlParameter[param.Length];
param.CopyTo(ps,0);
return ps;
}
/// <summary>
/// 分页
/// </summary>
/// <param name="fields">字段</param>
/// <param name="table">表</param>
/// <param name="filter">条件</param>
/// <param name="group">group by</param>
/// <param name="sort">条件,必填</param>
/// <returns>结果集</returns>
public DataSet PageResult(string fields,string table,string filter,string group, string sort )
{
return PageResult(1,0,"",fields,table,filter,group,sort,"");
}
/// <summary>
/// 分页
/// </summary>
/// <param name="pageno">页码</param>
/// <param name="pagesize">每页多少条</param>
/// <param name="pk">主键</param>
/// <param name="fields">字段</param>
/// <param name="table">表</param>
/// <param name="filter">条件</param>
/// <param name="sort">排序</param>
/// <param name="param">参数</param>
/// <returns>结果集</returns>
public DataSet PageResult(int pageno , int pagesize ,string pk,string fields,string table
,string filter,string sort,ArrayList param)
{
SqlParameter[] sqlparams = new SqlParameter[param.Count];
param.CopyTo(sqlparams,0);
return PageResult( pageno , pagesize , pk, fields, table
, filter,"", sort,"", sqlparams);
}
/// <summary>
/// 分页
/// </summary>
/// <param name="pageno">页码</param>
/// <param name="pagesize">每页多少条</param>
/// <param name="pk">主键</param>
/// <param name="fields">字段</param>
/// <param name="table">表</param>
/// <param name="filter">条件</param>
/// <param name="sort">排序</param>
/// <param name="param">参数</param>
/// <returns>结果集</returns>
public DataSet PageResult(int pageno , int pagesize ,string pk,string fields,string table
,string filter,string sort,SqlParameter[] param)
{
return PageResult( pageno , pagesize , pk, fields, table
, filter,"", sort,"", param);
}
/// <summary>
/// 分页
/// </summary>
/// <param name="pageno">页码</param>
/// <param name="pagesize">每页多少行</param>
/// <param name="pk">主键</param>
/// <param name="fields">字段</param>
/// <param name="table">表</param>
/// <param name="filter">条件</param>
/// <param name="group">group by</param>
/// <param name="sort">排序 必填</param>
/// <param name="sum">统计</param>
/// <param name="param">参数</param>
/// <returns>结果集</returns>
public DataSet PageResult(int pageno , int pagesize ,string pk,string fields,string table
,string filter,string group,string sort,string sum,SqlParameter[] param)
{
//定义
string sortdesc = "";
string orderby = "";
string where ="";
string groupby = "";
string realfields = "";
DataSet data = new DataSet();
DataTable result;
int count = 0;
StringBuilder sql = new StringBuilder();
//组织语句
if(filter != "")
{
where = "where " + filter.ToString();
}
if(group != "")
{
groupby = "group by " + group;
//group = ClearPrefix(group);
}
if(sort == "")
{
if(pk !="" ||pk!="*")
{
sort = pk;
}
}
if(sort != "")
{
orderby = "order by " + sort;
sortdesc = "order by " + ReplaceSortDesc(ClearPrefix(sort));
sort = "order by " + ClearPrefix(sort);
}
realfields = ClearPrefix(fields);
//构建SQL
if(pagesize == 0)
{
sql.AppendFormat("select {0} from {1} {2} {3} {4} ",
fields,table,where,groupby,orderby);
#if DEBUG
ApplicationLog.WriteLog(sql.ToString());
#endif
result = ExcuteQuery( sql.ToString(),CollectionToArray(param),"pageresult");
count = result.Rows.Count;
}
else
{
StringBuilder sqlcount = new StringBuilder();
if(groupby != "")
{
//聚合
sqlcount.AppendFormat("select count(1) from (select {0} from {1} {2} {3} ) as t1_counttable",
group,table,where,groupby);
}
else
{
sqlcount.AppendFormat("select count(1) from {0} {1} {2} ",
table,where,groupby);
//非聚合
}
//求总记录数
object obj = ExecuteScalar(sqlcount.ToString(),CollectionToArray(param));
if(Convert.IsDBNull( obj))
{
count = 0;
}
else
{
count = Convert.ToInt32( obj);
}
if(count == 0)
{
sql.AppendFormat("select {0} from {1} {2} {3} {4} ",
fields,table,where,groupby,orderby);
}
else
{
//是否超出最后一页
int lastno = (count+pagesize-1)/pagesize;
//当前页有多少记录
int lastsize = pagesize;
if(pageno >=lastno)
{
pageno = lastno;
lastsize = count - pagesize * pageno+pagesize;
}
if(pageno <= 1)
{
sql.AppendFormat("select top {0} {1} from {2} {3} {4} {5}",
pagesize,fields,table,where,groupby,orderby);
}
else
{
sql.AppendFormat("select {0} from (",realfields);
sql.AppendFormat("select top {0} {1} from ",lastsize,realfields);
sql.AppendFormat("(select top {0} {1} from {2} {3} {4} {5}) as t1 ",
pageno*pagesize,fields,table,where,groupby,orderby);
sql.AppendFormat(" {0} ) as t2", sortdesc);
sql.AppendFormat(" {0} ", sort);
}
}
#if DEBUG
ApplicationLog.WriteLog(sql.ToString());
#endif
result = ExcuteQuery( sql.ToString(),CollectionToArray(param),"pageresult");
}
data.Tables.Add(result);
DataTable counttable = new DataTable("count");
counttable.Columns.Add(new DataColumn("countdata",typeof(int)));
DataRow row = counttable.NewRow();
///总记录数
row[0] = count;
counttable.Rows.Add(row);
data.Tables.Add(counttable);
//统计求和
if(sum != "")
{
StringBuilder sqlsum = new StringBuilder();
sqlsum.AppendFormat("select {0} from {1} {2}",sum,table,where);
#if DEBUG
ApplicationLog.WriteLog(sqlsum.ToString());
#endif
DataTable tablesum =
ExcuteQuery( sqlsum.ToString(),CollectionToArray(param),"sumresult");
data.Tables.Add(tablesum);
}
Close();
return data;
}
/// <summary>
/// 分页
/// </summary>
/// <param name="pageno">页码</param>
/// <param name="pagesize">每页多少条</param>
/// <param name="pk">主键</param>
/// <param name="fields">字段</param>
/// <param name="table">表</param>
/// <param name="filter">条件</param>
/// <param name="group">group by</param>
/// <param name="sort">排序</param>
/// <param name="sum">统计</param>
/// <returns>结果集</returns>
public DataSet PageResult(int pageno , int pagesize ,string pk ,string fields ,string table ,
string filter,string group, string sort , string sum)
{
return PageResult(pageno,pagesize,pk,fields,table,filter,group,sort,sum,null);
}
#endregion
@kiler
那你就搞错了,对于DataGird和GridView的UI分页的时候,虽然当前页面只显示一页的数据,但是DataGird和GridView控件会把所有的数据以viewstate的形式存入页面。所以页面的viewstate的体积会变的很大,造成回发速度变慢。
UI分页就是在数据量比较小的时侯比如只有几百条数据的时候还是一样的差,所以我推荐任何情况下都尽可能的不要用UI分页
-------------------------------------------------
如果真是这样,那么就得坚决使用数据库分页了。
当然,很小的应用不用这么麻烦。
其实在J2EE的领域,都没有什么UI分页和数据库分页之分。因为把所有数据都取出来,是一件多么可怕的事情。既然显示不了那么多,还拿那么多干嘛呢?而且,总感觉分页和UI结合在一起,层次就不清晰了,虽然有控件进行封装。
@丁丁
你自己可以做一个实验,可以发现你的数据越多页面viewstate的体积越大。
DataGrid1.DataSource = dataSet11.Tables[0].DefaultView;
DataGrid在绑定数据的时候会把dataSet1也写入viewstate。这个才是影响性能的关键。
而且你这个方法还大量占用了内存。可以说没有什么优点。
@FantasySoft
在php,asp里面也没有UI分页,因为分页完全需要你自己去做。
Asp.net提供了现成的控件,稍加利用就可以,可以提供开发速度。
@kiler
“你的数据越多viewstate的体积越大”,我需要补充一点,页面数据越多,viewstate体积越大,请不要漏了“页面”两个字!
另外,为慎重起见,我做了实验,“DataGrid在绑定数据的时候会把dataSet1也写入viewstate写入viewstate”这句话不仅语法错,意思也是不对的,DataGrid在绑定数据的时候不会把dataSet写入ViewState!微软的工程师不是傻瓜,怎么明显的傻事是不会做的,另外请阅读Dino Esposito的书,难道你会认为一本amazon评为4星,带着WinIntellect标签的书没有你权威?