JdbcOdbcPreparedStatement.setLong抛出java.sql.SQLException:未实现可选功能

Gle*_*bus 0 java jdbc

我准备好的声明中有一个长号问题.这是代码:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

这是怎么造成的,我该如何解决?

Ste*_*n C 5

根据我的理解,如果ODBC驱动程序的功能与JDBC-ODBC桥的期望不匹配,通常会发生"未实现的可选功能".在这种情况下,看起来setLong在Access端使用的调用和有效数据类型之间存在不匹配.

我的建议是检查您使用的MS Access/ODBC类型是否真正兼容long; 即所有理论上可表示的值都可以表示为Java long值.如果更改架构不起作用,那么最好的办法是将数字视为一个intString来自Java/JDBC端.

(请记住,您使用的MS Access不是"真正的"数据库,并且MS Access ODBC驱动程序可能具有功能限制.还需要检查新版本的驱动程序和桥接库.)