如何通过@PageNumber和@PageSize计算分页用的@StartRow与@EndRow参数?
如何通过@PageNumber和@PageSize计算分页用的@StartRow与@EndRow参数?
嗨,这个问题其实挺容易搞明白的,咱们结合你的场景一步步来:
首先,你的存储过程里用的ROW_NUMBER()是从1开始编号的,所以咱们的计算逻辑完全要贴合这个规则:
核心计算公式
@StartRow(起始行号):(@PageNumber - 1) * @PageSize + 1@EndRow(结束行号):@PageNumber * @PageSize
举个例子更清楚
比如你设置@PageSize = 10(每页10条数据):
- 当
@PageNumber = 1(第一页):StartRow = (1-1)*10 +1 =1,EndRow=1*10=10,对应RowNum 1-10,刚好第一页的10条数据 - 当
@PageNumber = 3(第三页):StartRow=(3-1)*10+1=21,EndRow=3*10=30,对应RowNum 21-30,完美匹配第三页的范围
结合ADO.NET的代码示例
假设你从前端或者业务逻辑里拿到了pageNumber和pageSize,直接在C#代码里计算后传入存储过程就行:
// 实际项目中这两个值应该从你的业务上下文获取(比如接口参数、查询字符串) int targetPage = 2; int itemsPerPage = 15; // 计算起始和结束行号 int startRow = (targetPage - 1) * itemsPerPage + 1; int endRow = targetPage * itemsPerPage; // 构建SqlCommand并传入参数 using (SqlCommand spCmd = new SqlCommand("YourPagedProcedure", yourSqlConnection)) { spCmd.CommandType = CommandType.StoredProcedure; // 添加参数(注意参数名要和存储过程里的一致) spCmd.Parameters.AddWithValue("@PageNumber", targetPage); spCmd.Parameters.AddWithValue("@PageSize", itemsPerPage); spCmd.Parameters.AddWithValue("@StartRow", startRow); spCmd.Parameters.AddWithValue("@EndRow", endRow); // 后续执行命令、读取结果的逻辑 // 比如 using (SqlDataReader reader = spCmd.ExecuteReader()) { ... } }
额外要注意的小细节
- 一定要校验
@PageNumber的最小值:如果用户传入了0或者负数,计算出来的StartRow会是0甚至负数,导致存储过程返回空数据。所以业务层最好加个判断:targetPage = Math.Max(targetPage, 1); - 最后一页的兼容:如果总数据量不足一页(比如总共有28条,
pageSize=10,第三页的EndRow=30),存储过程里的RowNum BETWEEN 21 AND 30会自动只返回21-28条数据,不需要额外修改存储过程逻辑,这个是SQL的BETWEEN运算符的特性。
内容来源于stack exchange
相关产品推荐
相关产品推荐

