Jackcess DatabaseBuilder.open 失败
Jackcess DatabaseBuilder.open fails
我在我的 Eclipse 插件项目中使用 Jackcess API。我在 resources/lib 下添加了 jackcess-2.1.0.jar
文件。我将 jar 包含在我的二进制构建和 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) {
}
}
当我在调试模式下 运行 class 并且我达到 DatabaseBuilder.open
时调用失败。
这是我的项目结构:
谁能告诉我可能的原因吗?
DatabaseBuilder
的 .open
方法需要打开现有的格式正确的 Access 数据库文件。 java.io.File
的 .createTempFile
方法创建一个 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: Empty database file
当它尝试执行 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...");
}
我在我的 Eclipse 插件项目中使用 Jackcess API。我在 resources/lib 下添加了 jackcess-2.1.0.jar
文件。我将 jar 包含在我的二进制构建和 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) {
}
}
当我在调试模式下 运行 class 并且我达到 DatabaseBuilder.open
时调用失败。
这是我的项目结构:
谁能告诉我可能的原因吗?
DatabaseBuilder
的 .open
方法需要打开现有的格式正确的 Access 数据库文件。 java.io.File
的 .createTempFile
方法创建一个 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: Empty database file
当它尝试执行 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...");
}