- PR -

ResultSetのgetBytesについて

投稿者投稿内容
未記入
会議室デビュー日: 2006/06/02
投稿数: 3
投稿日時: 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);
}
}
}
}
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-06-02 17:32
「SQLExceptionが発生する」だけじゃわからないです。
プログラムが止まったときに表示される、スタックトレースを貼ってください。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-06-02 17:38
それと、
System.out.println(e);
とあるのは、
e.printStackTrace();
に変更してくださいな。
未記入
会議室デビュー日: 2006/06/02
投稿数: 3
投稿日時: 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)
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-06-05 10:03
申し訳ないですが、私じゃ無理です。
お役に立てなくてすみません。
luckseed
常連さん
会議室デビュー日: 2006/05/23
投稿数: 24
投稿日時: 2006-06-05 10:56
MySQLで、試しに同様の処理を走らせてみたところ、何の問題もなく通りました。
ドライバの仕様なのか、DB環境の問題か・・・
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 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 ゲーテ
tnk
会議室デビュー日: 2005/06/10
投稿数: 11
投稿日時: 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)だとちゃんと値が取得できます。

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