【问题标题】:can't make updatable resultset with ucanaccess无法使用 ucanaccess 制作可更新的结果集
【发布时间】:2015-10-14 03:12:50
【问题描述】:

我已经尝试了此处和网络上的大多数示例,但我无法打开 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 制作“新”2002 和 2013 db。即使在做我所做的事情时,Access 也必须保留 '97 类型。因此,我创建了一个新的 2013 虚拟数据库进行测试,UCanAccess 会将结果集报告为可更新。我将尝试在新的数据库文件中重新创建当前数据库的记录数据,看看是否可行。我希望这是问题所在,因为 UCanAccess 不支持 Access97 db 的可更新性。我会让你知道我发现了什么。 谢谢。

【问题讨论】:

  • 可能是 Acces ODBC 驱动程序不支持更新结果集。所以你将不得不使用更新语句。

标签: java ms-access jdbc ucanaccess


【解决方案1】:

我曾使用 2013 Repair 和 Compact 制作“新”2002 和 2013 db。即使在做我所做的事情时,Access 也必须保留 '97 类型。因此,我创建了一个新的 2013 虚拟数据库进行测试,UCanAccess 会将结果集报告为可更新。

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

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

【讨论】:

  • 找到并安装了Access 2003的副本。打开原始db文件,是的,它是Access 97。我将数据库转换为2000格式,不使用SCROLL_SENSITIVE时Ucanaccess会打开并显示& CONCUR_UPDATABLE 在 statement.execute(tablename) 命令中切换。当我将这 2 个添加到开关时,它说它是可更新的,但不会显示在 gui 或命令窗口中。相同的代码,但不同的语句。几乎我昨天晚些时候通过创建新数据库并将数据从旧数据剪切粘贴到新数据。
【解决方案2】:

嗯,在 Germanfest 度过了一个愉快的周末,在 Germanfest 上吃着好喝的啤酒,我终于开始工作了。我决定废弃 MS Access 数据库并将 472 条记录放入 SQLite 数据库中。有了这个,我能够让 PreparedStatements 工作以在 jList 和 JTextArea 中显示记录,在测试应用程序的同一运行中添加新记录并更新现有记录中的几个字段。它既作为命令行运行 GUI 又从 NetBeans 8.0 运行,所以我认为我的问题已经解决。完成几个暑期项目后,我将重新使用 Java 重新编写原始 VB 应用程序。 感谢 Gord,以及在座的每一个人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2020-06-12
    • 1970-01-01
    • 2019-04-17
    • 2014-10-28
    相关资源
    最近更新 更多