UcanaccessSQLException: неожиданный токен, когда имя столбца содержит апостроф

Я конвертирую существующую программу из JDBC-ODBC Bridge в UCanAccess. Он работает уже много лет. Программа Java записывает в файл MDB. После преобразования одна команда Insert перестала работать.
Она выдает "net.ucanaccess.jdbc.UcanaccessSQLException: неожиданный токен: [".

После некоторых экспериментов я определил, что проблема вызвана тремя столбцами, имена которых содержат апострофы. Пример: [Запланированная дата размещения заказа]. Судя по всему, мосту JDBC-ODBC все равно, а UCanAccess — нет.

Я несколько застрял в существующей структуре MDB, иначе я бы просто переименовал поля. Но невозможно сказать, сколько нижестоящих отчетов может быть повреждено, если я это сделаю. MDB используется для отчетов Ad Hoc.

Вот упрощенная версия задачи SQL Select. Выдает ту же ошибку, что и Insert.

    String cJD = "net.ucanaccess.jdbc.UcanaccessDriver";
    String cS = "jdbc:ucanaccess://C:/MosAll/mosall.mdb";
    String uid = "";
    String pw = "";
    String sql4 =   "select [Sched'd PO Place Date] from [Tier 1] ";

    Class.forName(cJD);
    Connection con = DriverManager.getConnection(cS, uid, pw);
    PreparedStatement pstmt4;
    pstmt4 = con.prepareStatement(sql4);
    pstmt4.execute();

Есть ли способ «избежать» апострофов или перенастроить ucanaccess, чтобы драйвер мог их выполнять?


person Dave Martin    schedule 25.02.2015    source источник


Ответы (2)


Эта проблема была исправлена ​​в UCanAccess 2.0.9.4.


Предыдущий ответ:

Мне удалось воссоздать проблему с UCanAccess версии 2.0.9.3.

select [Sched'd PO Place Date] ...

терпит неудачу, но пока просто опуская '

select [Schedd PO Place Date] ...

работает нормально. Интересно, что вместо квадратных скобок используются обратные кавычки.

select `Sched'd PO Place Date` ...

также создает исключение

net.ucanaccess.jdbc.UcanaccessSQLException: неожиданный токен: [

Если повезет, это будет исправлено в будущем выпуске UCanAccess.

person Gord Thompson    schedule 26.02.2015
comment
Да, это просто ошибка парсера, нормализующего SQL. С использованием внутреннего имени столбца (имя без апострофа) все работает нормально, но я исправлю это в следующей версии. Обратные кавычки обрабатываются как квадратные скобки: они также поддерживаются доступом и были введены в ucanaccess главным образом для реализации метода DatabaseMetaData.getIdentifierQuoteString, полезного для таких инструментов, как openoffice или libreoffice. – - person jamadei; 26.02.2015
comment
Удаление апострофа работает, и это достойный обходной путь. Благодарю вас! Я бы никогда не подумал попробовать это. - person Dave Martin; 26.02.2015
comment
Единственное, что осталось, это то, что я получаю это сообщение: - неподдерживаемый тип данных BINARY для индекса, что делает его доступным только для чтения. Есть идеи, как это устранить? Я могу опубликовать это как отдельный вопрос, если хотите. Я видел несколько ответов на этот же вопрос в сети, но я не мог конкретно связать ответы с тем, что я делаю. - person Dave Martin; 26.02.2015
comment
Это предупреждение о домкрате, поэтому я думаю, что они могут помочь вам намного лучше, чем я. - person jamadei; 27.02.2015
comment
Спасибо вам всем. Вы были очень полезны! Я задам последний вопрос Джеккессу. - person Dave Martin; 05.03.2015

пробовали ли вы таблицу, имена столбцов между `` (они не апостроф, а тот, что рядом с ~), \' может работать, и, наконец, стандартный способ JDBC - определить escape-символ в конце запроса:

String sql4 = "select [Sched\'d PO Place Date] from [Tier 1] { escape '\'}"

Вы также можете попробовать вариант выше с ``вместо []

Наконец, ваш последний ресурс — «выберите *» и самостоятельно извлеките нужный столбец.

person Zielu    schedule 26.02.2015
comment
Это выдает ошибку: net.ucanaccess.jdbc.UcanaccessSQLException: неожиданный токен: - person Dave Martin; 26.02.2015