gpt4 book ai didi

java - UCanAccess加载数据库时HSQLDB "precision or scale out of range"错误

转载 作者:行者123 更新时间:2023-12-02 14:53:57 25 4
gpt4 key购买 nike

我正在用 java 编写连接到不同 Access 数据库的工具。我有一个特定的场景会抛出以下异常 -5592:UCAExc:::4.0.4 precision or scale out of range

异常列在 HSQLDB 异常下:5592=42592 精度或比例超出范围(所以我知道是谁生成的)并根据 this answer , this other answer ,这里的定义,精度和小数位都指的是 double 的特性。

仅当我使用 ucanaccess 通过前端数据库连接到旧的 mdb(pre-access 2003)时才会发生异常,该前端数据库具有指向 mdb 的链接表。但是,ucanaccess 可以直接连接到旧的 mdb,没有任何问题。

如果我使用 Access 中的前端修改数据库,它工作正常,所以我假设 MS 至少在 Access 中解决了这个问题。

我的猜测是我的 ucanaccess 连接试图将数据库视为更现代的数据库,被前端外观所愚弄。但是为什么会出现这个异常呢?

最小的完整可验证示例:这是一个 minimal example to replicate the issue包含有问题的 mdb 的是一个 gzip tarball,其中包括以下 jar、涉及的数据库和一个有用的自述文件。

public static void main(String[] args) {
String query= "SELECT nombre FROM encemp where cveemp=1";
try {
Connection frontEndToAccdb = DriverManager.getConnection("jdbc:ucanaccess://FrontEndPointingToAccdb.accdb");
PreparedStatement statement = frontEndToAccdb.prepareStatement(query);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) System.out.println("Querying Accdb BackEnd through front end OK");
Connection directConnectionToMdb = DriverManager.getConnection("jdbc:ucanaccess://X:/BackendOld.mdb");
statement = directConnectionToMdb.prepareStatement(query);
resultSet = statement.executeQuery();
if (resultSet.next()) System.out.println("Querying mdb BackEnd directly OK");
//This is the one that will generate the exception
Connection frontEndToMdb = DriverManager.getConnection("jdbc:ucanaccess://FrontEndPointingToMdb.accdb");
statement = frontEndToMdb.prepareStatement(query);
resultSet = statement.executeQuery();
if (resultSet.next()) System.out.println("Querying mdb BackEnd through front end OK");
} catch (SQLException ex) {
System.out.printf("%s:%s\n", ex.getErrorCode(),ex.getMessage());
}

我一直在努力浏览 DatabaseMetaData,但仍然不知道为什么有问题的 mdb 会生成异常。

最佳答案

  1. 我冒昧地更新了您的标题。希望新的措辞能表达您的意思。

  2. 请执行以下操作:

    a) 直接查询有问题的列定义。例如:

    // GetMetaData():
    try (ResultSet rsMD = connChem.getMetaData().getTables(null, null, null, null)) {
    while (rsMD.next()) {
    String tblName = rsMD.getString("TABLE_NAME");
    System.out.println(tblName);
    }
    }

    ……或者……

    -- SQL "select" from MSysObjects
    SELECT Name
    FROM MSysObjects
    WHERE Left([Name],1)<>"~"
    AND Left([Name],4)<>"MSys"
    AND Type In (1,4,6)
    ORDER BY Name;

    b) 将 DB 列定义(上面)与相应的 Hibernate 类成员(例如,在您最喜欢的 IDE 中)进行比较。

    c) 比较“旧”.mdb(“有效”)与"new".accdb 的结果。

  3. 请用结果更新您的帖子。

关于java - UCanAccess加载数据库时HSQLDB "precision or scale out of range"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53950300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com