Я пишу инструменты на Java, которые подключаются к различным базам данных доступа.У меня есть особый сценарий, который выдает следующее исключение -5592:UCAExc:::4.0.4 precision or scale out of range
Исключение перечислено в разделе Исключения HSQLDB: 5592=42592 precision or scale out of range
(поэтому я знаю, кто его генерирует) и согласно этот ответ , этот другой ответ , и приведенные здесь определения, как точность, так и масштаб, относятся к характеристикам двойного.
Исключение возникает только тогда, когда я использую ucanaccess для подключения кстарый mdb (pre-access 2003) для базы данных внешнего интерфейса со связанными таблицами с mdb.Тем не менее, ucanaccess может подключиться к старому mdb напрямую без каких-либо проблем.
Если я использую интерфейс в Access для изменения базы данных, он работает нормально, поэтому я предполагаю, что MS обошла проблему впо крайней мере в Access.
Я предполагаю, что мое соединение с Ucanaccess пытается обработать базу данных как более современную, будучи обманутым внешним фасадом.Но почему это исключение?
Минимальный завершенный проверяемый пример: Вот минимальный пример для репликации проблемы , содержащей ошибочную базу данных mdb. Это tar-архив gzip, который включает в себя следующееjar, базы данных и полезный файл readme.
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-нарушитель генерирует исключение.