Java.sql.SQLException Индекс параметров вне диапазона (1> количество параметров, которое равно 0)
После проверки выбранного поля со списком, которое я выбрал, и я не могу его вставить в мою базу данных. Tomcat дает следующую ошибку:
java.sql.SQLException: Индекс параметров вне диапазона (1 > количество параметров, которое равно 0).
Как это вызвано и как я могу его решить?
Ответы
Ответ 1
Вы получите эту ошибку при вызове любого из методов 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 затем интерпретирует их как фактические значения строк и, следовательно, больше не сможет найти заполнители.
См. также:
Ответ 2
Это проблема с версией драйвера jdbc. У меня была эта проблема, когда я использовал
mysql-connector-java-commercial-5.0.3-bin.jar, но когда я перешел на более позднюю версию драйвера
mysql-connector-java-5.1.22.jar, проблема была исправлена.
Ответ 3
Вот какой код для достижения желаемого
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;
}
}