2017-02-02 17 views
2

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に設定しようとしましたが、そのように動作しないことが判明しました。

答えて

2

this dicussionに基づいて。
解決策は、;singleconnection=trueをJDBC URLに追加しています。 UCanAccessは、JDBC接続が閉じられた後にファイルを閉じます。

Connection con = DriverManager.getConnection("jdbc:ucanaccess://" + dbFilePath +";singleconnection=true"); 
+1

解決策全体を参照してください... –

1

あなたのソリューションbeckyangありがとうございました。 私はそれを扱うことができましたが、2番目の間違いがありました。 Javaでテーブルの内容を削除してから、接続を閉じてvbaプロシージャを実行しました。 VBAでは、データをもう一度削除しようとしていました。しかし何もなかったので、これはうまくいかなかった。 VBAからSQLを削除した後、プロジェクトは正常に動作しました:)

関連する問題