UCanAccess:来自空间的意外令牌

Posted

技术标签:

【中文标题】UCanAccess:来自空间的意外令牌【英文标题】:UCanAccess: unexpected token from spaces 【发布时间】:2017-07-31 20:01:39 【问题描述】:

我正在尝试将数字/文本插入表格,但当程序尝试插入文本时,我收到错误net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.2 unexpected token: EX1 required: )

这是我的相关代码:

try (Connection conn = DriverManager.getConnection(
   "jdbc:ucanaccess://" + dbPath  
   +   ";newdatabaseversion=V2010"
   )) 
   DatabaseMetaData dmd = conn.getMetaData();
     try (ResultSet rs = dmd.getTables(null, null, tableName, new String[]  "TABLE" )) 
          try (Statement s = conn.createStatement()) 
                ResultSet resultSet;
                String tableName = "Database";
                s.executeUpdate("CREATE TABLE " + tableName +" ( [SUBJID] 
                INTEGER, [PARAMCD] TEXT, [PARAM] TEXT, [AVAL] DOUBLE)");
                String s1="Text Ex1";
                String s2="Text Ex2";
                int a=3;
                double b=2;
                resultSet = s.executeQuery("SELECT * FROM " + tableName);
                s.executeUpdate("INSERT INTO " + tableName
                    + " ( SUBJID, PARAMCD, PARAM, AVAL)"
                    + " VALUES ( "+ a+", " + s1 + ", " + s2 +" , " + b +" )");

在我看来,错误是在出现空白时引起的。我尝试将 s1 更改为“TextEx1”,将 s2 更改为“TextEx2”,这给了我net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.2 user lacks privilege or object not found: TEXTEX1 的错误。

提前感谢任何人提供的任何帮助。

【问题讨论】:

调用表Database 不是最好的主意。加上Text Ex1,您需要适当的引用或参数绑定(这样会更安全)。 正确引用是什么意思? 打印"INSERT INTO " + tableName + " ( SUBJID, PARAMCD, PARAM, AVAL)" + " VALUES ( "+ a+", " + s1 + ", " + s2 +" , " + b +" )" 这不是我做的吗? 【参考方案1】:

你想做这样的事情:

String sql = "INSERT INTO [" + tableName + "] (SUBJID, PARAMCD, PARAM, AVAL) VALUES (?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, a);
ps.setString(2, s1);
ps.setString(3, s2);
ps.setDouble(4, b);
ps.executeUpdate();

【讨论】:

感谢 Gord,这非常有效。如果我想更新它而不是插入,我会怎么做?我尝试用 "UPDATE" 替换 "INSERT INTO" ,但这给了我一个错误 "net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.2 unexpected token: ( required: SET" 。 UPDATE 语法有点不同,例如,UPDATE [Database] SET PARAMCD=?, PARAM=? WHERE SUBJID=? 我使用了 String sql = "UPDATE [" + tableName + "] SET SUBJID=?, PARAMCD=?, PARAM=? WHERE AVAL=?";,它在大多数情况下都有效 - 但是,当我在多行中找到我的“AVAL”值时遇到了问题,因为当我只更新了每个行时想更新最新的。我尝试将其更改为String sql = "UPDATE [" + tableName + "] SET SUBJID=?, PARAMCD=?, PARAM=?, AVAL=? WHERE PARAMCD=? AND SUBJID=?";,但收到net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.2 Parameter not set 的错误。有什么办法可以添加多个参数吗? 这让 cmets 偏离了特定答案的轨道。你应该问一个新问题。

以上是关于UCanAccess:来自空间的意外令牌的主要内容,如果未能解决你的问题,请参考以下文章

当别名包含某些字符时,UCanAccess 出现“意外令牌”错误

带有数字通配符的 UCanAccess Select 语句给出了意外的令牌:需要 REGEXP_MATCHES

异常意外令牌:SMALLINT;而自动增量主键

意外令牌:AS(使用 UCanAcces.jar)

无法使用 DBeaver 和默认的 UCanAccess-5.0.0 驱动程序连接到 MS Access mdb 文件

jdbc ucanaccesssqlexception ucaexc ::: 4.0 4 意外令牌:DOCTOR