【牛腩】-真假分页

妖狐艹你老母 2022-08-21 03:10 273阅读 0赞

– – 分页在web程序中很常用。当从数据库中查询出数据,展示在界面上的时候,如果数量很大,就需要分页,一页一页地展示给用户。这时候就用到了分页。分页是在界面上的展示效果。所谓真分页、假分页,就到了数据库的层次。真假主要是看是否真的从数据库中取出了 部分数据,如果第一次查询从数据库中取出全部数据,就是假分页,因为它跟界面展示的不一致,“表里不一”,就是假。相反,如果每次查询从数据库中取出一部分数据,最终展示在界面上,这就是真分页,“表里如一”,就是真。

真分页:优点是数据量小,缺点是访问数据库频繁,占用数据库资源。

假分页:第一次查询花费时间较长,后边的省时间,避免对数据库的多次访问。

真分页的核心在SQL查询语句:

  1. --真分页SQL查询语句-SQL 2005以上
  2. --使用临时表来存储查出来的东西,然后再在临时表中查找内容
  3. with temptbl as(
  4. select ROW_NUMBER()over(order by id desc)as 行号,* from news
  5. )
  6. select * from temptbl where 行号 between 4 and 8

SQLHelper:

  1. /// <summary>
  2. /// 返回执行的SQL语句的第一行第一列的值
  3. /// </summary>
  4. /// <param name="sql">SQL语句</param>
  5. /// <returns></returns>
  6. public string ExecuteScalar(string sql)
  7. {
  8. try
  9. {
  10. cmd = new SqlCommand(sql, GetConn());
  11. object obj = cmd.ExecuteScalar();
  12. if (obj != null)
  13. {
  14. return obj.ToString();
  15. }
  16. return "";
  17. }
  18. catch (Exception ex)
  19. {
  20. throw ex;
  21. }
  22. finally
  23. {
  24. if (conn.State == ConnectionState.Open)
  25. {
  26. conn.Close();
  27. }
  28. }
  29. }

D层:

真分页查询记录

  1. #region 选择全部新闻
  2. /// <summary>
  3. /// 选择全部新闻
  4. /// </summary>
  5. /// <returns></returns>
  6. public DataTable SelectAll(int startIndex, int endIndex)
  7. {
  8. DataTable dt = new DataTable();
  9. string sql = "with temptbl as( select ROW_NUMBER()over(order by id desc)as 行号,* from news) select * from temptbl where 行号 between @startIndex and @endIndex";
  10. SqlParameter[] paras = new SqlParameter[]
  11. {
  12. new SqlParameter ("@startIndex",startIndex),
  13. new SqlParameter ("@endIndex",endIndex)
  14. };
  15. dt = new SQLHelper().ExecuteQuery(sql, paras, CommandType.Text);
  16. return dt;
  17. }
  18. #endregion

查询记录总数:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Model;
  7. namespace DAL
  8. {
  9. public class FenYeDAO
  10. {
  11. private SQLHelper sqlhelper;
  12. public FenYeDAO()
  13. {
  14. sqlhelper = new SQLHelper();
  15. }
  16. /// <summary>
  17. /// 根据条件计算新闻记录数
  18. /// </summary>
  19. /// <param name="cond">条件,不用加where</param>
  20. /// <returns></returns>
  21. public int CalcCountNews(string cond)
  22. {
  23. string sql = "select count(*) from news";
  24. if (!string.IsNullOrEmpty(cond))
  25. {
  26. sql += "where" + cond;
  27. }
  28. return int.Parse(sqlhelper.ExecuteScalar(sql));
  29. }
  30. }
  31. }

B层中没有什么逻辑,就不写了。调用D层的方法而已。

现在到界面了:

界面显示数据用Gridview控件:

  1. <asp:GridView ID="GridView1" runat="server" >
  2. </asp:GridView>

在.aspx页面,添加AspNetPager控件。

