web-dev-qa-db-fra.com

java.sql.SQLException Index de paramètre hors limites (1> nombre de paramètres, ce qui correspond à 0)

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?

30
DeveloperJava

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.

Voir également:

62
BalusC

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.

14
Ben Sang