- PR -

Oracleへの画像登録(BLOB)方法について

1
投稿者投稿内容
TMX
会議室デビュー日: 2006/07/07
投稿数: 4
投稿日時: 2006-07-08 11:26
お世話になります。

Javaを用いて、Oracleへ画像を登録するシステムを開発するため、サイト上で見つけたソー
スコードを参考にしてテストを行ったのですが上手くいかず、過去のスレッドも確認し似た
状況のものを参考に色々と試してみたのですがやはり上手くいきません。

状況は、DataSourceを活用して(DataSource) Context.lookup(データソース)で接続した場合、
 ===> BLOB blob = ((OracleResultSet) rs).getBLOB(1);
の部分で例外処理が発生します。

Javaでの開発経験も余りなくOracleへの画像登録も初めてなため、何処が問題なのかが判ら
ず困っております。

そこで大変申し訳ないのですがどなたか対処法をご教授頂けないでしょうか。
--------------------------------------------------------------------------------------
【開発環境】
  Oracle8.17
  WebSphere V5.1.2

【Oracle登録用テーブル】
  CREATE TABLE BLB
  (
 FT_NAME VARCHAR2(20),
 FB_FILE BLOB
  )
--------------------------------------------------------------------------------------
【ソースコード】
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.sql.*;

import javax.naming.*;
import javax.sql.DataSource;

import oracle.jdbc.OracleResultSet;
import oracle.sql.BLOB;

public class Test {
public void RecAdd1(){
Connection cn = null;
Statement st = null;
ResultSet rs = null;
PreparedStatement ps = null;
String select = null;
String insert = null;

try {
Context ctx;
ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oracleds");
cn = ds.getConnection();
cn.setAutoCommit(false);

insert = "INSERT INTO BLB (FT_NAME,FB_FILE) VALUES('Test',empty_blob())";
ps = cn.prepareStatement(insert);
ps.executeUpdate();

select = "select FB_FILE from BLB for update";
ps = cn.prepareStatement(select);
rs = ps.executeQuery();

if (rs.next()){
BLOB blobLocator = ((OracleResultSet)rs).getBLOB(1); <== 例外処理発生
int chunk = blobLocator.getChunkSize();
byte[] buffer = new byte[chunk];
int length = -1;
File file=new File("//LocalHost/Test.jpg");
FileInputStream fis = new FileInputStream(file);
OutputStream outputstream = blobLocator.getBinaryOutputStream();
while((length = fis.read(buffer)) != -1)
{
outputstream.write(buffer, 0, length);
}
}
cn.commit();
ps.close();
cn.close();
} catch (Exception e) {
}
}
--------------------------------------------------------------------------------------
また、以前のスレッドで『org.apache.commons.dbcp.DelegatingResultSet』を利用し、
BLOB blob = ((OracleResultSet)((DelegatingResultSet)rs).getDelegate()).getBLOB(1)
のように変更することで問題なくできるとの回答もあったのですが、getDelegate()を認識
することができませんでした。

getDelegate()を利用するには『org.apache.commons.dbcp.DelegatingResultSet』のほかに
何か設定する必要があるのでしょうか?

初歩的なことなのかもしれませんがご教授の程、宜しくお願い致します。


[ メッセージ編集済み 編集者: TMX 編集日時 2006-07-10 14:23 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-08 12:54
引用:

TMXさんの書き込み (2006-07-08 11:26) より:

また、以前のスレッドで『org.apache.commons.dbcp.DelegatingResultSet』を利用し、
BLOB blob = ((OracleResultSet)((DelegatingResultSet)rs).getDelegate()).getBLOB(1)
のように変更することで問題なくできるとの回答もあったのですが、


こちらのことですか?

  JDBC接続方法違いでエラーとなる

解決できてないような気がしますが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
TMX
会議室デビュー日: 2006/07/07
投稿数: 4
投稿日時: 2006-07-08 13:11
じゃんぬねっと様、早速のご回答有難うございます。

引用:

じゃんぬねっとさんの書き込み (2006-07-08 12:54) より:
こちらのことですか?

  JDBC接続方法違いでエラーとなる

解決できてないような気がしますが。





ご指摘いただいたスレッドも参考にさせて頂いた(ご指摘通り、解決されていないようでしたが・・・)のですが、下記スレッドでは『以下のようなかんじで問題なくできます。』との回答がありましたので(但し、Oracle9.20でしたが)記述されている方法でできるのかと思い質問させて頂きました。


OracleへJNDI接続し、BLOB型へ挿入する際に発生するクラスキャスト例外の回避法は?

むらぴー
会議室デビュー日: 2005/08/25
投稿数: 2
投稿日時: 2006-07-10 13:01
発生する例外のスタックトレースはどのようになっていますか。
DataSourceですが、WebSphereのものでしょうか?
 
TMX
会議室デビュー日: 2006/07/07
投稿数: 4
投稿日時: 2006-07-10 13:26
むらぴー様、お世話になります。

引用:

むらぴーさんの書き込み (2006-07-10 13:01) より:
発生する例外のスタックトレースはどのようになっていますか。
DataSourceですが、WebSphereのものでしょうか?
 


例外処理が発生する箇所に『printStackTrace()』を追加し実行したところ、下記メッセージが表示されます。

SystemErr R java.lang.ClassCastException: com/ibm/ws/rsadapter/jdbc/WSJdbcResultSet incompatible with oracle/jdbc/driver/OracleResultSet

※私の知識が乏しい為、むらぴー様の質問の回答になっているかわかりませんので、もし見当違いの回答でありましたら申し訳ありませんがどのようにすれば良いかご教授頂けないでしょうか。
TMX
会議室デビュー日: 2006/07/07
投稿数: 4
投稿日時: 2006-07-10 14:43
お世話になっております。

質問させて頂いた件、ソースコードを下記のように変更したところ登録できるようになりました。

回答頂きました『じゃんぬねっと様』『むらぴー様』有難うございました。
今後もお世話になると思いますが宜しくお願い致します。

--------------------------------------------------------------------------------------
【ソースコード】
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.sql.*;

import javax.naming.*;
import javax.sql.DataSource;

import oracle.jdbc.OracleResultSet;
import oracle.sql.BLOB;
public class Test {
public void RecAdd1(){
Connection cn = null;
Statement st = null;
ResultSet rs = null;
PreparedStatement ps = null;
String select = null;
String insert = null;

try {
Context ctx;
ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oracleds");
cn = ds.getConnection();
cn.setAutoCommit(false);
File file=new File("//LocalHost/Test.jpg");
FileInputStream inputStream = new FileInputStream(file);

insert = "INSERT INTO BLB (FT_NAME,FB_FILE) VALUES('Test.jpg',empty_blob())";
ps = cn.prepareStatement(insert);
ps.executeUpdate();

select = "select FB_FILE from BLB for where FT_NAME = 'Test.jpg' update";
ps = cn.prepareStatement(select);
rs = ps.executeQuery();

if (rs.next()){
BLOB blob = (BLOB)rs.getBlob("FB_FILE");
OutputStream outputStream = blob.getBinaryOutputStream();
byte[] buffer = new byte[blob.getChunkSize()];
int length = -1;

while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
}
inputStream.close();
cn.commit();
ps.close();
cn.close();
} catch (Exception e) {
}
}



[ メッセージ編集済み 編集者: TMX 編集日時 2006-07-11 07:56 ]
1

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