Ошибка объекта UCanAccess не найдена для запроса, который ссылается на собственный псевдоним столбца

Поскольку мост JDBC:ODBC больше не поддерживается JAVA 8, я пытаюсь заменить его на Ucanaccess V3.0, но столкнулся с некоторой проблемой, см. ниже.

Это код, который я использую для подключения к моей базе данных:

String url = "jdbc:ucanaccess://D:/ADEL/ADEL Local/ADEL_DATA.accdb";
        try
        {
            //Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");

        }
        catch (java.lang.ClassNotFoundException e)
        {
            System.err.print("ClassNotFoundException: ");
            System.err.println(e.getMessage());
            ErrorFile.writeError(Thread.currentThread().getStackTrace()[2].getLineNumber(), e);
        }

Чтобы выполнить запрос, я использовал тот же код, который ранее использовал с JDBC: ODBC.

Connection c = ConnectDB.doConnect();

String selectString = "SELECT DISTINCT [Maintenance input Check Due List].[Interval (Mos)], [Maintenance input Check Due List].InputAircraftHours, [Maintenance input Check Due List].InputAircraftLandings,  [Maintenance input Check Due List].Check, [Maintenance input Check Due List].Title, [Maintenance input Check Due List].InputNumber, [Maintenance input Check Due List].AircraftCurrentTSN, [Maintenance input Check Due List].AircraftCurrentCSN, [Maintenance input Check Due List].Aircraft, [Maintenance input Check Due List].InputDateOUT, [Maintenance input Check Due List].[Interval (Hrs)], [Maintenance input Check Due List].[Interval(Ldgs)], [Maintenance input Check Due List].[NextDueCheckMonth], [Maintenance input Check Due List].NextDueCheckHours, [Maintenance input Check Due List].NextDueCheckLdgs, [Maintenance input Check Due List].RemainCheckMonth, [Maintenance input Check Due List].RemainCheckHours,[Maintenance input Check Due List].RemainCheckLdgs,[Maintenance input Check Due List].InputRepairStation,[Maintenance input Check Due List].InputDescription "
            + "FROM [Maintenance input table] RIGHT JOIN ([Maintenance Schedule Check] RIGHT JOIN   [...]

try
    {
        stmt = c.createStatement();
        ResultSet data = stmt.executeQuery(selectString);
        System.out.print("(AircraftDueList-ln539) " + "requete passed\n");
        while (data.next())
        {[...]}
}
catch (SQLException e)
    {
        ErrorFile.writeError(Thread.currentThread().getStackTrace()[2].getLineNumber(), e);
        System.err.println("SQLException: "
                + e.getMessage());
        e.printStackTrace();
    }

Но этот запрос вызывает исключение:

 SQLException: UCAExc:::3.0.0 user lacks privilege or object not found: NEXTDUECHECKMONTH
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.0 user lacks privilege or object not found: NEXTDUECHECKMONTH
at     net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:211)
at main.AircraftDueList.inspPack(AircraftDueList.java:626)
at main.AircraftDueList.createPDF(AircraftDueList.java:88)
at main.AircraftList.<init>(AircraftList.java:166)
at Launch.main(Launch.java:13)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: NEXTDUECHECKMONTH
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.executeQuery(Unknown Source)
at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:208)
... 4 more
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: NEXTDUECHECKMONTH
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.ExpressionColumn.checkColumnsResolved(Unknown Source)
at org.hsqldb.RangeVariable.resolveRangeTable(Unknown Source)
at org.hsqldb.QuerySpecification.resolveRangeVariables(Unknown Source)
at org.hsqldb.QuerySpecification.resolveReferences(Unknown Source)
at org.hsqldb.ParserDQL.XreadJoinedTableAsSubqueryOrNull(Unknown Source)
at org.hsqldb.ParserDQL.readTableOrSubquery(Unknown Source)
at org.hsqldb.ParserDQL.XreadTableReference(Unknown Source)
at org.hsqldb.ParserDQL.XreadFromClause(Unknown Source)
at org.hsqldb.ParserDQL.XreadTableExpression(Unknown Source)
at org.hsqldb.ParserDQL.XreadQuerySpecification(Unknown Source)
at org.hsqldb.ParserDQL.XreadSimpleTable(Unknown Source)
at org.hsqldb.ParserDQL.XreadQueryPrimary(Unknown Source)
at org.hsqldb.ParserDQL.XreadQueryTerm(Unknown Source)
at org.hsqldb.ParserDQL.XreadQueryExpressionBody(Unknown Source)
at org.hsqldb.ParserDQL.XreadQueryExpression(Unknown Source)
at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
at org.hsqldb.Session.executeDirectStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 7 more

