39

在验证了我选择的选择组合框后,我无法将其插入我的数据库中。Tomcat给出以下错误:

java.sql.SQLException:参数索引超出范围(1 > 参数个数,即 0)。

这是如何引起的,我该如何解决?

4

2 回答 2

82

当您调用 上的任何setXxx()方法时,您将收到此错误PreparedStatement,而 SQL 查询字符串没有任何占位符?

例如这是错误的:

String sql = "INSERT INTO tablename (col1, col2, col3) VALUES (val1, val2, val3)";
// ...

preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, val1); // Fail.
preparedStatement.setString(2, val2);
preparedStatement.setString(3, val3);

您需要相应地修复 SQL 查询字符串以指定占位符。

String sql = "INSERT INTO tablename (col1, col2, col3) VALUES (?, ?, ?)";
// ...

preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, val1);
preparedStatement.setString(2, val2);
preparedStatement.setString(3, val3);

请注意参数索引以开头,1并且您不需要这样引用这些占位符:

String sql = "INSERT INTO tablename (col1, col2, col3) VALUES ('?', '?', '?')";

否则,您仍然会得到相同的异常,因为 SQL 解析器会将它们解释为实际的字符串值,因此无法再找到占位符。

也可以看看:

于 2012-06-05T13:59:42.600 回答
14

这是 jdbc 驱动程序版本的问题。我在使用 mysql-connector-java-commercial-5.0.3-bin.jar 时遇到了这个问题,但是当我更改为更高的驱动程序版本 mysql-connector-java-5.1.22.jar 时,问题得到了解决。

于 2012-10-19T06:21:27.477 回答