当列名包含撇号时,“UcanaccessSQLException:意外令牌”

时间:2015-02-25 22:38:52

标签: java sql ms-access-2007 ucanaccess

我正在将现有程序从JDBC-ODBC Bridge转换为UCanAccess。它已经工作多年了。 Java程序写入MDB文件。转换后,一个Insert命令停止工作 它抛出" net.ucanaccess.jdbc.UcanaccessSQLException:意外的令牌:["。

经过一些实验,我确定问题是由三个包含撇号的列引起的。示例:[Sched' d PO Place Date]。显然JDBC-ODBC Bridge并不关心UCanAccess。

我有点困在现有的MDB结构中,或者我只是重命名字段。但是,如果我这样做,就无法确定有多少下游报告会被打破。 MDB用于Ad Hoc报告。

这是问题的简化SQL Select版本。它抛出与插入相同的错误。

    String cJD = "net.ucanaccess.jdbc.UcanaccessDriver";
    String cS = "jdbc:ucanaccess://C:/MosAll/mosall.mdb";
    String uid = "";
    String pw = "";
    String sql4 =   "select [Sched'd PO Place Date] from [Tier 1] ";

    Class.forName(cJD);
    Connection con = DriverManager.getConnection(cS, uid, pw);
    PreparedStatement pstmt4;
    pstmt4 = con.prepareStatement(sql4);
    pstmt4.execute();

有没有办法逃避"撇号或重新配置ucanaccess以便驱动程序可以执行它们?

2 个答案:

答案 0 :(得分:1)

此问题已在UCanAccess 2.0.9.4中修复。


上一个回答:

我已经能够使用UCanAccess版本2.0.9.3重新创建该问题。

select [Sched'd PO Place Date] ...

失败,但现在只是忽略'

select [Schedd PO Place Date] ...

工作正常。有趣的是,使用反引号而不是方括号

select `Sched'd PO Place Date` ...

也会产生异常

  

net.ucanaccess.jdbc.UcanaccessSQLException:意外令牌:[

幸运的是,这将在未来的UCanAccess版本中修复。

答案 1 :(得分:0)

你有没有试过``(它们不是撇号而是撇号旁边的那个)之间的表,列名,`'可以工作,最后JDBC标准方法是在查询结束时定义转义字符:

String sql4 = "select [Sched\'d PO Place Date] from [Tier 1] { escape '\'}"

您可能想要使用``而不是[]

来尝试上面的那个

最后,您的最后一个资源是"选择*"并自己提取右栏