You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:34:30