こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Java(JDK1.6)のbyte配列をそのままpostgresqlに

Java(JDK1.6)のbyte配列をそのままpostgresqlに保存したいのですが上手くいかず困っております。

(詳細)
DBのカラム数はかなり多く、その中の1つのデータがbyte配列データになっておりJava上で動かしているデータをそのままそっくり保存したいと思うのですが上手に動作しません。方法は(1)カラムが多いのでbyte配列以外をsql命令で保存(2)その後にbyte配列部分をResultSetを利用して追加する です。

[プログラム]
下記の場合はdataカラムにbyte配列を保存する形です。dataカラム以外のカラムにまずINSERTで保存してその後に追加でdataに保存、という形になります。細かいプログラムは全て省略しております。

ResultSet rs = null;
Connection con = DriverManager.getConnection(....);
Statement stmt = con.createStatement();
String sql = "INSERT INTO ~";
stmt.executeUpdate(sql); // ここでdataカラム以外にデータをDBに保存。dataカラムにはnullが入っている。
rs.close();
stmt.close();
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
sql = "SELECT data FROM ~ WHERE id..."; // プライマリキーidを使って保存したデータを引っ張ってくる
rs = stmt.executeQuery(sql);
if(rs.next()){
Blob blob = rs.getBlob("data");
if(blob == null){
blob = con.createBlob(); // ※
}
blob.setBytes(1,bytearray);
rs.updateBlob("data",blob);
rs.updateRow();
}

上記のプログラムで試したところ、次のようなエラーが発生します。
※の部分で
error=org.postgresql.util.PSQLException: Method org.postgresql.jdbc4.Jdbc4Connection.createBlob() is not yet implemented.
というエラーが発生します。またcreateBlob()をしない場合は下の部分でNullPointerExceptionが発生します。

そこでエラーの内容からクラス宣言時にimplements Connectionと追加するとConnectionインターフェースのメソッド(たくさん)が自動追加されます。その中にcreateBlob()という命令もあるのですが、使い方が分かりません。

[参考にしたHP]
http://idocsq.net/page/446


解決方法が分からず困っております。
Blobを使わないでもbyte配列がそのままDBに保存できれば構いません。ResultSet.updateBytesという命令もあって試してみたのですがうまくいきませんでした。
詳しい方居られましたら御助言頂けませんでしょうか。

投稿日時 - 2010-10-20 20:28:37

QNo.6263731

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

まずは落ち着いてエラーメッセージを読んでみるとどうだろう。

o.p.u.PSQLException: Method o.p.j.Jdbc4Connection.createBlob() is not yet implemented.

訳:o.p.u.PSQLExceptionが発生しました。メソッドo.p.j.Jdbc4Connection.createBlob()は未だ実装(=作成)されていません。

 つまり、PostgreSQLを開発している人たちがPostgreSQL用のJDBCドライバーも開発を(多分)しているけど、JDBC APIのcreateBlob()メソッドの中身はまだ作ってないよん。ごめんちゃい。と言っているという事だと推測される。

 JavaからPostgreSQLのBlob(というかbytea列)を操作するコードは一度書いた事があるが・・・・詳しい事は忘れてしまった。少なくともjava.sql.Connection#createBlob()を使う方法では無かった。java.sql.ResultSet#getBlob()も記憶にないな。java.sql.PreparedStatement#setBlob(int, java.io.InputStream, int)、java.sql.PreparedStatement#setBinaryStream(int, java.io.InputStream, int)というのを調べてみると良いかも知れない。読み込む時はjava.sql.ResultSet#getBinaryStream(int)を使うのかも知れない。これらはかすかに記憶にある。つまり、java.sql.Blobクラスではなくストリームを介してバイト配列をやり取りする方法だ。

 余談になるが、java.sql.Connectionインターフェースは「DBへの接続」を意味するインターフェースであり、質問者の言うimplements Connection云々のくだりは、createBlob()という命令を用意する(JDBCプロバイダーを作成する)側の話なので今回の件には関係ない。

投稿日時 - 2010-11-03 04:16:37

あなたにオススメの質問