- ベストアンサー
JavaストアドプロシージャでResultSetが返ってこない
- Java+ストアドプロシージャでResultSetが返ってきません
- idを送りその値を元にSELECTを行い、もしそのidに該当するデータがなければ空行を追加し、その行を返すストアドプロシージャに接続したいのですが、空行追加の際、空行追加後にその行が返ってきません。
- @count=0の場合、SELECT文を実行しているのか調べたくて戻り値を設定し、どの段階まで動いているのか調べようとしたのですが戻り値を設定すると「インデックス 2 は範囲外です。」と出てしまいます。色々なページを探してみたのですが、それらしい文章を見つけることができなかった為、先輩方ご教授願います。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
SQL Server 2008ですか。。 SQL Serverでは、すべてのステートメントについて「xx行更新しました」というメッセージが返されます。 呼び出し元ではそれぞれを戻りと認識してしまうので、@count=0のときは、最初の2つ(INSERT)のResultSetはNULLです。 これらのメッセージを抑止するために、ストアドでは「SET NOCOUNT ON」と先頭に切るのが一般的です。 ただ、Javaで試したわけでないので、もし効かなければ、ResultSetがNULLでなくなるまでgetMoreResultsを繰り返す必要があります。
その他の回答 (2)
- bleis
- ベストアンサー率68% (11/16)
そういうことではなくて、execute の戻り値として false が返ってきているんじゃないかな?ということです。 @count が 0 だと、INSERTが実行されるため、execute の戻り値として false が返ってきてもおかしくはありませんし。 APIリファレンスには、 「最初の結果が ResultSet オブジェクトの場合は true。更新カウントであるか、または結果がない場合は false」 とありますので、execute の戻り値のチェックは必須ですよ。
- bleis
- ベストアンサー率68% (11/16)
まずはAPIリファレンスを読みましょう。 http://www.j2ee.me/javase/ja/6/docs/ja/api/java/sql/PreparedStatement.html#execute()
補足
えっと、恐らくなのですが execute()ではなくexecuteQuery()を使え ということでしょうか? はじめはexecuteQueryを使用していたのですが、こちらですとexecuteQueryを実行してすぐにエラーログが出てしまい、原因を究明することができませんでしたので、一度executeしてからgetResultSetをするという手間を踏んでいるのです。 判りづらいソースで申し訳ありません・・・
お礼
ありがとうございます!解決しましたっ そういうことだったんですね・・・。きちんと結果も得ることができて、自分の無知さを思い知りました^^; 本当にありがとうございました。