MS Access错误:SELECT语句包含拼写错误或缺失的保留字或参数名称,或者标点符号不正确

时间:2009-07-15 20:53:10

标签: asp.net sql ms-access

[更新:如果我在参数中进行硬编码,查询就会起作用 - 所以它与我在查询中添加参数的方式有关]

对于我的生活,我无法弄清楚这里的问题是什么。

以下是传递给datareader的查询:

    SELECT * FROM (SELECT TOP ? StartDate, [ID] FROM
    (SELECT TOP ? StartDate, [ID] FROM Story 
    ORDER BY StartDate DESC, [ID] DESC) AS foo 
    ORDER BY StartDate ASC, [ID] ASC) AS bar 
    INNER JOIN Story AS t ON bar.ID = t.ID 
    ORDER BY bar.StartDate DESC, bar.[ID] DESC

参数按以下顺序添加:

var pNumToRetrieve = new OleDbParameter("", OleDbType.Integer) {Value = numToGet};
var pResultSet = new OleDbParameter("", OleDbType.Integer) {Value = resultSet};

_cmd.Parameters.Add(pNumToRetrieve);
_cmd.Parameters.Add(pResultSet);

如果我直接将此查询输入访问,它就可以正常工作。但是,从ASP.NET运行查询时,我收到以下错误:

SELECT语句包含拼写错误或缺失的保留字或参数名称,或者标点符号不正确。

我做错了什么?

谢谢,

亚当

6 个答案:

答案 0 :(得分:6)

Jet SQL中的TOP N查询中的N无法参数化,周期。您必须动态编写SQL字符串以获取变量N.这意味着您不能使用已保存的QueryDef,或者您必须编辑QueryDef的SQL并在使用之前保存它。

答案 1 :(得分:2)

考虑使用相关子查询重写TOP N构造。

这是一个简单的例子。考虑一个名为Sequence的表,其中列(seq)为唯一INTEGER s(标准SQL辅助表,在无数情况下很有用 - 每个数据库应该有一个!)

以下两个查询都返回seq的两个最高值:

1)

SELECT TOP 2 seq 
  FROM SEQUENCE
 ORDER 
    BY seq DESC;

优点:Access数据库引擎相对较好地执行此操作(正如您对专有语法所期望的那样)。 缺点:专有语法因此不便于移植。 N(如在TOP N中)不能参数化。对我来说,使用DESC中的ORDER BY返回最高值是违反直觉的。

2)

SELECT S1.seq 
  FROM SEQUENCE AS S1
 WHERE 2 >= (               
             SELECT COUNT(*)          
              FROM SEQUENCE AS S2       
             WHERE S2.seq >= S1.seq 
            );

优点:标准SQL语法因此有利于可移植性。 N可以参数化。 缺点:Access数据库引擎不能很好地优化相关子查询,因此随着表中行数的增加,性能会下降(与性能问题一样,您需要对其进行测试)。一些SQL编码器发现相关子查询难以理解,因此存在潜在的维护问题。

答案 2 :(得分:0)

我注意到并非所有ID列都有方形括号。这可能是它,但是我已经玩了一段时间,所以其他人可能有更好的答案。

修改

到目前为止,你没有运气,我会尝试另一种猜测。您是否可以尝试将“*”更改为显式命名所需的列。

最终编辑:

我要提供的最后一条建议是用一个非常简单的版本替换查询,它不会产生任何结果。然后给它一个测试,如果它失败了它必须是失败的参数代码,如果没有那么它就是查询复杂性的东西。如果逐步重建查询,则应该能够检测到失败点。对不起,我无法提供更多帮助。

答案 3 :(得分:0)

是否将pResultSet参数键入为OleDbTypeInteger?

答案 4 :(得分:0)

它是否喜欢子查询中的顺序? SqlServer不支持。

编辑:我的错误,我错过了Top?

答案 5 :(得分:0)

查看以这种方式更改查询是否有帮助。

PARAMETERS numToGet number, rowsToGet numeric;
SELECT * FROM (SELECT TOP numToGet StartDate, [ID] FROM
    (SELECT TOP rowsToGet StartDate, [ID] FROM Story 
    ORDER BY StartDate DESC, [ID] DESC) AS foo 
    ORDER BY StartDate ASC, [ID] ASC) AS bar 
    INNER JOIN Story AS t ON bar.ID = t.ID 
    ORDER BY bar.StartDate DESC, bar.[ID] DESC

编辑:在旁注中,使用这两个参数传递的值是多少?这两个数字都是?