2011年8月15日月曜日

たまには、違う言語の話でも・・・

どもども。

今回は、昨日の更新とは全く関係ありませんが、
個人的にちょっとはまってしまった事案について、
記載していきたいと思います。

標準のJavaでDBアクセスをする際に、PreparedStatementというインタフェースを
Connectionというインターフェースから生成してSQL文を実行すると思うのですが、
※PreparedStatementのAPIはこちらです。
  JavaのConnectionの生成からDBアクセスまでの流れが知りたい方は、
  別途調べてください。

JavaでDBアクセスをする際には、よく使うPreparedStatementですが、
こちらで『ある失敗』をしたところ、(個人的に)わかりづらいエラーが出力され1時間程度
はまってしまいました。


で、その失敗は何かと言いますと、

// PreparedStatement生成
pStmt = conn.prepareStatement(sql);

・・・中略(パラメータ設定など)・・・

// executeUpdate実行
resultCount = pStmt.executeUpdate(sql);

という形で、生成時と、実行時に間違えてSQL文字列(INSERT文)を指定してしまいました。
かなり恥ずかしい失敗ですね。

で、こちらを実行すると、下記のエラーが表示されます。

『org.postgresql.util.PSQLException:
  PreparedStatementでクエリー文字を含むクエリー方法は使えません。』

うん、意味わからんって感じでした。(わかる人にはわかるのでしょうか?)
ここからが問題だったのですが、こちらのメッセージをGoogle先生に聞いても
的を得た回答が得にくかったのです。(単純に私の検索力不足ですね・・・)

何よりくだらなすぎるミスのため、このエラーを出す人がいないのかもしれません。
ということで、この調べにくいエラーを出してしまって、
万が一このページを見た方にお伝えすることは、

『SQLの文字列をPreparedStatementに対して複数回指定していませんか?』ということですね。

どなたかの助けになれば幸いです。(後は自分用のメモを兼ねてです。)

ちなみに、このConnectionを生成してDBアクセスの流れですが、
フレームワーク等を使うとあまり意識しないことが多いです。

※私自身も以前ある仕事で、このDBアクセス方法を使うのか聞いたら、
   『あーそんな方法もありましたね。』と言われてしまったことがあります。

古い書き方がわかりやすくて好きなんですけどね。
(フレームワークを覚えるのって大変なんですよ・・・)

ではでは。

0 件のコメント:

コメントを投稿