为什么文件是只读的?
Why is the file Read-Only?
我的 Java 应用程序的资源文件夹中有一个 Microsoft Access 数据库。
当用户单击一个按钮时,该数据库将复制到 PC 的临时目录中。然后我在同一目录中创建一个临时 VBS 文件并执行它。
(此 VBS 文件调用数据库中的 VBA 宏,删除一些记录。)
但是,当宏试图删除记录时,会抛出一个错误,指出数据库是只读的。
为什么会这样?
这是我的代码:
当用户点击按钮时,会设置一些变量,然后执行以下代码:
private void moveAccess() throws IOException {
String dbName = "sys_cl_imp.accdb";
String tempDbPath = System.getenv("TEMP").replace('\', '/') + "/" + dbName;
InputStream in = ConscriptioLegere.class.getResourceAsStream("res/" + dbName);
File f = new File(tempDbPath);
Files.copy(in, f.toPath(), StandardCopyOption.REPLACE_EXISTING);
this.dbFilePath = tempDbPath;
System.out.println("access in temp");
f = null;
}
然后连接到数据库以更新一些数据;
与
Connection con = DriverManager.getConnection("jdbc:ucanaccess://" + dbFilePath);
Statement sql = con.createStatement();
...
sql.close();
con.close();
之后执行:
public boolean startImport() {
File vbsFile = new File(vbsFilePath);
PrintWriter pw;
try {
updateAccess();
} catch (IOException e) {
e.printStackTrace();
return false;
}
try{
pw = new PrintWriter(vbsFile);
pw.println("Set accessApp = CreateObject(\"Access.Application\")");
pw.println("accessApp.OpenCurrentDatabase (\"" + dbFilePath + "\")");
pw.println("accessApp.Run \"sys_cl_imp.importData\", \"" + saveLoc + "\"");
pw.println("accessApp.CloseCurrentDatabase");
pw.close();
Process p = Runtime.getRuntime().exec("cscript /nologo \"" + vbsFilePath + "\"");
进程在运行时出现错误。
我不明白为什么数据库以只读方式打开。
我尝试在复制数据库后将 f 设置为 null,但事实证明这样行不通。
基于this dicussion.
解决方案是将 ;singleconnection=true
添加到 JDBC url。 UCanAccess
将在 JDBC 连接关闭后关闭文件。
Connection con = DriverManager.getConnection("jdbc:ucanaccess://" + dbFilePath +";singleconnection=true");
谢谢你的解决方案,beckyang。
我设法让它工作,但还有第二个错误:
我用 java 删除了 table 的内容,然后关闭了连接和 运行 vba 程序。
在 VBA 我试图再次删除数据;但是因为有 none,所以没有成功。
从 VBA 中删除 SQL 后,项目运行:)
我的 Java 应用程序的资源文件夹中有一个 Microsoft Access 数据库。 当用户单击一个按钮时,该数据库将复制到 PC 的临时目录中。然后我在同一目录中创建一个临时 VBS 文件并执行它。 (此 VBS 文件调用数据库中的 VBA 宏,删除一些记录。) 但是,当宏试图删除记录时,会抛出一个错误,指出数据库是只读的。 为什么会这样?
这是我的代码:
当用户点击按钮时,会设置一些变量,然后执行以下代码:
private void moveAccess() throws IOException {
String dbName = "sys_cl_imp.accdb";
String tempDbPath = System.getenv("TEMP").replace('\', '/') + "/" + dbName;
InputStream in = ConscriptioLegere.class.getResourceAsStream("res/" + dbName);
File f = new File(tempDbPath);
Files.copy(in, f.toPath(), StandardCopyOption.REPLACE_EXISTING);
this.dbFilePath = tempDbPath;
System.out.println("access in temp");
f = null;
}
然后连接到数据库以更新一些数据; 与
Connection con = DriverManager.getConnection("jdbc:ucanaccess://" + dbFilePath);
Statement sql = con.createStatement();
...
sql.close();
con.close();
之后执行:
public boolean startImport() {
File vbsFile = new File(vbsFilePath);
PrintWriter pw;
try {
updateAccess();
} catch (IOException e) {
e.printStackTrace();
return false;
}
try{
pw = new PrintWriter(vbsFile);
pw.println("Set accessApp = CreateObject(\"Access.Application\")");
pw.println("accessApp.OpenCurrentDatabase (\"" + dbFilePath + "\")");
pw.println("accessApp.Run \"sys_cl_imp.importData\", \"" + saveLoc + "\"");
pw.println("accessApp.CloseCurrentDatabase");
pw.close();
Process p = Runtime.getRuntime().exec("cscript /nologo \"" + vbsFilePath + "\"");
进程在运行时出现错误。 我不明白为什么数据库以只读方式打开。
我尝试在复制数据库后将 f 设置为 null,但事实证明这样行不通。
基于this dicussion.
解决方案是将 ;singleconnection=true
添加到 JDBC url。 UCanAccess
将在 JDBC 连接关闭后关闭文件。
Connection con = DriverManager.getConnection("jdbc:ucanaccess://" + dbFilePath +";singleconnection=true");
谢谢你的解决方案,beckyang。 我设法让它工作,但还有第二个错误: 我用 java 删除了 table 的内容,然后关闭了连接和 运行 vba 程序。 在 VBA 我试图再次删除数据;但是因为有 none,所以没有成功。 从 VBA 中删除 SQL 后,项目运行:)