【问题标题】:SQL Exception : Unexpected Token - UCanAccessSQL 异常:意外的令牌 - UCanAccess
【发布时间】:2018-02-02 16:20:13
【问题描述】:

我正在尝试从 Java 程序创建一个新的 MS Access 表。 SQL查询如下。我收到一条错误消息:

net.UcanacessSQLException:UCAExc:::4.0.1 意外令牌:REQ-MTI

PreparedStatement prepStmt;

String createStmt = "CREATE TABLE [" + tableName + "] ([Test_Case_ID] CHAR (20) PRIMARY KEY, [Test_Name] CHAR (120)," 
    + " [Test_Description] CHAR (100), [Req-MTI] CHAR (15), [Req-Card_ID] CHAR (50), [Req-H19] CHAR (20));";

prepStmt = conn.prepareStatement(createStmt);
prepStmt.executeUpdate();

我不能使用下划线代替连字符。我尝试将所有表名放在方括号、引号等中,但似乎没有任何效果。我已经获取了生成的字符串并将其粘贴到 MS Access 查询中,它在那里创建了表格。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 你能告诉我们完整的代码吗?
  • 更新了问题。
  • 你能用Req_MTI代替Req-MTI
  • 对不起,应该提出我不能使用下划线的问题。
  • 您已经在Test_Case_ID 中使用了它,我假设不接受带有- 的名称,因此请删除它

标签: java ms-access jdbc ucanaccess


【解决方案1】:

我能够在 UCanAccess 4.0.2 下重现您的问题。 CHAR 关键字后面的空格似乎使它感到困惑。如果我将字段指定为 CHAR(20) 而不是 CHAR (20),我可以让代码运行。

编辑回复:问题更新

我能够在 UCanAccess 4.0.1 下重现该问题。解决方法是使用Statement 而不是PreparedStatement 来执行DDL。 (甚至没有必要像上面描述的那样删除空格,至少在 4.0.1 下是这样。)

【讨论】:

  • 我试过了,仍然出现同样的错误。我确实觉得这是 UCanAccess 方面的一个问题。
  • @theKD - 请注意,我说的是“某种复制”。您问题中的复制代码显然不是您实际使用的代码,因为它甚至没有编译:您的 createStmt 声明格式错误。请修复您问题中的代码。 (提示:复制粘贴是您的朋友。)
  • 这是我使用的代码,createStmt 格式错误,因为 StackOverflow 强制换行。唯一的换行符应该在 + 之前。
  • 谢谢你,解决了这个问题。
【解决方案2】:

如果列名包含除字母、数字和下划线以外的任何字符,则名称必须用反引号 (`) 括起来进行分隔

所以尝试将您的列名更改为:

`Req-MTI`

【讨论】:

  • 您好,我已更改为反引号,但仍然出现相同的错误。
猜你喜欢
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多