39

選択した選択コンボ ボックスの検証後、データベースに挿入できません。Tomcat は次のエラーを返します。

java.sql.SQLException: パラメータ インデックスが範囲外です (1 > パラメータの数、つまり 0)。

これはどのように発生し、どうすれば解決できますか?

4

2 に答える 2

82

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パーサーがそれらを実際の文字列値として解釈し、プレースホルダーを見つけることができなくなるため、同じ例外が発生します。

参照:

于 2012-06-05T13:59:42.600 に答える
14

これは、jdbc ドライバーのバージョンの問題です。mysql-connector-java-commercial-5.0.3-bin.jar を使用していたときにこの問題が発生しましたが、新しいバージョンの mysql-connector-java-5.1.22.jar に変更すると、問題は修正されました。

于 2012-10-19T06:21:27.477 に答える