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

Posted

技术标签:

【中文标题】MS 访问错误:SELECT 语句包含拼写错误或丢失的保留字或参数名称,或者标点符号不正确【英文标题】:MS Access Error: The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect 【发布时间】:2009-07-15 20:53:10 【问题描述】:

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

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

这是传递给数据读取器的查询:

    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 语句包含拼写错误或缺失的保留字或参数名称,或标点不正确。

我做错了什么?

谢谢,

亚当

【问题讨论】:

问题在于在 ASP.NET 中运行字符串。因此,所需的标签和应用技能将是 ASP.NET。 ??? 你能扩展一下吗?我在上面粘贴的查询取自 asp.net 中的调试器 - 这是传递的确切值/字符串。 我认为他们的意思是你的问题应该被标记为 ASP.NET 而不是 SQL。但是,从您接受的答案看来,这不是真的。 啊,我明白了。我改变了标签。谢谢——亚当 【参考方案1】:

Jet SQL 中 TOP N 查询中的 N 不能参数化,句号。您必须即时编写 SQL 字符串以获取变量 N。这意味着您不能使用已保存的 QueryDef,或者您必须在使用前编辑 QueryDef 的 SQL 并保存它。

【讨论】:

+1。接得好。我太愚蠢了,我没有先在 Access 中尝试该查询以查看它是否有效 :) 嗯,我想这可以解释它:P 感谢您提供答案!您是否知道一个很好的资源可以帮助我加快在 ASP.NET 中运行 Access 查询的速度 - 特别是通过 ASP.NET/ADO 传递参数化查询?我也遇到了关于日期的参数化 BETWEEN 查询的问题。再次感谢! ——亚当 "你必须在运行中编写你的 SQL 字符串才能得到一个变量 N"——好吧,你可以使用不同的结构重新编写它,例如一个相关的子查询。 使用 Jet/ACE,相关子查询的效率可能不如 TOP N,也可能不如 TOP N。它也是更复杂的 SQL。【参考方案2】:

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

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

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

1)

SELECT TOP 2 seq 
  FROM SEQUENCE
 ORDER 
    BY seq DESC;

优点:Access 数据库引擎在这方面的表现相对较好(正如您对专有语法所期望的那样)。 缺点:专有语法因此不利于可移植性。 N(如 TOP N)无法参数化。对我来说,在ORDER BY 中使用DESC 来返回最高值是违反直觉的。

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 编码人员发现相关子查询难以理解,因此存在潜在的维护问题。

【讨论】:

我认为您有一个错误:对于“SELECT seq AS S1”,您的意思是“SELECT seq”。 感谢 onedaywhen - 很高兴知道如果我必须使用参数化查询,我可以这样做。虽然 - 这对于我的 sql/db 无知的头脑来说似乎有点难以掌握。我投票赞成您的问题-感谢您的帮助。 --亚当 Te-he -- 这不是我的答案,也不是你的答案。这是一个协作网站:)【参考方案3】:

是不是pResultSet参数被键入为OleDbTypeInteger?

【讨论】:

您好 Carl,我在故障排除过程中添加了类型。删除类型参数并将值作为通用对象传递会产生相同的结果。感谢您的帮助。【参考方案4】:

它喜欢子查询中的顺序吗?这在 SqlServer 中不受支持。

编辑:我的错误,我错过了顶部?

【讨论】:

嗨 sgmoore,该查询是我在 codeproject.com/KB/aspnet/paging_various_databases.aspx 找到的用于分页结果的查询。就像我说的,直接在 Access 的 SQL 视图中输入查询效果很好。 你是如何生成命令字符串的。如果您将各种字符串附加在一起,则可能会在行尾缺少一个空格。 我正在附加字符串 - 但是,我在参数值中进行了硬编码,并且查询有效。所以我怀疑我添加/声明参数的方式存在问题。虽然我找不到问题!啊…… 参数名称重要还是缺少名称?例如尝试 OleDbParameter("NumberToGet", OleDbType.Integer) 而不是 OleDbParameter("", OleDbType.Integer) 命名参数时结果相同 - 谢谢【参考方案5】:

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

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

编辑:顺便说一句,使用这两个参数传递的值是什么?都是数字吗?

【讨论】:

您好,shahkalpesh,您的查询得到了相同的结果。谢谢——亚当 是的,我按顺序通过 10 和 20 您可以在构造参数时使用上述查询命名参数吗? var pNumToRetrieve = new OleDbParameter("numToGet", OleDbType.Integer) 并命名第二个参数。这行得通吗? 我命名参数时结果相同 - 谢谢 -- Adam【参考方案6】:

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

编辑:

由于您到目前为止没有运气,我将尝试另一个猜测。您能否尝试更改“*”以明确命名您想要的列。

最终编辑:

我必须提供的最后一条建议是将查询替换为一个非常简单的版本,它本身不会产生任何结果。然后给它一个测试,如果它失败了它一定是参数代码失败了,如果不是那么它是查询的复杂性。如果您逐渐重建查询,您应该能够检测到故障点。抱歉,我无法提供更多帮助。

【讨论】:

嗨,克里斯,我添加了方括号只是为了确保 ID 不是 Access 中的保留字。没有它们的结果相同。谢谢——亚当 与以前的结果相同。谢谢你的帮助,克里斯。 感谢您的想法 - 请参阅我在上面发布的更新。如果我将参数值硬编码到查询中,它就可以正常工作。所以它必须与我声明/添加参数的方式有关。谢谢——亚当

以上是关于MS 访问错误:SELECT 语句包含拼写错误或丢失的保留字或参数名称,或者标点符号不正确的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库出现错误代码1064是啥原因?

Access 2010 中的 SQL 错误

.htaccess:无效命令“允许”,可能拼写错误或由未包含在服务器配置中的模块定义

错误 ms 访问 vba 电子邮件报告

MS Access ADP 自动编号

SQLSTATE [42000]:语法错误或访问冲突:sql select 语句中的 1064