.NET面向对象的分页原理及实现

通过学习分页原理,做了如下的总结,具体是以一个学生数据表为例

原理分析

--查询第一页
select  top 4 studentId from Students where Birthday>'1985/10/12'

--查询第二页
select  top 4 studentId from Students where Birthday>'1985/10/12' and StudentId not in(select top 4 StudentId from Students where Birthday>'1985/10/12' order by StudentId ASC)
ORDER by StudentId ASC

--查询第三页
select  top 4 studentId from Students where Birthday>'1985/10/12' and StudentId not in(select top 8 StudentId from Students where Birthday>'1985/10/12' order by StudentId ASC)
ORDER by StudentId ASC

--查询符合条件的记录总数
select (COUNT(*)) from Students where Birthday>'1985/10/12'

--计算符合条件的总页数
print '相除'
print 5/3 --2页
print 5/5 --1页
print 5/8 --1页

print '实际分页数'
print 5/3+1  --2页
print 5/5  --1页

print 5/8+1 --1页

print '取模'
print 5%3
print 5%5
print 5%8

–分页实现的基本思路
–每页显示的条数
–过滤越掉的总数=每页显示的条数*(当前显示的页数-1)
–查询条件的确定
–排列条件
–满足条件的记录总数
–查询结果需要显示的页数=(记录总数/每页显示条数)+1(余数为0,则不加)

–提取不变的,封装变化的;不变的作为方法题 ,变化的为参数
–变化的
–1.每页显示的条数 2.显示的字段和属性 3.查询条件 4.表的名称 5.过滤条件(主键或唯一键) 6.过滤的条数(计算) 7.当前显示的页码 8.记录总数 9.显示的总页数
–不变的
–查询语句的核心结构

·## 在VS2017内编写具体方法
一、抽取变换的和不变的,转化为实体类(PageHelper.cs) 在这里要注意记录总数和要显示的总页数的计算

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Models
{

    /// <summary>
    /// 通用数据分页类
    /// </summary>
    public class PageHelper
    {
        /// <summary>
        /// 每页显示的行数
        /// </summary>
        public int PageSize { get; set; }

        /// <summary>
        /// 显示的字段(属性)
        /// </summary>
        public string  FiledName { get; set; }
        /// <summary>
        /// 表的名称
        /// </summary>
        public string  TableName { get; set; }
        /// <summary>
        /// 查询条件
        /// </summary>
        public string  Condition { get; set; }
        /// <summary>
        /// 表的主键或唯一键
        /// </summary>
        public string  PrimaryKey { get; set; }
        /// <summary>
        /// 当前页码
        /// </summary>
        public int CurrentPage { get; set; }
        /// <summary>
        /// 排序条件
        /// </summary>
        public string  Sort { get; set; }

        /// <summary>
        /// 记录的总数【不能直接赋值】
        /// </summary>
        public  int recordCount;
        public int RecordCount
        {
            get { return recordCount; }
        }

        /// <summary>
        /// 显示的总页数
        /// </summary>
        public int TotalPages {
            get
            {
                if (recordCount != 0) //如果查询记录总数不为0
                {
                  if (recordCount % PageSize != 0)  //比如recordCount=5  PageSize=8 则5%8 余数不为0
                {
                    return (recordCount / PageSize) + 1; //则 (5/8)+1 需要显示2页
                }
                else
                {
                    return recordCount / PageSize;  //余数为0  5/5 显示一页
                }
                }
                else
                {
                    this.CurrentPage = -1;//如果查询没有数据,则复位
                    return 0;
                }
               
            }
        }

    }
}

2.针对于面向对象的方法,我在DAL中调用了该类 ,实现 W_MassifInfoService.cs的数据访问类。需要引入命名空间
(1)实例化分页实体类

    private PageHelper pageHelper = new PageHelper();

(2)编写sql语句方法

        /// <summary>
        /// 分页查询使用的sql语句
        /// </summary>
        /// <returns></returns>
        private string  GetMassifSql()
        {
            
            //计算需要过滤的总数
            string filterCount = (pageHelper.PageSize * (pageHelper.CurrentPage - 1)).ToString();
            //string sql = "select Top 10 w_mid,w_site,w_master,w_area from W_MassifInfo where";
            string sql = "(select Top {0} {1} from {2} where {3} and {4} not in(select Top {5} {6} from {7} where {8} order by {9}) order by {10};";
            sql += "select count(*) from {11} where {12}";
            sql = string.Format(sql, pageHelper.PageSize, pageHelper.FiledName, pageHelper.TableName, pageHelper.Condition, pageHelper.PrimaryKey, filterCount, pageHelper.PrimaryKey, pageHelper.TableName, pageHelper.Condition, pageHelper.Sort, pageHelper.Sort,pageHelper.TableName,pageHelper.Sort);
            return sql;
        }

(3)根据分页返回从数据库中查询到的DataTable

 public DataTable GetPageData()
        {
            //执行查询,返回查询结果的结果集
            DataSet ds = sqlHelper.GetDataTable(GetMassifSql());
            //获取满足记录的总数
            pageHelper.recordCount = Convert.ToInt32(ds.Tables[1].Rows[0][0]);
            return ds.Tables[0];
            
        }

解释一下 DataSet ds = sqlHelper.GetDataTable(GetMassifSql());
此处调用了一个访问sqlserver通用数据库的方法sqlHelper,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
namespace DAL
{
    public class sqlHelper
    {
        /// <summary>
        /// 分页通用辅助类
        /// </summary>
       private static  string connString = ConfigurationManager.ConnectionStrings["EFWaterInfo"].ToString();
        public static DataSet GetDataTable(string sql)
        {
            SqlConnection con = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, con);
            try
            {
                con.Open();
                SqlDataAdapter dataAdapter = new SqlDataAdapter();
                DataSet ds = new DataSet();
                dataAdapter.Fill(ds);
                return ds;
            }
            catch (Exception ex)
            {
                throw new Exception("执行返分页回结果集出错" + ex.Message);
            }
        }
    }
}

ConfigurationManager.ConnectionStrings[“EFWaterInfo”].ToString(); “EFWaterInfo”是在配置文件中配置的


      <connectionStrings>
    <add name="EFWaterInfo" connectionString="server=.;database=WaterInfoDB;uId=你的sqlserver账号;pwd=sqlserver密码" />
  </connectionStrings>

具体前端界面传值,暂时就不写了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值