- - PR -
ResultSetのgetBytesについて
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-06-02 17:24
はじめまして。
初心者なので色々と分かりづらい表現をしてしまうかもしれませんが、 よろしくお願い致します。 JDBCを用いて実行したSQLの結果をResultSet.getBytes("カラム名")を用いて 取得したいのですが、 Statementを生成する際に、 Statement stmt = Connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE) 上記のようにスクロール可能な結果セットの設定を行っていると、 getBytes()の箇所でSQLExceptionが発生してしまいます。 この場合、getBytes()は利用出来ないのでしょうか? 以下に、ソースを載せます。 ------------------------------------------------------------------------------ import java.sql.*; public class SUB_DBAccess { public static void main(String args[]) { String sDrv = "oracle.jdbc.driver.OracleDriver"; String sUrl = "jdbc:oracle:thin:@1.1.1.1:1521:test"; String sUser = "test"; String sPasswd = "tiger"; //結果有無フラグ boolean bResultFlg = false; Connection con = null; Statement stmt = null; ResultSet rs = null; try{ String sSql = "SELECT COLUMN_NAME " + "FROM TSET_TABLE " + "WHERE PK = 1"; Class.forName(sDrv); //データベースの接続をオープン con = DriverManager.getConnection(sUrl, sUser, sPasswd); con.setAutoCommit(false); //スクロール可能な結果セットの設定 stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); //SQL文を実行した結果を格納 rs = stmt.executeQuery(sSql); ResultSetMetaData rm = rs.getMetaData(); //データを取得 while(rs.next()){ bResultFlg = true; System.out.println(rs.getBytes(1)); System.out.println(new String(rs.getBytes(1), "Shift_JIS")); } if(!bResultFlg){ System.out.println("該当なし"); } }catch(Exception e){ System.out.println(e); }finally{ try{ rs.close(); stmt.close(); con.close(); }catch(Exception e){ System.out.println(e); } } } } |
|
投稿日時: 2006-06-02 17:32
「SQLExceptionが発生する」だけじゃわからないです。
プログラムが止まったときに表示される、スタックトレースを貼ってください。 |
|
投稿日時: 2006-06-02 17:38
それと、
System.out.println(e); とあるのは、 e.printStackTrace(); に変更してくださいな。 |
|
投稿日時: 2006-06-02 18:06
早速のご返信ありがとうございます。
質問に不備があり大変申し訳ございません。 エラーの詳細は以下のようになっています。 一部文字化けしてしまっていますが、大丈夫でしょうか? 宜しくお願い致します。 java.sql.SQLException: ホ?ホキソ、ャフオク?ヌ、ケ。」: getBytes at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210) at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:829) at oracle.jdbc.driver.ScrollableResultSet.getBytes(ScrollableResultSet.j ava:512) at oracle.jdbc.driver.UpdatableResultSet.getBytes(UpdatableResultSet.jav a:536) at SUB_DBAccess.main(SUB_DBAccess.java:37) |
|
投稿日時: 2006-06-05 10:03
申し訳ないですが、私じゃ無理です。
お役に立てなくてすみません。 |
|
投稿日時: 2006-06-05 10:56
MySQLで、試しに同様の処理を走らせてみたところ、何の問題もなく通りました。
ドライバの仕様なのか、DB環境の問題か・・・ |
|
投稿日時: 2006-06-05 11:26
スタックトレースの文字化けですが検索してみたらOracleのドライバのバグみたいです。
http://www.jajakarta.org/kvasir/bbs/technical/281?expand=true http://java-house.jp/ml/archive/j-h-b/052307.html oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168) の検索結果 _________________ 己への戒め 「活動的な馬鹿より恐ろしいものはない」 by ゲーテ |
|
投稿日時: 2006-06-05 11:46
Oracleドライバで再現できました。
例外メッセージ: java.sql.SQLException: 列の型が無効です。: getBytes 色々試してみたところ、 createStatement()の場合、 oracle.jdbc.driver.OracleResultSetImpl#getBytes()を利用 createStatement(int resultSetType, int resultSetConcurrency)の場合、 oracle.jdbc.driver.ScrollableResultSet#getBytes()を利用 なので、なんとなく OracleResultSetImplクラスとScrollableResultSetクラスの getBytes()メソッドの実装が違うのではないかと思われます。 ScrollableResultSetの方が型の判定が厳密なのではないでしょうか? # この場合、列の型がByteでなく、文字列(varchar?)だから # getString(int i)だとちゃんと値が取得できます。 |