2

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

经过一些实验后,我确定问题是由名称中包含撇号的三列引起的。示例:[预定的采购订单放置日期]。显然 JDBC-ODBC 桥不在乎,但 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 以便驱动程序可以执行它们?

4

2 回答 2

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 的未来版本中得到修复。

于 2015-02-26T12:55:09.963 回答
0

您是否尝试过 `` 之间的表、列名(它们不是撇号,而是 ~ 旁边的那个),\' 可能会起作用,最后 JDBC 标准方法是在查询末尾定义转义字符:

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

您可能还想用 `` 而不是 [] 来尝试上面的那个

最后,您的最后一个资源是“select *”并自己提取正确的列

于 2015-02-26T00:06:51.430 回答