UCanAccess SQL插入失败;查询在MS Access意外令牌中正常工作(UcanaccessStatement.java:222)

问题描述 投票:1回答:1

这是我用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替换,但所有列名都相同。

我已经尝试了几种变体来看看它会起作用,我可以让它插入Fund Ticker,Unique ID和Cash&Cash Equiv。根据这些尝试,我认为日期格式是破坏它或某些列名称,但我找不到其他人遇到过这个问题。

这是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查询?

java sql ms-access ucanaccess
1个回答
2
投票

UCanAccess目前难以使用包含撇号(a.k.a。“单引号”字符)'的字段名解析SQL语句,例如,

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

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

与此同时,如果您不需要执行任何复杂的SQL查询,那么您可以使用import 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.