MS Access SQL 参数太少。预计 4

Posted

技术标签:

【中文标题】MS Access SQL 参数太少。预计 4【英文标题】:MSAccess SQL Too few parameters. Expected 4 【发布时间】:2014-08-18 00:18:28 【问题描述】:

我正在使用 Delphi XE2 和 AnyDAC 以及一个 MSAccess 数据库。

'timea' 表有 5 个字段:

Rec_No 自动编号 应用文字 用户 ID 文本 私服文字 评论备忘录

此代码引发以下错误。该查询在 Access 查询设计器中运行良好。

sql := 'INSERT INTO [timea] (App, User_ID, PW, Comment) VALUES ("zoo", "Bill", "mi7", "Liger");';
adconnection1.ExecSQL(sql);

Project PWB.exe 引发异常类 EMSAccessNativeException,并带有消息“[AnyDAC][Phys][ODBC][Microsoft][ODBC Microsoft Access Driver] 参数太少。预计 4.'。

【问题讨论】:

您是否尝试过在列名周围使用方括号? 尝试单引号而不是双引号。 单引号应该可以解决问题。我不了解 AnyDAC,但 ADO (TADOConnection) 也允许使用双引号。在实际代码中,使用参数。 @Frazz - 括号里没有乐趣。 @Dan Bracuk - 单引号不起作用,但双引号起作用。谁知道? 【参考方案1】:

SQL 和 Delphi 都使用单引号作为字符串边界。由于您希望在字符串中包含单引号 ,因此您必须使用双引号将其“转义”。

例如,如果您编写 S := 'Guns''N''Roses',则变量 S 将包含字符串 Guns'N'Roses - 12 个字符,而不是 14 个字符。

连接字符串值时要小心,因为它们也可能包含单引号。在这种情况下编写查询的推荐方式是,例如:

sql := 'INSERT INTO Table (Col) VALUES (' + QuotedStr(Val) + ')';

函数QuotedStr 会小心处理字符串中的所有单引号。这对于避免插入黑客也是必不可少的。

【讨论】:

在另一个使用 DAO 和 Access 的程序中,双引号可以正常工作。区别是一个谜。 其实根据使用的驱动,可以接受不同的格式。一些驱动程序接受不同的通配符(*%)、日期格式等。 不完全正确。一些 DBMS 使用双引号或不同的转义字符。只需使用参数,你会没事的。 AnyDAC (FireDAC) 将完成剩下的工作。

以上是关于MS Access SQL 参数太少。预计 4的主要内容,如果未能解决你的问题,请参考以下文章

Access 2003 VBA SQL“参数太少”错误

odbc_exec():SQL 错误:[Microsoft][ODBC Microsoft Access Driver] 参数太少。预期 1.,SQLExecDirect 中的 SQL 状态 0700

更新语句Java sql异常:期望的参数太少

pyodbc 语法问题'参数太少。预计 2'

Access VBA中的参数太少但在“查询”构建器中有效

MS Access:将参数传递给不带 SQL 的子报表