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

时间:2011-12-04 01:52:13

标签: 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();
        }
    }
}

这是堆栈跟踪:

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 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

我想知道Java的版本是什么。似乎这个异常是由PrepareStatement类中缺少setLong的实现引起的。

此外,它可能是由旧实现引起的错误。 您可以在setLong的方法中看到一些注释,只需参考此处enter link description here

答案 2 :(得分:-3)

尝试将id放在查询中,就像这样。

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