如何使用UCanAccess改变表

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

ALTER TABLE TEmployee ADD COLUMN NotificationsEnabled BINARY 

抛出exception:

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

似乎没有更新版本的UCanAccess。

在这种情况下我该怎么办? 我不想使用ODBC驱动程序有很多原因(这里描述 – 在没有ODBC的情况下从Java操作Access数据库 )

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

UCanAccess版本4.0.0及更高版本现在支持ALTER TABLE,例如,

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

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

更新: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 Bridge,因此它将与Java 8一起使用。