如何使用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."); }
笔记:
-
如果Java应用程序在32位JVM下运行,则上述代码将用于更新.mdb文件。 如果需要更新.accdb文件或Java应用程序在64位JVM下运行,则必须安装相应版本的Microsoft Access数据库引擎(32位或64位,与JVM相同)并且您将需要使用
Driver={Microsoft Access Driver (*.mdb, *.accdb)}
。 -
此解决方法使用ODBC,但它不使用Java的JDBC-ODBC Bridge,因此它将与Java 8一起使用。