会自动生成AspNetPager的页面头部设置:

  1. <%--AspNetPager的页面头部设置--%>
  2. <%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %>

对AspNetPager进行属性设置:

  1. <webdiyer:AspNetPager ID="anp" runat="server" PageSize="5" OnPageChanged="anp_PageChanged" CustomInfoHTML="总计%RecordCount%条记录,共%PageCount%页" FirstPageText="首页" LastPageText="尾页" NextPageText="下一页" PrevPageText="上一页" ShowCustomInfoSection="Left" ShowPageIndexBox="Never" cssclass="pages" CurrentPageButtonClass="cpb" AlwaysShow="true" >
  2. </webdiyer:AspNetPager>

当然在AspNetPager放在Gridview控件下面也可以,上边也可以,看想要的界面效果了。

然后在.aspx.cs文件中实现数据绑定。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using BLL;
  8. using System.Data;
  9. namespace 牛腩新闻发布系统
  10. {
  11. public partial class test : System.Web.UI.Page
  12. {
  13. BLL.FenYeManager fy = new FenYeManager();
  14. BLL.NewsManager nm = new NewsManager();
  15. protected void Page_Load(object sender, EventArgs e)
  16. {
  17. if (!Page.IsPostBack)
  18. {
  19. //查询总记录数
  20. anp.RecordCount = fy.CalcCountNews("");
  21. //绑定新闻列表
  22. BindGV();
  23. }
  24. }
  25. //分页事件
  26. protected void anp_PageChanged(object sender, EventArgs e)
  27. {
  28. BindGV();
  29. }
  30. //绑定新闻列表
  31. private void BindGV()
  32. {
  33. GridView1.DataSource = nm.SelectAll(anp.StartRecordIndex, anp.EndRecordIndex);
  34. GridView1.DataBind();
  35. }
  36. }
  37. }

思路是这样的:先查询记录总数,赋值给Aspnetpager控件相应的属性RecordCount ,然后点击“下一页”或具体页码,触发anp_PageChanged事件,获取aspnetPager 中的两个属性值:StartRecordIndex和EndRecordIndex来查询数据库中相应的记录,然后绑定到Gridview中,从界面显示出来。

下面看看效果图:

真分页效果

初识真假分页,觉得不难,不过还需要在实际项目中多用,才能更好的理解,真假分页到底该应用在什么样的情况下,实际效果有多好。

发表评论

表情:
评论列表 (有 0 条评论,273人围观)

还没有评论,来说两句吧...

相关阅读

    相关 】总览

             进行牛腩已经两周了,今天要吧我两周内学习的内容总结一下。首先来一张自己看牛腩视频的总结图。 牛腩视频总览:       ![Center][]  

    相关 视频总结(一)

    这周开始步入B/S的学习了,首先接触的学习资料就是牛腩新闻发布系统。视频中牛腩老师讲的很好,很清楚,从一开始文档的设计到后来逐步完成功能,从这其中可以发现老师每编程一个功能都会

    相关 】-真假

    – – 分页在web程序中很常用。当从数据库中查询出数据,展示在界面上的时候,如果数量很大,就需要分页,一页一页地展示给用户。这时候就用到了分页。分页是在界面上的展示效果。所

    相关 新闻发布总结

    旧知识    后台的设计都是机房重构中接触到的知识,相对机房重构来说更简单。利用三层的知识和C\语言完成后台的操作,涉及到了SQLHelper、存储过程和触发器。 新

    相关 ASP.NET——真假

          所谓分页,就是把所有要显示的内容分成n多页来显示。那为什么要用分页而不直接全部显示呢?这就好比一本书,我们可以用一张纸写完全部书的内容,但实际上并不是这么做的。我们

    相关 【B/S】真假

    什么是真假分页: > 真分页:只从数据中选择当前页的记录 > > 假分页:从数据库中选择所有的记录后再进行分页 真分页的好处一目了然,可以减少不比较的加载内容,减少加