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

时间:2015-07-23 17:00:05

标签: java ms-access jdbc ucanaccess

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

2 个答案:

答案 0 :(得分:1)

  

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

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

* (...至少是Access 2010中的位置。)

答案 1 :(得分:0)

好吧,经过一个愉快的周末,在德国节日吃了小鬼,喝了好啤酒,我终于把事情搞定了。我决定废弃MS Access数据库并将472条记录放在SQLite数据库中。有了这个,我能够让PreparedStatements工作以在jList和JTextArea中显示记录,添加新记录并在测试应用程序的同一运行中更新现有记录中的几个字段。它既作为命令行运行GUI又来自NetBeans 8.0,所以我认为我的问题已经解决了。经过几个夏季项目完成后,我将重新使用Java重写原始的VB应用程序。 感谢戈德,以及所有人。