与SQL数据库一起使用的SQL语句不适用于Access数据库

时间:2012-07-26 18:08:30

标签: c# sql ms-access select syntax-error

我在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)'.

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

2 个答案:

答案 0 :(得分:4)

Access数据库引擎会在查询的这一部分引发错误。

SELECT TOP 0 ID FROM Data ORDER BY ID

您可以突破该部分并将其作为新的Access查询进行测试。不幸的是,错误消息不是很有用:" SELECT语句包含拼写错误或缺失的保留字或参数名称,或者标点符号不正确。"这就是db引擎在无法准确描述问题时给你的一般错误消息。

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

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

答案 1 :(得分: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的方向相反。您可能需要最终的ORDER BY才能获得正确的订单,尽管客户应该能够做到这一点。请注意,在Access 2007之前,设计人员会将该派生表(括号中的部分)更改为[SELECT ...]. AS Alias,但现在它仍然存在。

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

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