Après validation de la liste déroulante sélectionnée que j'ai sélectionnée et que je ne parviens pas à l'insérer dans ma base de données. Tomcat donne l'erreur suivante:
Java.sql.SQLException: index de paramètre hors limites (1> nombre de paramètres, ce qui correspond à 0).
Comment cela est-il causé et comment puis-je le résoudre?
Vous obtiendrez cette erreur lorsque vous appelez l’une des méthodes setXxx()
sur PreparedStatement
, alors que la chaîne de requête SQL n’a aucun espace réservé ?
pour ça.
Par exemple, ceci est faux:
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);
Vous devez corriger la chaîne de requête SQL en conséquence pour spécifier les espaces réservés.
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);
Notez que l'index de paramètre commence par 1
et que vous n'avez pas besoin de citer ces espaces réservés de la manière suivante:
String sql = "INSERT INTO tablename (col1, col2, col3) VALUES ('?', '?', '?')";
Sinon, vous obtiendrez toujours la même exception, car l'analyseur SQL les interprétera alors comme les valeurs de chaîne réelles et ne pourra donc plus trouver les espaces réservés.
Ceci est un problème avec la version du pilote jdbc. J'avais ce problème lorsque j'utilisais mysql-connector-Java-commercial-5.0.3-bin.jar, mais lorsque je suis passé à une version de pilote plus récente, mysql-connector-Java-5.1.22.jar, le problème a été résolu.