選択した選択コンボ ボックスの検証後、データベースに挿入できません。Tomcat は次のエラーを返します。
java.sql.SQLException: パラメータ インデックスが範囲外です (1 > パラメータの数、つまり 0)。
これはどのように発生し、どうすれば解決できますか?
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パーサーがそれらを実際の文字列値として解釈し、プレースホルダーを見つけることができなくなるため、同じ例外が発生します。
これは、jdbc ドライバーのバージョンの問題です。mysql-connector-java-commercial-5.0.3-bin.jar を使用していたときにこの問題が発生しましたが、新しいバージョンの mysql-connector-java-5.1.22.jar に変更すると、問題は修正されました。