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

validationselectcombobox后,我已经select我无法插入我的数据库。 Tomcat提供以下错误

java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). 

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

当您调用PreparedStatement上的任何setXxx()方法时,您将遇到此错误,而SQL查询string没有任何占位符? 为了这。

例如,这是错误的

 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以指定占位符。

 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 ('?', '?', '?')"; 

否则,你仍然会得到相同的exception,因为SQLparsing器会将它们解释为实际的string值,从而无法再find占位符。

也可以看看:

  • JDBC教程 – 准备语句

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

这里有一些代码来实现你想要的

 public boolean insertar(vtrabajador dts) { sSQl = "insert into persona (nombres,apaterno,amaterno,tipo_documento, nro_documento,direccion,telefono,email)"+ "values (?,?,?,?,?,?,?,?)"; sSQl2 = "insert into trabajador (idpersona,sueldo,acceso,login,password,estado)" + "values ((select idpersona from persona order by idpersona desc limit 1),?,?,?,?,?)"; try { PreparedStatement pst = cn.prepareStatement(sSQl); PreparedStatement pst2 = cn.prepareStatement(sSQl2); pst.setString(1, dts.getNombres()); pst.setString(2, dts.getApaterno()); pst.setString(3, dts.getAmaterno()); pst.setString(4, dts.getTipo_documento()); pst.setString(5, dts.getNro_documento()); pst.setString(6, dts.getDireccion()); pst.setString(7, dts.getTelefono()); pst.setString(8, dts.getEmail()); pst2.setDouble(9, dts.getSueldo()); pst2.setString(10, dts.getAcceso()); pst2.setString(11, dts.getLogin()); pst2.setString(12, dts.getPassword()); pst2.setString(13, dts.getEstado()); int n = pst.executeUpdate(); if (n != 0) { int n2 = pst2.executeUpdate(); if (n2 != 0) { return true; } else { return false; } } else { return false; } } catch (Exception e) { JOptionPane.showConfirmDialog(null, e); return false; } }