【问题标题】:java.sql.SQLException Parameter index out of range (1 > number of parameters, which is 0) [closed]java.sql.SQLException 参数索引超出范围(1>参数个数,即0)[关闭]
【发布时间】:2012-06-05 11:04:20
【问题描述】:

在验证了我选择的选择组合框后,我无法将其插入我的数据库。 Tomcat 报错:

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

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

【问题讨论】:

  • 你能用sql语句和错误堆栈跟踪发布你的jsp代码吗?
  • 这意味着您正在尝试在不包含任何参数的查询上设置参数。堆栈跟踪准确地告诉您在哪个文件的哪一行引发了异常。此外,您应该接受之前问题的答案。
  • @yatin:您需要按照this answer 中的说明接受它们。
  • 我无法解决这个错误..所以不接受
  • @yatin:JB Nizet 指的是你之前的问题。

标签: java mysql jdbc


【解决方案1】:

当您在PreparedStatement 上调用任何setXxx() 方法时,您将收到此错误,而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 解析器会将它们解释为实际的字符串值,因此无法再找到占位符。

另见:

【讨论】:

  • 在我的例子中,这是因为我使用了 JDBCTemplate 而不是 NamedParameterJDBCTemplate
  • 我收到相同的错误 INSERT INTO Bslash2 (`end\`) values(?) 由于我的列名之一以反斜杠结尾??我不知道为什么
【解决方案2】:

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

【讨论】:

  • 在 mysql-connector-java-5.0.8-bin.jar 中观察到类似问题
  • 谢谢,即使在 spring boot 2.3.0 上我也遇到了这个问题,升级到 2.3.1,它工作得很好。
猜你喜欢
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多