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 + "\"");
プロセスの実行中に、エラーoccurres。 データベースがReadOnlyとして開いている理由がわかりません。
dbのコピー後にfをnullに設定しようとしましたが、そのように動作しないことが判明しました。
解決策全体を参照してください... –