首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用UCanAccess修改表

如何使用UCanAccess修改表
EN

Stack Overflow用户
提问于 2016-02-07 23:18:55
回答 3查看 1.5K关注 0票数 2

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

代码语言:javascript
复制
ALTER TABLE TEmployee ADD COLUMN NotificationsEnabled BINARY

抛出异常:

代码语言:javascript
复制
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。但这个解决方案对我来说很糟糕。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-17 01:58:53

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

代码语言:javascript
复制
Statement stmt = conn.createStatement();
stmt.execute("ALTER TABLE TableName ADD COLUMN newCol LONG");
票数 3
EN

Stack Overflow用户

发布于 2016-02-08 00:09:11

Ucanaccess无法支持这个被请求的特性,除非底层的jackcess库不支持它。我们(Ucanaccess )可以自动执行上述步骤,但出于同样的原因,我们无法创建fk,因此,在许多情况下,可以复制原始表的精确副本。在更改表时,我们将失去引用完整性约束.所以,就目前而言,最好什么也不做。很抱歉,目前还没有解决办法。

票数 2
EN

Stack Overflow用户

发布于 2016-02-08 14:45:27

最新情况:2017年1月

UCanAccess现在支持ALTER。请看我对这个问题的另一个答案。

(以前的答案已经过时。)

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

代码语言:javascript
复制
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下运行,那么必须安装适当版本的微软Access数据库引擎(32位或64位,与JVM相同),您将需要使用Driver={Microsoft Access Driver (*.mdb, *.accdb)}
  2. 这个解决方案使用ODBC,但它不使用Java的JDBC桥,因此它将与Java 8一起工作。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35260429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档