我正在将现有程序从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以便驱动程序可以执行它们?
答案 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 '\'}"
您可能想要使用``而不是[]
来尝试上面的那个最后,您的最后一个资源是"选择*"并自己提取右栏