JdbcOdbcPreparedStatement.setLong throws java.sql.SQLException: дополнительная функция не реализована - PullRequest
0 голосов
/ 04 декабря 2011

У меня проблема с длинными числами в подготовленном утверждении. Вот код:

String removeCltQry = "DELETE * FROM Clients WHERE client_id = ?";
long client_id = 10;
Connection con = null;
PreparedStatement pstm = null;

try {
    con = DBMngerST.instance().getDBCon();
    pstm = con.prepareStatement(removeCltQry);
    pstm.setLong(1, client_id);
    pstm.executeUpdate();
    pstm.close();
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    if (con != null) {
        try {
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Вот трассировка стека:

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLBindInParameterBigint(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setLong(Unknown Source)
at testingPack.test5.main(test5.java:25)

Как это вызвано и как я могу решить?

Ответы [ 3 ]

5 голосов
/ 04 декабря 2011

Насколько я понимаю, «дополнительная функция не реализована» обычно происходит, если существует несоответствие между возможностями драйвера ODBC и ожиданиями моста JDBC-ODBC.В этом случае, похоже, что существует несоответствие между вызовом setLong и эффективным типом данных, который используется на стороне доступа.

Мой совет - проверить, что MS Access / ODBC вводит васиспользуете действительно совместим с long;то есть что все теоретически представимые значения представимы в виде значений Java long.Если изменение схемы не работает, тогда лучше всего рассматривать число как int или String со стороны Java / JDBC.

(Имейте в виду, что вы используете MS Accessкоторая не является «реальной» базой данных, и что драйверы ODBC MS Access могут иметь функциональные ограничения. Также стоит проверить наличие новых версий драйверов и библиотек мостов.)

0 голосов
/ 04 декабря 2011

Я хочу знать, какая у вас версия Java.Кажется, что это исключение вызвано отсутствием реализации setLong в классе PrepareStatement.

Более того, это может быть ошибка, вызванная старой реализацией.Вы можете увидеть некоторые комментарии в методе setLong, просто обратитесь сюда введите описание ссылки здесь .

0 голосов
/ 04 декабря 2011

Попробуйте ввести идентификатор прямо в запросе, что-то вроде этого.

String removeCltQry = "DELETE * FROM Clients WHERE client_id = 10";

long client_id = 10;

Connection con = null;
PreparedStatement pstm = null;

try {
con = DBMngerST.instance().getDBCon();
pstm = con.prepareStatement(removeCltQry);

//pstm.setLong(1, client_id);
pstm.executeUpdate();
pstm.close();


} catch (SQLException e) {
  e.printStackTrace();
} finally {
  if (con != null) {
    try {
       con.close();
    } catch (SQLException e) {
       e.printStackTrace();
    }
   }
 }// finally
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...