Jackcess DatabaseBuilder.open失败(Jackcess DatabaseB

2019-10-22 18:57发布

我用我的Eclipse插件项目Jackcess API。 我加jackcess-2.1.0.jar资源/ LIB文件。 我包括在我的二进制构建和在罐子build.properties 。 我成功地进行连接使用连接字符串,但我DatabaseBuilder.open()调用不执行。 我的代码

 public void run() {
    try {
        File tempTarget = File.createTempFile("eap-mirror", "eap");
        try {
            this.source = DriverManager.getConnection(EaDbStringParser.eaDbStringToJdbc(sourceString));
            this.source.setReadOnly(true);

            try {
                FileUtils.copyFile(new File(templateFileString), tempTarget);
            } catch (IOException e) {
                e.printStackTrace();
            }
            // Changes
            try {
                this.target = DatabaseBuilder.open(tempTarget);
            } catch (IOException e) {
                e.printStackTrace();
            }

            Collection<String> tables = selectTables(source);
            long time = System.currentTimeMillis();
            for (String tableName : tables) {
                long tTime = System.currentTimeMillis();
                Table table = target.getTable(tableName);
                System.out.print("Mirroring table " + tableName + "...");
                table.setOverrideAutonumber(true);

                copyTable(table, source, target);
                System.out.println(" took "+ (System.currentTimeMillis() - tTime));
            }
            System.out.println("Done. Overall time: "+ (System.currentTimeMillis() - time));
            System.out.println("done");
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

          // More Code here

  } catch (IOException e1) {

    }
}

当我运行在调试模式中类和我达成DatabaseBuilder.open称之为失败。

这里是我的项目结构:

谁能告诉我它可能的原因是什么?

Answer 1:

.open的方法DatabaseBuilder预计将打开现有结构良好的Access数据库文件。 该.createTempFile的方法java.io.File创建一个0字节的文件。 所以,代码

File dbFile;
try {
    dbFile = File.createTempFile("eap-mirror", "eap");
    try (Database db = DatabaseBuilder.open(dbFile)) {
        System.out.println(db.getFileFormat());
    } catch (IOException ioe) {
        ioe.printStackTrace(System.out);
    }
} catch (Exception e) {
    e.printStackTrace(System.out);
} finally {
    System.out.println("Finally...");
}

会导致Jackcess扔

java.io.IOException异常:空数据库文件

当它试图做DatabaseBuilder.open(dbFile)

相反,你应该DatabaseBuilder.create到0字节的文件转换成这样一个真正的Access数据库文件

File dbFile;
try {
    dbFile = File.createTempFile("eap-mirror", ".accdb");
    dbFile.deleteOnExit();
    try (Database db = DatabaseBuilder.create(Database.FileFormat.V2010, dbFile)) {
        System.out.println(db.getFileFormat());
    } catch (IOException ioe) {
        ioe.printStackTrace(System.out);
    }
} catch (Exception e) {
    e.printStackTrace(System.out);
} finally {
    System.out.println("Finally...");
}


文章来源: Jackcess DatabaseBuilder.open fails