Эти таблицы вызовов запросов и сохраненный запрос в доступе, «NEXTDUECHECKMONTH» — это поле псевдонима из сохраненного запроса в доступе с именем «[Проверочный список входных данных для обслуживания]».

В сохраненном запросе [Контрольный список ввода техобслуживания] поле NEXTDUECHECKMONTH имеет следующую структуру:

IIf([Interval (Mos)] Is Null,Null,DateAdd("m",[Interval (Mos)],[InputDateOUT])) AS NextDueCheckMonth

Кто-то успешно сталкивался с такой проблемой?

PS: все мои запросы успешно выполняются в ACCESS


person Kromen    schedule 19.08.2015    source источник
comment
Пожалуйста, отредактируйте свой вопрос, чтобы показать нам код Java для минимальный воспроизводимый пример, выдающий ошибку. Мне не удалось воссоздать вашу проблему, используя простой оператор SELECT для сохраненного запроса.   -  person Gord Thompson    schedule 19.08.2015
comment
Я пытаюсь улучшить свой пост, я думаю, что прошлый запрос здесь не очень полезен, потому что это большой и запутанный запрос.   -  person Kromen    schedule 19.08.2015


Ответы (2)


Как упоминалось в комментарии к другому ответу, проблема заключалась в том, что в запросе было предложение WHERE, пытающееся сослаться на псевдоним столбца, который был определен в том же запросе. Это не работает в UCanAccess, например,

sql = 
        "SELECT Date1 AS DateAlias " +
        "FROM DateTest " +
        "WHERE DateAlias IS NOT NULL";

бросает

net.ucanaccess.jdbc.UcanaccessSQLException: у пользователя UCAExc:::3.0.0 отсутствуют привилегии или объект не найден: DATEALIAS

но это также не работает в самом Access, так как Access не распознает псевдоним как имя столбца и поэтому запрашивает у нас значение параметра:

ParameterPrompt.png

Одним из обходных путей для этой проблемы может быть инкапсуляция исходного запроса в качестве подзапроса, чтобы внешний запрос мог использовать псевдоним:

sql = 
        "SELECT DateAlias " +
        "FROM (SELECT Date1 AS DateAlias FROM DateTest) " +
        "WHERE DateAlias IS NOT NULL";
person Gord Thompson    schedule 21.08.2015

Я обнаружил проблему: я пытаюсь создать псевдоним в своем запросе и использовать его в этом запросе; Ucanaccess это не нравится.

person Kromen    schedule 19.08.2015
comment
Вы говорите о псевдониме таблицы в предложении FROM вашего запроса, например, ... FROM ... RIGHT JOIN [Maintenance input Check Due List] AS micdl ...? Если это так, вам также необходимо использовать псевдоним таблицы (а не имя таблицы/запроса) в списке столбцов (SELECT...). - person Gord Thompson; 19.08.2015
comment
Я говорю о псевдониме строки: в этом запросе у меня есть IIf([Interval (Mos)] Is Null,Null,DateAdd("m",[Interval (Mos)],[InputDateOUT])) AS NextDueCheckMonth, но в некоторых строках после есть условие, подобное WHERE NextDueCheckMonth = ..., чтобы решить эту проблему, я заменяю его на WHERE IIf([Interval (Mos)] Is Null,Null,DateAdd("m",[Interval (Mos)],[InputDateOUT])) = ... - person Kromen; 20.08.2015