- PR -

javaSQLエラーについて

投稿者投稿内容
ブラッド
会議室デビュー日: 2004/12/26
投稿数: 10
投稿日時: 2006-01-16 18:15
はじめまして。

環境ですが、ECLIPSE3.0、TOMCAT4.1、MYSQL4.0.18、J2SDK1.4.2_04を使用して開発を行っております。

症状なのですが、javaでSQL文を実行すると(エラー部抜粋)
クエリーエラー: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
SQLエラー: Parameter index out of range (1 > number of parameters, which is 0).
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
と出て検索を表示できないのですが、
コマンドプロンプトよりMYSQLを実行ごMYSQL上で同じSQL文を実行すると検索はできるのですがなぜjava側で実行するとエラーで実行できないんでしょうか・・・?

SQL文は "SELECT NEXT_ID FROM NEXT_ID_TABLE WHERE ((TABLE_NAME='"+?+"') AND(START_DATE<='"+?+"'"+AND END_DATE>='"+?+"'))";

です。よろしくお願い致します。

Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-01-16 18:39
エラーがどこで発生しているのか、よく確認しましょう。
SQLを実行する時点じゃなく、
PreparedStatementに、パラメータを設定している時点で発生していますよね。
コード:

String sqlString = "SELECT NEXT_ID FROM NEXT_ID_TABLE "
+ "WHERE ((TABLE_NAME=?) AND(START_DATE<=? AND END_DATE>=?))";


これでやってみてください。

[ メッセージ編集済み 編集者: Edosson 編集日時 2006-01-16 18:39 ]
ブラッド
会議室デビュー日: 2004/12/26
投稿数: 10
投稿日時: 2006-01-16 18:52
早速の返信ありがとうございます。

記載されていた通りSQLを実行する場面でなく値をセットする段階でエラーが出ているようです。(executeQuery()まで通っていませんでした。)

教えて頂いた通り、シングルクォーテーションを外してみても同じエラーがでております。。。

PreparedStatement pstmtSelect=null;
ResultSet resultSet=null;
String selectSQL = "SELECT NEXT_ID FROM NEXT_ID_TABLE " +
"WHERE ((TABLE_NAME = " + ? + ")" +
"AND (START_DATE<="+?+" AND 
"END_DATE>="+?+"))";
pstmtSelect = connection.prepareStatement(selectSQL);
pstmtSelect.setString(1,?);
pstmtSelect.setString(2,?);
pstmtSelect.setString(3,?);
resultSet = pstmtSelect.executeQuery();

なんですが、PreparedStatementの使い方が間違っているのでしょうか?
すいませんがよろしくお願い致します。。
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2006-01-16 19:02
引用:

ブラッドさんの書き込み (2006-01-16 18:52) より:
PreparedStatementの使い方が間違っているのでしょうか?


はい。まちがってます。

Edosson さんが書いた通り、手を加えずにそのままま書いてみてください。
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2006-01-16 21:19
引用:

String selectSQL = "SELECT NEXT_ID FROM NEXT_ID_TABLE " +
"WHERE ((TABLE_NAME = " + ? + ")" +
"AND (START_DATE<="+?+" AND 
"END_DATE>="+?+"))";


コンパイラ、通ってるの?
ブラッド
会議室デビュー日: 2004/12/26
投稿数: 10
投稿日時: 2006-01-16 21:49
手を加えずにといいますと、
PreparedStatement pstmtSelect=null;
ResultSet resultSet=null;
String selectSQL = "SELECT NEXT_ID FROM NEXT_ID_TABLE " +
"WHERE ((TABLE_NAME = " + ? + ")" +
"AND (START_DATE<="+?+" AND 
"END_DATE>="+?+"))";
pstmtSelect = connection.prepareStatement(selectSQL);
resultSet = pstmtSelect.executeQuery();

でよろしいんでしょうか?

ダブルクォーテーションはいらないんでしょうか?
つけませんと Unknown column とでますので
TABLE_NAME='?' としますと今度は先程と同じエラーがでてしまいます。

まだPreparedStatementの使い方が間違っているのでしょうか?
なかなか苦戦しており大変申し訳ありません。
よろしくお願いします。
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2006-01-16 22:16
引用:

手を加えずにといいますと、


どこが?
引用:

String selectSQL = "SELECT NEXT_ID FROM NEXT_ID_TABLE " +
"WHERE ((TABLE_NAME = " + ? + ")" +
"AND (START_DATE<="+?+" AND 
"END_DATE>="+?+"))";


だから、これで、コンパイラを通るの?
引用:

pstmtSelect = connection.prepareStatement(selectSQL);
resultSet = pstmtSelect.executeQuery();


パラメータを設定しなかったら、エラーにもなるでしょ。
引用:

でよろしいんでしょうか?


面倒がらないで、ちゃんとコピペしなさい。
そっちの手元でいじくってるのと投稿内容が食い違っているようでは、時間の無駄。
引用:

ダブルクォーテーションはいらないんでしょうか?


Edosson氏の投稿のどこにシングルクオーテーションやダブルクオーテーションが見えるの。
引用:

つけませんと Unknown column とでますので


自分のタイプミスを疑いなさい。
SQL文のフィールド名をチェックする。
引用:

TABLE_NAME='?' としますと今度は先程と同じエラーがでてしまいます。


これが一番大事なんだが、一度に考えることはひとつだけにする。

[ メッセージ編集済み 編集者: さいくろう 編集日時 2006-01-16 22:18 ]
ブラッド
会議室デビュー日: 2004/12/26
投稿数: 10
投稿日時: 2006-01-16 23:53
申し訳ございませんでした。SQL以下のソースを載せますのでよろしくお願い致します。

String selectSQL = "SELECT NEXT_ID FROM NEXT_ID_TABLE " +
"WHERE ((TABLE_NAME = ? ) AND (START_DATE<= ? AND END_DATE>= ? ))";
pstmtSelect = connection.prepareStatement(selectSQL);
pstmtSelect.setString(1,tableName);
pstmtSelect.setString(2,accessDateTime.substring(0,10));
pstmtSelect.setString(3,accessDateTime.substring(0,10));
resultSet = pstmtSelect.executeQuery();

[ メッセージ編集済み 編集者: ブラッド 編集日時 2006-01-17 09:12 ]

スキルアップ/キャリアアップ(JOB@IT)