SQL Server的四种分页方式


【前言】

最近项目上需要添加分页方式,我就查询了四种分页方式,虽然最后用到的是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;
        }

欢迎各位大佬指正~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张_Laura

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值