- PR -

OraclePreparedStatement使用時にClassCastException

投稿者投稿内容
未記入
会議室デビュー日: 2006/03/27
投稿数: 7
投稿日時: 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;

.
.
.

どなたか、よろしくお願いします。
ハツキタツミ
大ベテラン
会議室デビュー日: 2005/05/24
投稿数: 108
投稿日時: 2006-03-27 12:05
なぜOraclePreparedStatementを使うんだろ?
java.sql.PreparedStatementでいいのでは?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-27 12:10
ClassCastException が起きる原因をご存知であれば、
何がおかしいかも気付くはずなんですが... 型。

# すみません、リロードし忘れました。orz

[ メッセージ編集済み 編集者: じゃんぬねっと 編集日時 2006-10-12 11:27 ]
SUK2
ベテラン
会議室デビュー日: 2005/12/27
投稿数: 69
投稿日時: 2006-03-27 12:13
_getConnection()というメソッドがどういったコネクションを返すのか判りませんが、
恐らくjava.sql.Connectionを取得しているのではないでしょうか?
OraclePreparedStatementというのはベンダ固有のクラスですので、java.sql.ConnectionのprepareStatementで返ってくるjava.sql.PreparedStatementからダウンキャストする事はできません。

私はOraclePreparedStatementを使用したことが無いため詳しい事は判らないのですが、DataSourceからではなくOracleが提供しているDriverManagerからConnectionを取得すればOracleConnectionが返ってくるのでは無いかと思います。

見当違いでしたら申し訳ありません。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-03-27 12:15
Connectionオブジェクトがデータソースでラップされている場合、
その実装によってはStatement関連のオブジェクトもラップされる可能性があります。
まずは、
System.out.println(ps.getClass());
とやってみて、インスタンスのクラスを確認してみましょう。
未記入
会議室デビュー日: 2006/03/27
投稿数: 7
投稿日時: 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を使わずに、できる方法を考えたいと思います。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-03-27 13:04
getROWIDはOracleのJDBC拡張で追加されたメソッドなのでエラーとなるんでしょうね。

rowidはStringでとっていいようですが、
何に使っているかによって、Stringにしていいのかどうかという問題が出てくるので、
単純に直していいかどうかがわかりません。

#何かしらの機能が使いたくてOraclePreparedStatement,OracleResultSetを用いていたのかもしれませんね。
ハツキタツミ
大ベテラン
会議室デビュー日: 2005/05/24
投稿数: 108
投稿日時: 2006-03-27 13:05
引用:

未記入さんの書き込み (2006-03-27 12:30) より:
PreparedStatementにしてみたところ、ROWID rowid; でエラーになって、コンパイルできません。


コード:
rs.getROWID("rowid"); 


でエラーになると思うが?

単純にOracleのROWIDを取得するだけなら
rs.getStringとかでも取れそうだがね..

#しかしこの様子だとResultSetとかでも同じようにひっかかる悪寒

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