- - PR -
OraclePreparedStatement使用時にClassCastException
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-27 11:29
始めまして。質問させていただきます。
下記環境にてアプリを作成しておりますが、 OraclePreparedStatementを使用している所でClassCastExceptionが発生します。 どなたか、回避策をご教示いただけませんでしょうか? ++++環境++++++++++++++++++++++++++++++ jboss-3.2.7 oracle10g 10.1.0.4 JDBC THIN Driver 10.1.0.4 ++++以下ソース抜粋+++++++++++++++++++++++++ Connection con = null; OraclePreparedStatement ps = null; OracleResultSet rs = null; try { con = _getConnection(); String SQL = "SELECT rowid, u_no FROM table WHERE xxx=?; ps = (OraclePreparedStatement)con.prepareStatement(SQL); ^^^^^^^^^^^^^^^^^^^^^^^^^ここでエラー(ClassCastException)になります。 ps.setString(1, xxx); rs = (OracleResultSet)ps.executeQuery(); ROWID rowid; if( rs.next() ){ rowid = rs.getROWID("rowid"); }else{ Logger.info("ItemNotFoundException "); return; } ps.close(); ps = null; . . . どなたか、よろしくお願いします。 | ||||||||
|
投稿日時: 2006-03-27 12:05
なぜOraclePreparedStatementを使うんだろ?
java.sql.PreparedStatementでいいのでは? | ||||||||
|
投稿日時: 2006-03-27 12:10
ClassCastException が起きる原因をご存知であれば、
何がおかしいかも気付くはずなんですが... 型。 # すみません、リロードし忘れました。orz [ メッセージ編集済み 編集者: じゃんぬねっと 編集日時 2006-10-12 11:27 ] | ||||||||
|
投稿日時: 2006-03-27 12:13
_getConnection()というメソッドがどういったコネクションを返すのか判りませんが、
恐らくjava.sql.Connectionを取得しているのではないでしょうか? OraclePreparedStatementというのはベンダ固有のクラスですので、java.sql.ConnectionのprepareStatementで返ってくるjava.sql.PreparedStatementからダウンキャストする事はできません。 私はOraclePreparedStatementを使用したことが無いため詳しい事は判らないのですが、DataSourceからではなくOracleが提供しているDriverManagerからConnectionを取得すればOracleConnectionが返ってくるのでは無いかと思います。 見当違いでしたら申し訳ありません。 | ||||||||
|
投稿日時: 2006-03-27 12:15
Connectionオブジェクトがデータソースでラップされている場合、
その実装によってはStatement関連のオブジェクトもラップされる可能性があります。 まずは、 System.out.println(ps.getClass()); とやってみて、インスタンスのクラスを確認してみましょう。 | ||||||||
|
投稿日時: 2006-03-27 12:30
みなさまご返信ありがとうございます。
>ハツキタツミサマ もともと何年も前に誰かが作ったソースの改修なので、どうしてOraclePreparedStatementを使用しているのか分からず、悩んでいるところです。 PreparedStatementにしてみたところ、ROWID rowid; でエラーになって、コンパイルできません。 >じゃんぬねっとサマ ClassCastException は型が合っていないときに出るのですよね? 勉強します。 >SUK2サマ _getConnection()は下記です。 private Connection _getConnection() throws SQLException { DataSource ds = null; try { Context ctx = new InitialContext(); ds = (DataSource)ctx.lookup("java:OracleDS"); } catch (NamingException ex){ Logger.err("JNDILookupError", ex); throw new SQLException("JNDILookupError"); } return ds.getConnection(); } java.sql.ConnectionのprepareStatementで返ってくる値をoracleprepareStatementで受けることはできないという事ですね。 Connection の取得方法は変更したくないので、oracleprepareStatementを使わずに、できる方法を考えたいと思います。 | ||||||||
|
投稿日時: 2006-03-27 13:04
getROWIDはOracleのJDBC拡張で追加されたメソッドなのでエラーとなるんでしょうね。
rowidはStringでとっていいようですが、 何に使っているかによって、Stringにしていいのかどうかという問題が出てくるので、 単純に直していいかどうかがわかりません。 #何かしらの機能が使いたくてOraclePreparedStatement,OracleResultSetを用いていたのかもしれませんね。 | ||||||||
|
投稿日時: 2006-03-27 13:05
でエラーになると思うが? 単純にOracleのROWIDを取得するだけなら rs.getStringとかでも取れそうだがね.. #しかしこの様子だとResultSetとかでも同じようにひっかかる悪寒 |