VB6 与 C# 以不同顺序返回的 SQL 结果集

Posted

技术标签:

【中文标题】VB6 与 C# 以不同顺序返回的 SQL 结果集【英文标题】:SQL result set returned in different order for VB6 vs. C# 【发布时间】:2013-07-30 20:01:15 【问题描述】:

我正在开发一个旧的 VB6.0 应用程序,该应用程序正在转换为 C#。在应用程序中查询了许多 SQL Server 视图。我在 VB6.0 和 C# 中传递相同的 SELECT 语句来查询视图。我还在每种语言中提供完全相同的 WHERE 子句,并且没有 ORDER BY 子句。视图确实包含它们自己的 ORDER BY 子句。

在 VB6.0 中,结果集始终以相同的顺序返回,而在 C# 中,结果集始终以相同的顺序返回。但是,返回到 VB6.0 和 C# 的命令不匹配。我可以通过VB6.0查询,几秒后通过C#查询,结果集顺序不同。

什么可能导致结果集顺序不同?我需要将从新的 C# 代码生成的一些输出文件与 VB6.0 代码进行比较以进行验证,所以我希望结果集以相同的顺序返回,或者至少了解结果集的原因VB6.0 和 C# 之间的顺序不匹配,但从同一种语言调用时总是相互匹配。

【问题讨论】:

提示:按视图排序可能无法按预期工作:***.com/questions/15187676/… 由于您正在重写应用程序,因此您可以从使用 ORM 中受益。 【参考方案1】:

如果您不指定 ORDER BY,您将永远保证记录返回的顺序。

该顺序可能通常以与聚集索引或数据/模式的某些其他特征相关的顺序返回。但它可以改变,没有警告或你能感知的原因。 - 这可能是由于哪些核心忙或不忙 - 这可能是由于您使用 SQL Server 的接口 - 这可能是由于最近引入的记录 - 或碎片化 - 或缓存表/结果 - 或者 SQL Server 或操作系统上的补丁

如果顺序很重要,请在最终/最外层查询中指定 ORDER BY

【讨论】:

底层视图指定了一个 ORDER BY..这可能无法按预期工作。 @DR 底层视图上的 ORDER BY 已被 SQL Server 优化掉。它知道,当您说 ORDER BY 与 TOP 组合时,ORDER BY 用于确定要包含哪些行,而不是按什么顺序显示它们。当您将其与 TOP 100 PERCENT(几乎存在于每个视图中)结合使用时,SQL Server 会说,“哦,你得到了所有行,所以我不需要使用 ORDER BY 来过滤。酷,我会找到我自己的过滤方式。”它丢弃了 TOP 和 ORDER BY。当外部查询没有时检查引用视图的计划 ORDER BY - 你不会找到排序/顶部运算符。

以上是关于VB6 与 C# 以不同顺序返回的 SQL 结果集的主要内容,如果未能解决你的问题,请参考以下文章

请教高手:java中 SQL查询结果返回为List<Map<String,Object>>结果集顺序问题

C# DataReader:Sql 批处理命令并返回结果

sql查询 按照规定的顺序返回结果集。

C# 通过DataSet 获取SQL 存储过程返回的多个结果集(tables)

Mybatis 查询的结果集,列的顺序如何去控制

如何使用与 sql server 的 DAO 连接更新 VB6 中的记录集