【问题标题】:How to ALTER TABLE using UCanAccess如何使用 UCanAccess 更改表
【发布时间】:2016-05-17 13:43:16
【问题描述】:

我正在使用 UCanAccess JDBC 驱动程序(版本 3.0.3.1)连接到 mdb 文件。我需要将该列添加到现有表中。问题是声明

ALTER TABLE TEmployee ADD COLUMN NotificationsEnabled BINARY

抛出异常:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.x.x Feature not supported yet.

而且似乎没有更新版本的 UCanAccess。

在这种情况下我该怎么办?出于多种原因,我不想使用 ODBC 驱动程序(此处描述 - Manipulating an Access database from Java without ODBC

我看到的唯一解决方案是创建表的副本(例如 TEmployeeBackup)以保存数据,然后删除并使用新字段重新创建原始表,然后将数据从 TEmployeeBackup 移回 TEmployee。但是这个解决方案对我来说似乎很糟糕。

【问题讨论】:

    标签: java sql ms-access ucanaccess


    【解决方案1】:

    UCanAccess 4.0.0 及以上版本现在支持 ALTER TABLE,例如,

    Statement stmt = conn.createStatement();
    stmt.execute("ALTER TABLE TableName ADD COLUMN newCol LONG");
    

    【讨论】:

    • 这是个好消息!很高兴看到图书馆正在改进。
    【解决方案2】:

    更新:2017 年 1 月

    UCanAccess 现在支持 ALTER TABLE。请参阅我对此问题的其他回答。


    (以前过时的答案。)

    如果您的 Java 应用程序在 Windows 下运行,那么您可以使用以下解决方法。它创建一个小的 VBScript 并调用 CSCRIPT.EXE 来运行它

    String dbFileSpec = "C:\\Users\\Public\\mdbTest.mdb";
    
    // write a temporary VBScript file ...
    File vbsFile = File.createTempFile("AlterTable", ".vbs");
    vbsFile.deleteOnExit();
    PrintWriter pw = new PrintWriter(vbsFile);
    pw.println("Set conn = CreateObject(\"ADODB.Connection\")");
    pw.println("conn.Open \"Driver={Microsoft Access Driver (*.mdb)};Dbq=" + dbFileSpec + "\"");
    pw.println("conn.Execute \"ALTER TABLE TEmployee ADD COLUMN NotificationsEnabled YESNO\"");
    pw.println("conn.Close");
    pw.println("Set conn = Nothing");
    pw.close();
    
    // ... and execute it
    Process p = Runtime.getRuntime().exec("CSCRIPT.EXE \"" + vbsFile.getAbsolutePath() + "\"");
    p.waitFor();
    BufferedReader rdr = 
            new BufferedReader(new InputStreamReader(p.getErrorStream()));
    int errorLines = 0;
    String line = rdr.readLine();
    while (line != null) {
        errorLines++;
        System.out.println(line);  // display error line(s), if any
        line = rdr.readLine();
    }
    if (errorLines == 0) {
        System.out.println("The operation completed successfully.");
    }
    

    注意事项:

    1. 如果 Java 应用程序在 32 位 JVM 下运行,上述代码将适用于更新 .mdb 文件。如果您需要更新 .accdb 文件,或者如果 Java 应用程序在 64 位 JVM 下运行,则必须安装适当版本的 Microsoft Access 数据库引擎(32 位或 64 位,与 JVM 相同)你需要使用Driver={Microsoft Access Driver (*.mdb, *.accdb)}

    2. 此解决方法使用 ODBC,但它使用 Java 的 JDBC-ODBC 桥,因此它适用于 Java 8。

    【讨论】:

    • 看起来不错,是的,我的应用程序只能在 Windows 上运行。但我不能确定用户的 PC 上是否会安装 Access Database Engine 来执行脚本。
    【解决方案3】:

    Ucanaccess 不能支持这个非常需要的功能,直到底层的 jackcess 库不支持它。我们(Ucanaccess 团队)可以自动执行上述步骤,但出于同样的原因,我们无法创建 fk,因此在许多情况下,复制原始表的精确副本。在更改表时,我们将失去参照完整性约束......所以,现在,最好什么都不做。很抱歉,目前没有解决方案。

    【讨论】:

    • 太可惜了。除了改变桌子,你的司机很棒。
    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多