【问题标题】:Arithmetic overflow error while doing pagination进行分页时算术溢出错误
【发布时间】:2018-07-23 16:23:11
【问题描述】:

我正在尝试按块数据获取块,但出现以下错误:

将表达式转换为数据类型 int 时出现算术溢出错误。

代码:

int chunkSize = 100000;
 int curCount = 1;
 while (true)
 {
    var data = Get("Connectionstring",
        "select Id as LinkedColumn,CompareColumn from Source order by 
         LinkedColumn" + " OFFSET ((" + curCount + " - 1) * " + chunkSize + " 
         ) ROWS FETCH NEXT " + chunkSize + " ROWS ONLY;");

   if (data.Count == 0) break;
   curCount += chunkSize;
 }

以上方法适用于first iteration

select Id as LinkedColumn,CompareColumn from Source order by 
   LinkedColumn OFFSET ((1 - 1) * 100000 ) ROWS FETCH NEXT 100000 ROWS ONLY;

但我收到second iteration 的错误:

select Id as LinkedColumn,CompareColumn from Source order by
   LinkedColumn OFFSET ((100001 - 1) * 100000 ) ROWS FETCH NEXT 100000 ROWS ONLY;

当我在 sql server management studio 中运行上述查询时,我得到了同样的错误。

我不明白这里有什么问题。

this 上给出的答案与insert command 有关。

谁能帮帮我

【问题讨论】:

  • curCount += chunkSize;替换为curCount++;,目前你的分页逻辑不正确。
  • @Evk 哦,是的,您是对的。非常感谢。您的评论本身足以解决问题:)。实际上我从这里参考了:stackoverflow.com/questions/25900285/…

标签: c# sql sql-server pagination


【解决方案1】:

我认为问题出在OFFSET 计算中:

LinkedColumn OFFSET ((100001 - 1) * 100000 )

这将偏移 10,000,000,000 行,这几乎不是您真正想要的。

我觉得应该是

LinkedColumn OFFSET ((2 - 1) * 100000 )

在每次迭代中,数字应该增加 1 而不是 chunkSize。因此,您可能正在使用 curCount 变量,它应该递增 (curCount++)。

【讨论】:

  • 是的,但这是一个实体框架实现,您正在手动编写 SQL,这意味着您必须以不同的方式处理。
  • 赞成您为帮助我所做的努力,非常感谢您的回答。非常感谢。但我唯一不明白的是,这个问题的答案在逻辑上是正确的吗?
  • 因为实体框架中的Skip基本上生成了类似OFFSET( 100000 )的东西。 Take 然后指定FETCH NEXT 的编号
  • 两种方法的实现工作逻辑不同。在您的情况下,您可以通过将先前页面的数量乘以单个页面的大小来生成它。他们只是不断地跳过总行数本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多