我在准备好的声明中遇到长号问题。这是代码:
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)
这是如何引起的?如何解决?
答案 0 :(得分:5)
根据我的理解,如果ODBC驱动程序的功能与JDBC-ODBC桥的期望不匹配,通常会发生“未实现的可选功能”。在这种情况下,看起来setLong
调用与访问端正在使用的有效数据类型不匹配。
我的建议是检查您使用的MS Access / ODBC类型是否与long
真正兼容;即,所有理论上可表示的值都可表示为Java long
值。如果更改架构不起作用,那么最好的办法是将数字从Java / JDBC端视为int
或String
。
(请记住,您使用的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