java.sql.SQLException Índice de parámetros fuera de rango (1> número de parámetros, que es 0) [cerrado]
Después de la validación del cuadro combinado de selección que he seleccionado y no puedo insertarlo en mi base de datos. Tomcat da el siguiente error:
java.sql.SQLException: índice de parámetros fuera de rango (1 > número de parámetros, que es 0).
¿Cómo se produce esto y cómo puedo solucionarlo?
Recibirá este error cuando llame a cualquiera de los setXxx()
métodos en PreparedStatement
, mientras que la cadena de consulta SQL no tiene ningún marcador de posición ?
para esto.
Por ejemplo esto está mal :
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);
Debe corregir la cadena de consulta SQL en consecuencia para especificar los marcadores de posición.
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);
Tenga en cuenta que el índice de parámetros comienza con 1
y que no es necesario citar esos marcadores de posición de esta manera:
String sql = "INSERT INTO tablename (col1, col2, col3) VALUES ('?', '?', '?')";
De lo contrario, seguirá obteniendo la misma excepción, porque el analizador SQL los interpretará como valores de cadena reales y, por lo tanto, ya no podrá encontrar los marcadores de posición.
Ver también:
- Tutorial de JDBC: declaraciones preparadas
Este es un problema con la versión del controlador jdbc. Tuve este problema cuando usaba mysql-connector-java-commercial-5.0.3-bin.jar pero cuando cambié a una versión posterior del controlador mysql-connector-java-5.1.22.jar, el problema se solucionó.