java - 无法使用 ucanaccess 创建可更新的结果集

标签 java ms-access jdbc ucanaccess

我已经尝试了此处和网络上的大部分示例,但我无法打开 MS Access 数据库(2002 或 2013)并使用 UCanAccess 获取可更新的结果集。使用 JDBC:ODBC 驱动程序/连接/工作的相同代码。我已经编写了简短的测试代码来检查 concur_updatable 来检查这个,所以我一定遗漏了一些东西。我在 Win7 机器上使用 JDK 1.7。我还有另一台机器,结果相同。 这有效:

/*
class jdbc, for testing jdbc:odbc CONCUR_UPDATABLE.
*/

import java.sql.*;

public class jdbc {

private static String dbFQN;

public static void main(String[] args) {

try {
dbFQN = ("C:\\phil\\programming\\kpjl2002.mdb");
String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + dbFQN;
System.out.println("Loading database: " + database);
Connection conn = DriverManager.getConnection(database, "", "");
Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
// Fetch records from table
String selTable = "SELECT * FROM " + "tblLibrary" + " ORDER BY Artist, Cat, Cart";
s.execute(selTable);
ResultSet rs = s.getResultSet();

int concurrency = rs.getConcurrency();
if(concurrency == ResultSet.CONCUR_UPDATABLE)
{
System.out.println("rs is updatable");
} else {
System.out.println("rs Not updatable");
}

s.close();
conn.close();
} //close try
catch (Exception ex) {
ex.printStackTrace();
}   //close catch
}   //close main method

}   //close dbAccess class

输出是 rs 是可更新的。

这行不通:

/*
class ucan, for testing ucanaccess CONCUR_UPDATABLE.
C:\jdk1.7.0_79\jre\lib\ext\ucanaccess-2.0.9.5.jar
C:\jdk1.7.0_79\jre\lib\ext\hsqldb.jar
C:\jdk1.7.0_79\jre\lib\ext\jackcess-2.1.0.jar
C:\jdk1.7.0_79\jre\lib\ext\commons-lang-2.6.jar
C:\jdk1.7.0_79\jre\lib\ext\commons-logging-1.1.1.jar

also present:
C:\jdk1.7.0_79\jre\lib\ext\commons-logging-1.2.jar
C:\jdk1.7.0_79\jre\lib\ext\commons-lang3-3.4.jar
*/

import java.sql.*;

public class ucan {

private static String dbFQN;

public static void main(String[] args) {

try {
dbFQN = ("C:\\phil\\programming\\kpjl2002.mdb");
String database = "jdbc:ucanaccess://" + dbFQN;
System.out.println("Loading database: " + database);
Connection conn = DriverManager.getConnection(database, "", "");
Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
// Fetch records from table
String selTable = "SELECT * FROM " + "tblLibrary" + " ORDER BY Artist, Cat, Cart";
s.execute(selTable);
ResultSet rs = s.getResultSet();

int concurrency = rs.getConcurrency();
if(concurrency == ResultSet.CONCUR_UPDATABLE)
{
System.out.println("rs is updatable");
} else {
System.out.println("rs Not updatable");
}

s.close();
conn.close();
} //close try
catch (Exception ex) {
ex.printStackTrace();
}   //close catch
}   //close main method

}   //close dbAccess class

输出是 rs 不可更新。所以我无法在结果集中更新或插入行。

发布的代码是一个较大项目的操作部分,UCanAccess 可以读取表格并将内容放入 jList 和 jTextarea 中,并进行格式化。当我开始编写代码来更新或添加新记录时,我遇到了问题。

如果这有点长,我深表歉意。 有人知道我遗漏了什么或做错了什么吗?

顺便说一句,这是我最喜欢的 2 个网站之一,提供优秀、可用的 Java 答案。

更新: 从老同事那里得到一个想法,原始数据库可能是从原始 Access97 数据库复制的。到 2000 分贝。我曾使用 2013 Repair and Compact 制作"new"2002 和 2013 分贝。即使在执行我所做的操作时,Access 也必须保留 '97 类型。因此,我创建了一个新的 2013 虚拟数据库进行测试,UCanAccess 会将结果集报告为可更新。我将尝试在新的数据库文件中重新创建当前数据库的记录数据,看看是否可行。我希望这是问题所在,因为 UCanAccess 不支持 Access97 数据库的可更新性。我会让你知道我发现了什么。 谢谢。

最佳答案

I had used 2013 Repair and Compact to make "new" 2002 and 2013 db's. Access must retain '97 type even when doing what I did. So, I created a new 2013 dummy db to test, and UCanAccess will report resultset as updatable.

Access 中的“压缩和修复数据库”功能不会更改数据库文件版本。如果您有(您怀疑是)旧版本的数据库文件,那么您应该使用“文件 > 保存和发布”* 下的“数据库另存为”功能将数据库文件转换为较新的版本。

*(...至少在 Access 2010 中是这样。)

关于java - 无法使用 ucanaccess 创建可更新的结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31593718/

相关文章:

excel - 如何插入嵌入图片?

java - Oracle clob 上的 union\minus 时发生问题

java - 使用 JDBC 在 PostgreSQL 中插入点(几何)值

java jdbc mysql无法使用密码连接

java - ArrayList#size() 的奇怪返回

java - Spring ClassCastException 与通用表单 Bean 类

JavaScript 未在 HtmlUnit 中正确执行

java - 有没有办法改进这个要求?

database - 哪个更影响 Access 数据库性能 : Thousands of tables or Millions of records?

ms-access - MSysQueries 中的数据是什么意思?