【问题标题】:SqlDataAdapter returns unexpected rows in SQL Server 2012SqlDataAdapter 在 SQL Server 2012 中返回意外的行
【发布时间】:2012-09-26 06:56:29
【问题描述】:

对情况的简短描述。

一个网络应用程序,用户可以在其中选择一些搜索条件,点击搜索按钮,然后查看显示在网格中的结果。

此应用程序在我们的开发服务器上按预期运行。但是,当部署在客户的服务器上时,网格的分页被破坏了:第一页是正确的,但下一页没有返回正确的行。我只能用一个例子来解释会发生什么:

假设第 1 页应显示结果 1-10,第 2 页应显示结果 11-20,等等。

发生的情况是这样的:第 1 页显示 1-10,第 2 页显示 1,2,3,4,6,8,9,28, 29,30第3页显示1,2,3,28,29,36,37,..

所以行被弄乱了,很多结果都没有显示(替换为上一页的结果)。另请注意,这些行不只是偏离了某个数字。

经过数小时的搜索和调试,我只能得出结论,正在使用的 SqlDataAdapter 的 Fill() 方法返回了错误的结果!适配器使用 SqlCommand,将 SQL 查询作为纯文本。我可以在 SQL Server Management Studio 中运行这个查询,它会返回正确的结果,所以它在 .NET 框架本身内部肯定会出错。

我尝试启用 .NET 源代码调试以进入 Fill 方法,但我无法让它工作,所以现在基本上我没有选择了..

非常感谢任何提示/建议!

【问题讨论】:

  • 你确定表结构和开发环境完全一样吗?我的意思是主键、数据类型等。
  • 昨天我们将数据库从客户那里传输到我们的开发环境中,就在那时我们发现应用程序在我们自己的服务器上运行正常。
  • 结果分页的标准是什么 - 可能是排序规则/本地化问题,例如日期时间被自动转换为不同的格式,或者字符串在一台服务器上而不是另一台服务器上不区分大小写?鉴于每台服务器上的设置,它可以解释奇怪的结果吗?

标签: asp.net c#-4.0 sql-server-2012


【解决方案1】:

我找到了问题的原因。 SQL查询手动实现分页(不要问我为什么,代码不是我写的,我只需要维护它;-))。 使用了以下语句:

("DELETE FROM #tmp WHERE AccountId IN (SELECT TOP {0} AccountId FROM #tmp);", request.PageStart)
("SELECT DISTINCT TOP {0} ", request.NumRecords);

#tmp 表是在前面的语句中创建的,带有一个特定的 ORDER BY 子句。由于#tmp 表已经排序,您希望删除语句会删除正确的顶部记录。但显然,当将 SqlDataAdapter 与 SQL Server 2012 数据库结合使用时,该顺序不再正确应用。在添加与创建#tmp 表的查询相同的order by 子句后,问题就解决了。 还有一个问题:这是错误还是功能?

【讨论】:

    猜你喜欢
    • 2017-10-30
    • 2016-07-18
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2019-08-20
    • 2013-09-16
    相关资源
    最近更新 更多