Подтвердить что ты не робот

Java.sql.SQLException Индекс параметров вне диапазона (1> количество параметров, которое равно 0)

После проверки выбранного поля со списком, которое я выбрал, и я не могу его вставить в мою базу данных. Tomcat дает следующую ошибку:

java.sql.SQLException: Индекс параметров вне диапазона (1 > количество параметров, которое равно 0).

Как это вызвано и как я могу его решить?

4b9b3361

Ответ 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;
    }
}