打开连接时的 UCanAccess 异常 - 引用的列上不存在 UNIQUE 约束



我正在尝试使用ucanaccess在我的java maven项目中创建一个非常简单的连接(.accdb(。该数据库是一个外部数据库,我只需要读取一些表的内容即可执行迁移任务。我不想也不应该修改表或在数据库中写入任何内容。 我使用的java代码非常简单:

try (Connection connection = DriverManager.getConnection(databaseURL);) {
} catch (SQLException ex) { ex.printStackTrace(); }

但是连接在开始时就失败,出现以下异常:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::5.0.0 a UNIQUE constraint does not exist on referenced columns: T1 in statement [ALTER TABLE T2 ADD CONSTRAINT "T2{2EB41B92-C3AB-4A64-A53C-B83095D76202}" FOREIGN KEY  (C2)  REFERENCES T1 (C1) ]
at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:231)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:251)
at myproject.Application.main(Application.java:42)
Caused by: java.sql.SQLSyntaxErrorException: a UNIQUE constraint does not exist on referenced columns: T1 in statement [ALTER TABLE T2 ADD CONSTRAINT "T2{2EB41B92-C3AB-4A64-A53C-B83095D76202}" FOREIGN KEY  (C2)  REFERENCES T1 (C1) ]
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source)
at net.ucanaccess.converters.LoadJet.exec(LoadJet.java:1510)
at net.ucanaccess.converters.LoadJet.access$000(LoadJet.java:74)
at net.ucanaccess.converters.LoadJet$TablesLoader.loadForeignKey(LoadJet.java:695)
at net.ucanaccess.converters.LoadJet$TablesLoader.loadTableFKs(LoadJet.java:918)
at net.ucanaccess.converters.LoadJet$TablesLoader.recreate(LoadJet.java:807)
at net.ucanaccess.converters.LoadJet$TablesLoader.loadTableData(LoadJet.java:877)
at net.ucanaccess.converters.LoadJet$TablesLoader.loadTableData(LoadJet.java:871)
at net.ucanaccess.converters.LoadJet$TablesLoader.loadTableData(LoadJet.java:837)
at net.ucanaccess.converters.LoadJet$TablesLoader.loadTablesData(LoadJet.java:1029)
at net.ucanaccess.converters.LoadJet$TablesLoader.loadTables(LoadJet.java:1077)
at net.ucanaccess.converters.LoadJet$TablesLoader.access$3200(LoadJet.java:264)
at net.ucanaccess.converters.LoadJet.loadDB(LoadJet.java:1579)
at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:218)
... 3 more
Caused by: org.hsqldb.HsqlException: a UNIQUE constraint does not exist on referenced columns: T1
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.TableWorks.checkCreateForeignKey(Unknown Source)
at org.hsqldb.TableWorks.addForeignKey(Unknown Source)
at org.hsqldb.StatementSchema.getResult(Unknown Source)
at org.hsqldb.StatementSchema.execute(Unknown Source)
at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
at org.hsqldb.Session.executeDirectStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 18 more

我试图使我的连接"只读",这样它就不会检查此约束,也不会引发异常。但我没有任何成功。

try (Connection connection = DriverManager.getConnection(databaseURL + ";readonly=true");) {
} catch (SQLException ex) { ex.printStackTrace(); } 

有没有办法在创建用于读取某些表的连接时关闭此约束检查?

我无法发布数据库以重现该问题!因为它是一个非常复杂的数据库,有很多表和关系,它不属于我。由于《通用数据保护条例》,我不允许共享它(即使没有数据(。

此外,我不想更改数据库中的任何内容,因此我想关闭约束检查,以便能够连接到数据库并读取某些表的行。

最后,我复制了数据库并删除了表之间的所有关系,然后代码可以连接到数据库, 但: 连接需要 30 分钟!!!因此,即使每次我想运行代码时,我都会设法从数据库中复制并删除所有表之间的所有关系(这在我的任务中实际上是不可能的(,我应该等待 30 分钟打开连接!! 我觉得这真的很荒谬,当某些约束不满足时,不可能关闭约束检查并打开连接以读取数据!!

但无论如何,在最后(经过两天的搜索!我为我的工作找到了解决方案。我不使用这种类型的驱动程序管理器的任何类型的连接:

Connection connection = DriverManager.getConnection(databaseURL)

相反,我使用数据库构建器来打开我的数据库并获取表并读取行! 对于其他任何有相同问题并且只想连接到MS-Access数据库以读取某些数据而不更改任何内容的人,我建议这样做。这是非常容易和快速的!

String fileName = "my_database.accdb";
File file = new File(fileName);
Database db = null;
DatabaseBuilder databaseBuilder = new DatabaseBuilder(file);
try {
db = databaseBuilder.open();
} catch(IOException e) {
e.printStackTrace();
}
Table myTable = db.getTable("myAccessTableName");
for(Row row : myTable) {
String firstName = row.getString("first_name");
String lastName = row.getString("last_name");
}

数据库、数据库生成器、行和表来自"jackcess"。因此,需要这些导入:

import com.healthmarketscience.jackcess.Database;
import com.healthmarketscience.jackcess.DatabaseBuilder;
import com.healthmarketscience.jackcess.Row;
import com.healthmarketscience.jackcess.Table;

更多使用这种方式的例子可以在这里找到: Java 代码示例 在这里: 统一访问

最新更新