牛腩新闻发布系统-分页SQL语句详解&&实例

前言
牛腩新闻发布系统是目前接触的第一个b/s项目,所以也是第一次应用分页的这个功能和使用这个技术点。分页从原理上分为真分页和假分页两种。今天详细介绍真分页的SQL语句,以及使用到的一些控件。

分页SQL语句

 select * from (select ROW_NUMBER() over 
 (order by id desc)  as row,T.* from news T) as TT 
 where TT.row between @startIndex and @endIndex

between //用于查询两者之间内容的关键字
@startIndex// 开始范围
@endIndex//结束的范围
格式

 between @startIndex and @endIndex

表示查询内容是在@startIndex 和 @endIndex之间(包含@startIndex和 @endIndex)

SQL语句拆解

降序

给新闻表里"id"列进行降序,并且同时产生一个临时表用于后续查询。

代码

(select ROW_NUMBER() over (order by id desc) as row,T.*
 from news T)

结果

在这里插入图片描述

设置别名

给上一步降序之后产生的临时表设置一个别名“TT”,方便再次调用。

代码

查询上一步产生的临时表,并且设置别名。

 select * from (select ROW_NUMBER() over 
 (order by id desc) as row,T.* from news T) as TT

最后完整SQL语句

 select * from (select ROW_NUMBER() over 
 (order by id desc)  as row,T.* from news T) as TT 
 where TT.row between @startIndex and @endIndex

使用 where TT.row between @startIndex and @endIndex作为查询条件

应用实例-牛腩新闻管理分页显示

代码

Web

控件
AspNetPager2
web前端

 <webdiyer:AspNetPager ID="AspNetPager2"  runat="server" FirstPageText="首页" LastPageText="尾页" NextPageText="下一页" PrevPageText="上一页" OnPageChanged="AspNetPager2_PageChanged" PageSize="5" AlwaysShow="true"></webdiyer:AspNetPager>

web后端
加载代码

  protected void Page_Load(object sender, EventArgs e)
    {
        // 判断session里面是否存在管理员
        if (Session["admin"] != null && Session["admin"].ToString() == "niunan")
        {
            // 已登陆
            if (!Page.IsPostBack)

            {
                DataTable dt = new NewsManager().SelectAll();
                AspNetPager2.RecordCount = dt.Rows.Count;//获取行数
                BindNews();//绑定和显示分页内容
            }
        }
        else
        {
            // 未登陆
            Response.Redirect("login.aspx");
        }

    }

绑定新闻列表

  #region 绑定新闻列表
    private void BindNews()
    {
        int startIndex = AspNetPager2.StartRecordIndex;
        int endIndex = AspNetPager2.EndRecordIndex;
        DataTable dt =new NewsManager().SelectToPage(startIndex, endIndex);
        repNews.DataSource = dt;
        repNews.DataBind();
    }
    #endregion

分页控件改变事件

  #region 分页按钮改变事件
    /// <summary>
    /// 分页按钮改变事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void AspNetPager2_PageChanged(object sender, EventArgs e)
    {
        BindNews();//绑定和显示分页内容
    }
    #endregion

BLL

  #region 选择全部新闻
        public DataTable SelectAll() {
            return newsDAO.SelectAll();
        }
        #endregion
   #region
        /// <summary>分页选择新闻  
        ///   
        /// </summary>  
        /// <param name="startIndex">
        选定页的第一条新闻索引</param>  
        /// <param name="endIndex">
        选定页的最后一条新闻索引</param>  
        /// <returns>
        选定页的新闻内容
        </returns>  
        public DataTable SelectToPage(int startIndex, 
        int endIndex)
        {

           DAL.NewsDAO nd = new DAL.NewsDAO();
          return nd.SelectToPage(startIndex, endIndex);
        }
        #endregion

DAL

   #region 查询所有新闻
        /// <summary>
        /// 查询所有新闻
        /// </summary>
        /// <returns></returns>
        public DataTable SelectAll() {
            DataTable dt = new DataTable();
            string sql = "select * from news";
            dt = new SQLHelper().ExecuteQuery(sql,CommandType.Text);
            return dt;
        }
        #endregion
 #region 分页选择新闻
        /// <summary>  
        ///   分页选择新闻
        /// </summary>  
        /// <param name="startIndex">
        选定页的第一条新闻索引</param>  
        /// <param name="endIndex">
        选定页的最后一条新闻索引</param>  
        /// <returns>选定页的新闻内容</returns>  
        public DataTable SelectToPage(int startIndex,
         int endIndex)
        {
            DataTable dt = new DataTable();
            SqlParameter[] paras = new SqlParameter[]
           {
          new SqlParameter ("@startIndex",startIndex ),
              
            new SqlParameter("@endIndex",endIndex)
           };
            string sql = "select * from
            (select ROW_NUMBER() 
            over (order by id desc) 
            as row,T.* from news T) 
            as TT where TT.row between
             @startIndex and @endIndex";
            dt =sqlheper.ExecuteQuery(sql, paras,
             CommandType.Text);
            return dt;

        }
        #endregion

结果

在这里插入图片描述

posted @ 2020-06-29 09:17  康世行  阅读(75)  评论(0编辑  收藏  举报