【牛腩】-真假分页

简介: 【牛腩】-真假分页

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

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

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

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

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

SQLHelper:

/// <summary>  
///  返回执行的SQL语句的第一行第一列的值 
/// </summary>  
/// <param name="sql">SQL语句</param>  
/// <returns></returns>  
public string ExecuteScalar(string sql)
{
    try
    {
        cmd = new SqlCommand(sql, GetConn());
        object obj = cmd.ExecuteScalar();
        if (obj != null)
        {
            return obj.ToString();
        }
        return "";
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        if (conn.State == ConnectionState.Open)
        {
            conn.Close();
        }
    }
}  

D层:

真分页查询记录

#region 选择全部新闻
/// <summary>
/// 选择全部新闻
/// </summary>
/// <returns></returns>
public DataTable SelectAll(int startIndex, int endIndex)
{
    DataTable dt = new DataTable();
    string sql = "with temptbl as( select ROW_NUMBER()over(order by id desc)as 行号,* from news) select * from temptbl where 行号 between @startIndex and @endIndex";
    SqlParameter[] paras = new SqlParameter[]
    {
    new SqlParameter ("@startIndex",startIndex),
     new SqlParameter ("@endIndex",endIndex)
    };
    dt = new SQLHelper().ExecuteQuery(sql, paras, CommandType.Text);
    return dt;
}
#endregion

查询记录总数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Model;
namespace DAL
{
    public class FenYeDAO
    {
        private SQLHelper sqlhelper;
        public FenYeDAO()
        {
            sqlhelper = new SQLHelper();
        }
        /// <summary>  
        ///   根据条件计算新闻记录数
        /// </summary>  
        /// <param name="cond">条件,不用加where</param>  
        /// <returns></returns>  
        public int CalcCountNews(string cond)
        {
            string sql = "select count(*) from news";
            if (!string.IsNullOrEmpty(cond))
            {
                sql += "where" + cond;
            }
            return int.Parse(sqlhelper.ExecuteScalar(sql));
        }
    }
}

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

现在到界面了:

界面显示数据用Gridview控件:

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

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

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

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

对AspNetPager进行属性设置:

<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" 
         >  
 </webdiyer:AspNetPager>  • 1

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BLL;
using System.Data;
namespace 牛腩新闻发布系统
{
  public partial class test : System.Web.UI.Page
  {
     BLL.FenYeManager fy = new FenYeManager();
     BLL.NewsManager nm = new NewsManager();
     protected void Page_Load(object sender, EventArgs e)
     {
         if (!Page.IsPostBack)
         {
             //查询总记录数
             anp.RecordCount = fy.CalcCountNews("");
             //绑定新闻列表
             BindGV();
         }
     }
     //分页事件  
     protected void anp_PageChanged(object sender, EventArgs e)
     {
         BindGV();
     }
     //绑定新闻列表  
     private void BindGV()
     {        
         GridView1.DataSource = nm.SelectAll(anp.StartRecordIndex, anp.EndRecordIndex);
         GridView1.DataBind();
     } 
   }
}

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

下面看看效果图:

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


相关文章
|
8月前
【错题集-编程题】游游的水果大礼包(枚举)
【错题集-编程题】游游的水果大礼包(枚举)
【错题集-编程题】游游的水果大礼包(枚举)
|
8月前
|
存储
位运算之妙用:识别独特数字(寻找单身狗)
位运算之妙用:识别独特数字(寻找单身狗)
67 0
|
人工智能 BI
UPC-排课表+玉米田(容斥原理+组合数学公式)
UPC-排课表+玉米田(容斥原理+组合数学公式)
110 0
UPC-排课表+玉米田(容斥原理+组合数学公式)
|
移动开发 HTML5
用HTML5实现十里桃花歌词的打印(一)
用HTML5实现十里桃花歌词的打印(一)
用HTML5实现十里桃花歌词的打印(一)
|
人工智能
UPC——放牛奶的冰箱(二分法)
题目描述 冬冬在古子城购买了一台冰箱,冰箱内部可以表示为高度为h,深度为1,宽度为2的矩阵,最初冰箱底部只有一个架子,但冬冬可以在任何一个格子顶部放隔板,隔板的宽为2,不占用任何空间,将冰箱内部分隔成上、下两部分。 冬冬有n瓶牛奶要按顺序放入冰箱里。第i瓶牛奶的高度是ai,深度和宽度均为1。如果架子上方的相应空间至少与瓶子一样高,他可以在一个架子上放一瓶牛奶,他不能将两瓶牛奶叠在一起(如果它们之间没有架子)。
158 0
UPC——放牛奶的冰箱(二分法)
|
算法 搜索推荐 Shell
植物大战 希尔 排序 ——纯C
植物大战 希尔 排序 ——纯C
植物大战 希尔 排序 ——纯C
|
算法 搜索推荐
植物大战 快速 排序——纯C
植物大战 快速 排序——纯C
植物大战 快速 排序——纯C
|
算法 JavaScript 前端开发
扑克牌速算24 -穷举(JavaScript)
从扑克牌里面任意抽取4张(无重复)A(1)2345678910J(11)Q(12)K(13),请给出通过4则运算,使结果为24的算法,并且每个数在算式中使用一次。如果无法通过上述规则得到24,则输出“无法计算得到24”。
162 1
【刷穿 LeetCode】68. 文本左右对齐 : 字符串模拟
【刷穿 LeetCode】68. 文本左右对齐 : 字符串模拟
|
存储
漫画:什么是 “锦标赛排序” ?
如图中所示,我们把原本的冠军选手5排除掉,在四分之一决赛和他同一组的选手6就自然获得了直接晋级。 接下来的半决赛,选手7打败选手6晋级;在总决赛,选手7打败选手3晋级,成为了新的冠军。 因此我们可以判断出,选手7是总体上的亚军。
180 0
漫画:什么是 “锦标赛排序” ?