私は、異なるアクセスデータベースに接続するjavaツールを書いています。私は次の例外をスローする特定のシナリオを持っています-5592:UCAExc:::4.0.4 precision or scale out of range
例外は、HSQLDBの例外の下に表示されています5592=42592 precision or scale out of range
(私はそれを生成し、誰を知っているので)とに応じて、この答えは、この他の答えは、ここで定義、両方の精度とスケールは、二重の特性を参照してください。
私はMDBにリンクされたテーブルとフロントエンドのデータベースtrhough古いMDB(プリアクセス2003)に接続するためにucanaccessを使用する場合にのみ、例外が発生します。しかし、ucanaccessはいかなる問題なく直接古いMDBに接続することができます。
私は、データベースを変更するAccessでフロントエンドを使用する場合、私はMSは、少なくともアクセス中に問題を回避働いていたと仮定して、それは、罰金に動作します。
私の推測では、私のucanaccess接続は、より現代的なものとしてデータベースを扱うしようとしているフロントエンドのファサードにだまされているということです。しかし、なぜこの例外?
最小の完全な検証可能例:ここで問題に再現する最小限の例、怒らMDBを含むが、以下のjarファイル、関連するデータベースと便利readmeファイルが含まれてgzipでのtarballです。
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が例外を生成している理由はまだ見当もつかないしてきました。
結局のところ、この特定の問題は、すべてのDECIMAL番号、または数値列とは何の関係もありません。それはUCanAccessのバグが原因で発生しJackcessのバグ Access_97テキストフィールドの幅は、その実際の幅の半分として誤報告されます。
Jackcessがそれほど問題のデータベースは、TEXT(1)のように定義されたカラムを持つテーブルを有するgetLengthInUnits
ゼロ(なぜなら整数除算の)報告します。UCanAccessはとHSQLDBのバッキングデータベースにテーブルを作成しよう
CREATE CACHED TABLE DETCAD(SERIE VARCHAR(0), ...
そしてVARCHAR(0)
、「範囲外の精度またはスケール」例外がトリガされます。
jackcess-2.2.2.jarは、問題が修正されます。あなたはそのUCanAccess 4.0.4に同梱jackcess-2.1.11.jarファイルを置き換えるためにそれを使用することができます。