如何使用 UCanAccess 更改 TABLE
How to ALTER TABLE using UCanAccess
我正在使用 UCanAccess JDBC-驱动程序(版本 3.0.3.1)连接到 mdb 文件。我需要将列添加到现有 table。问题是语句
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)
我看到的唯一解决方案是创建 table 的副本(例如 TEmployeeBackup)以保存数据,然后删除并使用新字段重新创建原始 table,然后移动数据从 TEmployeeBackup 返回到 TEmployee。但是这个解决方案对我来说似乎很糟糕。
Ucanaccess 无法支持这个非常需要的功能,直到底层的 jackcess 库不支持它。我们(Ucanaccess 团队)可以自动执行上述步骤,但出于同样的原因,我们无法创建 fk,因此在许多情况下,只能复制原件的精确副本 table。在更改 table 时,我们将失去参照完整性约束...因此,目前最好什么都不做。非常抱歉,目前没有解决方案。
更新:2017 年 1 月
UCanAccess 现在支持 ALTER TABLE。请参阅我对这个问题的其他回答。
(以前的过时答案。)
如果您的 Java 应用在 Windows 下 运行ning,那么您可以使用以下解决方法。它创建了一个小的 VBScript 并调用 CSCRIPT.EXE 到 运行 it
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 下 运行ning 那么适当版本的 Microsoft Access 数据库引擎(32 位或 64 位,相同因为 JVM) 必须安装并且你需要使用 Driver={Microsoft Access Driver (*.mdb, *.accdb)}
.
此解决方法使用 ODBC,但它 不 使用 Java 的 JDBC-ODBC Bridge,因此它适用于Java8.
UCanAccess 4.0.0 及以上版本现在支持 ALTER TABLE,例如,
Statement stmt = conn.createStatement();
stmt.execute("ALTER TABLE TableName ADD COLUMN newCol LONG");
我正在使用 UCanAccess JDBC-驱动程序(版本 3.0.3.1)连接到 mdb 文件。我需要将列添加到现有 table。问题是语句
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)
我看到的唯一解决方案是创建 table 的副本(例如 TEmployeeBackup)以保存数据,然后删除并使用新字段重新创建原始 table,然后移动数据从 TEmployeeBackup 返回到 TEmployee。但是这个解决方案对我来说似乎很糟糕。
Ucanaccess 无法支持这个非常需要的功能,直到底层的 jackcess 库不支持它。我们(Ucanaccess 团队)可以自动执行上述步骤,但出于同样的原因,我们无法创建 fk,因此在许多情况下,只能复制原件的精确副本 table。在更改 table 时,我们将失去参照完整性约束...因此,目前最好什么都不做。非常抱歉,目前没有解决方案。
更新:2017 年 1 月
UCanAccess 现在支持 ALTER TABLE。请参阅我对这个问题的其他回答。
(以前的过时答案。)
如果您的 Java 应用在 Windows 下 运行ning,那么您可以使用以下解决方法。它创建了一个小的 VBScript 并调用 CSCRIPT.EXE 到 运行 it
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 下 运行ning 那么适当版本的 Microsoft Access 数据库引擎(32 位或 64 位,相同因为 JVM) 必须安装并且你需要使用
Driver={Microsoft Access Driver (*.mdb, *.accdb)}
.此解决方法使用 ODBC,但它 不 使用 Java 的 JDBC-ODBC Bridge,因此它适用于Java8.
UCanAccess 4.0.0 及以上版本现在支持 ALTER TABLE,例如,
Statement stmt = conn.createStatement();
stmt.execute("ALTER TABLE TableName ADD COLUMN newCol LONG");