我使用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。但这个解决方案对我来说似乎很糟糕。
答案 0 :(得分:2)
Ucanaccess不能支持这个非常请求的功能,直到底层的jackcess库不支持它。我们(Ucanaccess团队)可以自动执行上述步骤,但出于同样的原因,我们无法创建fk,因此,在许多情况下,会重现原始表的精确副本。在改变表格时,我们会失去参照完整性约束......所以,现在,最好什么都不做。很抱歉,目前没有解决方案。
答案 1 :(得分:1)
UCanAccess版本4.0.0及更高版本现在支持ALTER TABLE,例如,
Statement stmt = conn.createStatement();
stmt.execute("ALTER TABLE TableName ADD COLUMN newCol LONG");
答案 2 :(得分:0)
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一起使用。