【发布时间】: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