SQL Server的四种分页方式
【摘要】
文章目录
【前言】【正文】方法一: 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)