【问题标题】:Why is the file Read-Only?为什么文件是只读的?
【发布时间】:2017-02-02 11:50:56
【问题描述】:

我的 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,但事实证明不是这样。

【问题讨论】:

    标签: java vba vbscript ms-access-2013 readonly


    【解决方案1】:

    基于this dicussion.
    解决方案是将;singleconnection=true 添加到 JDBC url。 UCanAccess 将在 JDBC 连接关闭后关闭文件。

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

    【讨论】:

      【解决方案2】:

      感谢您的解决方案 beckyang。 我设法让它与它一起工作,但出现了第二个错误: 我用java删除了一个表的内容,然后关闭了连接并运行了vba程序。 在 VBA 中,我试图再次删除数据;但由于没有,这没有成功。 从 VBA 中删除 SQL 后,该项目工作:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-23
        • 2020-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 2011-08-11
        相关资源
        最近更新 更多