4

我正在 C# 中创建一个 GUI,并且我有以下代码行来获取从 lowerPageBound 到 upperPageBound 的元素。

command.CommandText = "Select Top " + rowsPerPage + " " +
        CommaSeparatedListOfColumnNames + " From " + tableName +
        " WHERE " + columnToSortBy + " NOT IN (SELECT TOP " +
        lowerPageBoundary + " " + columnToSortBy + " From " +
        tableName + " Order By " + columnToSortBy +
        ") Order By " + columnToSortBy;
adapter.SelectCommand = command;
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
adapter.Fill(table);

生成的 SQL 语句在访问数据库上使用时给我一个错误(adapter.Fill(table) 被执行),但在 sql 数据库上工作正常。

下面是生成的 SQL:

Select Top 25 [ID], [Business Process], [Tier Level], [Application], [CI ID], [Server], [Server Function], [Data Center], [HA], [DR Equip], [Procedure], [Procedure Tested], [Type], [Outcome], [Overall Status] From Data WHERE ID NOT IN (SELECT TOP 0 ID FROM Data ORDER BY ID) ORDER BY ID;

我收到的错误是:

Syntax error in query expression 'ID NOT IN (SELECT TOP 0 ID FROM Data ORDER BY ID)'.

我试图解决这个问题几个小时,但我没有运气。为什么相同的语句在访问数据库上不起作用是没有意义的。任何帮助表示赞赏!

4

2 回答 2

4

Access db 引擎将在查询的这一部分引发错误。

SELECT TOP 0 ID FROM Data ORDER BY ID

您可以拆分该部分并将其作为新的 Access 查询进行测试。不幸的是,错误消息不是很有帮助:“ SELECT 语句包含拼写错误或丢失的保留字或参数名称,或者标点符号不正确。 ” 这是数据库引擎在出现时给您的一般错误消息无法准确描述问题。

基本上,这一切都归结为您SELECT TOP 0在 Access SQL 中无法做到的事实。

此外,一旦您解决了关于 的问题SELECT TOP 0,您需要ORDER BY在外部查询中添加一个子句。如果没有ORDER BY,则返回的行TOP 25是任意的。

于 2012-07-26T18:22:34.623 回答
3

要执行分页功能,您可以:

  • 当 pagestart 为 0 时,省略 NOT IN 子句。
  • 使用方法SELECT TOP pagesize * FROM (SELECT TOP pagestart + pagesize * FROM X ORDER BY Condition) AS Alias ORDER BY Condition DESC。重要的部分是第二个 ORDER BY 与第一个相反。您可能需要最终的 ORDER BY 才能获得正确的订单,尽管客户应该能够做到这一点。请注意,在 Access 2007 之前,设计人员会将派生表(括号中的部分)更改为[SELECT ...]. AS Alias,但现在它仍然存在。

如果这些方法不令人满意,还有更多方法。

除了 HansUp 所说TOP 0的不受支持之外,您还可能会遇到 SQL Server 和 Access 语法之间的其他差异。为了帮助缓解这种情况,您可能需要查看 DB 级别设置以使用 SQL-Server 语法。它并不完美,但允许一些在 Access 中通常会失败的语法。请注意,在项目中间切换可能会出现问题。请参阅有关 ANSI 89 和 ANSI 92 语法不兼容性的信息。

于 2012-07-26T19:27:17.613 回答