我在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)'.
我试图解决这个问题几个小时但我没有运气。为什么同一语句不适用于访问数据库是没有意义的。任何帮助表示赞赏!!
答案 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)
要执行分页功能,您可以:
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。