SQL Server的四种分页方式

举报
Laura_张 发表于 2022/08/26 23:17:07 2022/08/26
【摘要】 文章目录 【前言】【正文】方法一: top not in方式方法二:ROW_NUMBER() OVER() 方式方法三:offset fetch next方式方法四:使用存储过程分页 ...


【前言】

最近项目上需要添加分页方式,我就查询了四种分页方式,虽然最后用到的是EF的分页,和直接用SQLServer的分页方式稍有不同,但是还是总结一下下。

EF框架的分页方式点击查看

【正文】

方法一: top not in方式

(适合于数据库2012以下的版本)

select top 3 * from T_Line
where Id not in (select top 15 Id from T_Line)
--where 主键 not in (select top 条数*页数  主键  from 表名)  
--查询数据表中16-18条数据

方法二:ROW_NUMBER() OVER() 方式

(适用于SQL2000以上的版本)
使用 ROW_NUMBER() 函数,遍历一次所有的数据。

select * from (
    select *, ROW_NUMBER() OVER(Order by CardNo ) AS RowId from T_Customer
  ) as b

      where RowId between 10 and 20
	  --CardNo是主键,T_Customer是数据表名
	  --查询数据表中第10到20条的数据
	  --where RowId BETWEEN 当前页数-1*条数 and 页数*条数

在这里插入图片描述

方法三:offset fetch next方式

(SQL2012以上的版本才支持,推荐使用)

select * from T_Customer  order by CardNo offset 4 rows fetch next 5 rows only
    --order by 主键 offset 页数 rows fetch next 条数 rows only
	--查询数据表中第5-10条数据

方法四:使用存储过程分页

drop proc LoadPageMain
--每次调用先删除之前的存储过程


--创建新的存储过程
create Proc LoadPageMain
@pageIndex int,
@pageSize int,
@count int out
as
select top(@pageSize) * from T_Customer
where CardNo not in
(
    select top(@pageSize*(@pageIndex-1)) CardNo
    from T_Customer
    order by CardNo
)
order by CardNo
select @count=COUNT(1) from T_Customer

执行完成之后可以在看到存在一个名字为“LoadPageMain”的存储过程

D层调用分页存储过程的代码

public List<T_Customer> getPagedList(int pageIndex, int pageSize, out int count)
        {
            List<T_Customer> modelList = new List<T_Customer>();           //创建最终要返回的model 的 List集合对象

            string connStr = "server=.;database=CCDB;uid=;pwd=";         //输入要链接的数据库名称和账号密码

            using (SqlConnection conn = new SqlConnection(connStr))
            {
                using (SqlCommand cmd = new SqlCommand())                           //创建command对象
                {
                    cmd.Connection = conn;                                 
                    cmd.CommandType = CommandType.StoredProcedure;                  设置command 对象的type属性
                    cmd.CommandText = "LoadPageMain";                //指定相应的存储过程

                    cmd.Parameters.Add(new SqlParameter("@pageIndex",pageIndex));    //为存储过程添加参数
                    cmd.Parameters.Add(new SqlParameter("@pageSize",pageSize));
                    SqlParameter outCount = new SqlParameter("@count",SqlDbType.Int);     //创建将要输出的参数,并添加到参数集合中
                    outCount.Direction = ParameterDirection.Output;
                    cmd.Parameters.Add(outCount);

                    conn.Open();

                    using (SqlDataAdapter sda = new SqlDataAdapter(cmd))             //用SqlDataReader 对象回去数据,不用担心conn断开的问题
                    {
                        DataSet ds = new DataSet();       
                        sda.Fill(ds);           //获取存储过程返回的数据集

                        count = (int)outCount.Value;         // 注意:获取 存储过程输出的参数值

                        foreach (DataRow row in ds.Tables[0].Rows )              
                        {
                            T_Customer model = new T_Customer();               

                            model.CardNo = Convert.ToString(row[1]);
                            model.Telephone = Convert.ToString(row[2]);
                            model.CustomerName = Convert.ToString(row[3]);
                            model.Sex =Convert.ToString(row[4]);
                            model.Explain = Convert.ToInt32(row[6]);
                         

                            modelList.Add(model);
                        }
                    }

                }
            }
            return modelList;
        }

欢迎各位大佬指正~

文章来源: blog.csdn.net,作者:张艳伟_Laura,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Laura__zhang/article/details/119394127

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。