java - UCanAccess SQL 插入失败;查询在 MS Access 意外 token (UcanaccessStatement.java :222)

标签 java sql ms-access ucanaccess

这是我第一次尝试用 Java 构建一些东西,最终目标是简单地将 excel 文件导入到 MS Access 数据库中。

我怀疑存在某种数据不兼容错误,或者 UCA 正在执行某些清理查询的操作,但我对 Java 或 UCanAccess 的了解不够,无法追踪它。

这是我组装的查询,它运行良好,可以直接在 MS Access 中插入数据:

INSERT INTO XXXX_XA_Data_1 ([Date],[Fund Ticker],[Unique ID],[Cash & Cash Equiv],[Mkt Value of Security Holdings],[Today's Future Variation Margin],[Other Net Assets],[Total Net Assets],[Fund Shares],[NAV],[Fund Sales ($)],[Fund Sales (Shares)],[Fund Redemptions ($)],[Fund Redemptions (Shares)]) 
VALUES (#12/01/2001#,"XXXXX","00000000-XXXXX",0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000);

一些数据已替换为 X 和 0,但所有列名称均相同。

我尝试了几种变体,看看哪种可行,我可以让它插入基金代码、唯一 ID 以及现金和现金等价物。根据这些尝试,我认为日期格式或某些列名称破坏了它,但我找不到其他遇到此确切问题的人。

这是java:

Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
db = DriverManager.getConnection("jdbc:ucanaccess://C:" + path_db);

...

Statement s = db.createStatement();
try {
  int result = s.executeUpdate(rowquery);
} catch (Exception e) {
  e.printStackTrace();
}

以及完整的跟踪:

[2016-02-18 13:37:29.053]: SQL Insert failed for item 1. Aborting with exception: net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.3.1 unexpected token: [
    at net.ucanaccess.jdbc.UcanaccessStatement.executeUpdate(UcanaccessStatement.java:222)
    at DailyImporter.main(DailyImporter.java:226)
Caused by: java.sql.SQLSyntaxErrorException: unexpected token: [
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source)
    at net.ucanaccess.jdbc.ExecuteUpdate.executeWrapped(ExecuteUpdate.java:67)
    at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:152)
    at net.ucanaccess.jdbc.ExecuteUpdate.execute(ExecuteUpdate.java:50)
    at net.ucanaccess.jdbc.UcanaccessStatement.executeUpdate(UcanaccessStatement.java:220)
    ... 1 more
Caused by: org.hsqldb.HsqlException: unexpected token: [
    at org.hsqldb.error.Error.parseError(Unknown Source)
    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
    at org.hsqldb.ParserBase.checkIsIdentifier(Unknown Source)
    at org.hsqldb.ParserDQL.readSimpleColumnName(Unknown Source)
    at org.hsqldb.ParserDQL.readSimpleColumnNames(Unknown Source)
    at org.hsqldb.ParserDML.compileInsertStatement(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
    at org.hsqldb.Session.executeDirectStatement(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 7 more

此处是否存在需要解决的列名称或其他数据格式问题?或者除了 UCanAccess 之外可以在 MS Access 数据库上简单地运行 SELECT/INSERT 查询的库?

最佳答案

UCanAccess 目前难以解析字段名称包含撇号(又名“单引号”字符)' 的 SQL 语句,例如,

sql = "INSERT INTO XXXX_XA_Data_1 ([Today's Future Variation Margin]) VALUES (1)";

该问题已报告给 UCanAccess 开发团队,预计将在 UCanAccess 的 future 版本中得到修复。

同时,如果您不需要执行任何复杂的 SQL 查询,则可以导入 com.healthmarketscience.jackcess.*; 并直接使用 Jackcess API。例如,要执行与上面的 INSERT 语句等效的操作,您可以这样做

String dbFileSpec = "C:/Users/Public/example.accdb";
try (Database db = DatabaseBuilder.open(new File(dbFileSpec))) {
    Table tbl = db.getTable("XXXX_XA_Data_1");
    HashMap rowData = new HashMap();
    rowData.put("Today's Future Variation Margin", 1);
    tbl.addRowFromMap(rowData);
}

关于java - UCanAccess SQL 插入失败;查询在 MS Access 意外 token (UcanaccessStatement.java :222),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35492250/

相关文章:

java - JNI : What signature to use when returning a user defined java class?

sql - 在 SQL 查询中动态选择列

ms-access - 转义不需要的字符,主要是单引号--replace函数及实现

ms-access - 隐藏 Access 2016 的功能区

java - 使用 TreeNodes 扩展 Comparable 的广度优先二叉树搜索

java - JCheckBox 知道复选框是否被选中

sql - 查询优化不先执行内部查询

MySQL - 每个表都应该包含它自己的 id/主列吗?

java - 如何使用Java Access odbc数据库?

java - 如何使用JQuery正确提交表单?