通过学习分页原理,做了如下的总结,具体是以一个学生数据表为例
原理分析
--查询第一页
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>
具体前端界面传值,暂时就不写了