EJB存取Oracle的BLOB和CLOB字段的问题,大家可以讨论一下,来者有分 EJB里面不能直接对Oracle的BLOB和CLOB字段的,它只能是单独再用一个JAVABEAN来存取的,因为这其中要用到输入和输出对象(即java.io.*).在EJB当中是不能用其来操作的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用byte[]做参数据和方式可以存入数据,但是取不出来! 兄弟,谁说取不出来,竟然能够存,还有取不出来的事情吗?要不给你个例子看看,就可以了。 public boolean setBlob(String filename,String tablename,String blobname,String keyname,String keyid){ boolean flag = false; Connection con = null; java.sql.PreparedStatement ps = null; java.sql.ResultSet rs = null; try{ File file = new File(filename);//建立一个文件对象 FileInputStream fis=new FileInputStream(file);//建立一个文件输入流对象 byte[] fbyte=new byte[(int)file.length()];//建立一个字节数组 int i=fis.read(fbyte);//将文件读入到字节组中 con = this.getConnection(); con.setAutoCommit(false); String sqlString = String.valueOf(new StringBuffer().append("select ") .append(blobname+" from "+tablename).append(" where ") .append(keyname).append("=").append(keyid+" for update")); //blob对象数据从SELECT语句中选出,要修改BLOB,必须添加"FOR UPDATE"语句("否则会出现BLOB未锁定...等错误") //还有其他的方法,比如HOLDLOCK也行,...加锁 ps = con.prepareStatement(sqlString); rs = ps.executeQuery(); if(rs.next()){ oracle.sql.BLOB blob = ((oracle.jdbc.OracleResultSet)rs).getBLOB(blobname); java.io.OutputStream outx = blob.getBinaryOutputStream(); outx.write(fbyte); outx.flush(); ps.execute("commit"); con.setAutoCommit(true); flag = true; }else{ flag = false; } return flag; }catch(Exception e){ return false; }finally{ try{ rs.close(); }catch(Exception e){} try{ ps.close(); }catch(Exception e){} try{ con.close(); }catch(Exception e){} } } public boolean getBlob(String filename,String tablename,String blobname,String keyname,String keyid){ boolean flag = false; Connection con = null; java.sql.PreparedStatement ps = null; java.sql.ResultSet rs = null; java.io.InputStream in = null; java.io.OutputStream out = null; oracle.sql.BLOB blob = null; byte[] data; try{ con = this.getConnection(); String sqlstring = "select * from "+tablename+" where "+keyname+"="+keyid; ps = con.prepareStatement(sqlstring); rs = ps.executeQuery(); if(rs.next()){ blob = ((oracle.jdbc.OracleResultSet)rs).getBLOB(blobname); in = blob.getBinaryStream(); out = new java.io.FileOutputStream(filename); int bufferSize = blob.getBufferSize(); data = new byte[bufferSize]; int bytesRead = 0; while ((bytesRead = in.read(data)) != -1) { out.write(data, 0, bytesRead); //System.out.println(bytesRead); } ps.clearParameters(); data = null; in.close(); out.close(); //con.commit(); flag = true; } return flag; }catch(Exception e){ return false; }finally{ try{ in = null; out = null; blob = null; rs = null; ps =null; con = null; }catch(Exception e){} } } to: lovevicky511(郭志军):我有点明白我的错误所在了!但我在试一下,你的程序看起来是对的!重写了Set和Get方法!我没有有想到!等我试一下更希望更多的朋友提出自己的看法! 还有一个问题ejb2.0不是不能使用java.io.*类吗? 我这就是例子啊,你还想什么例子啊,EJB中是不可以用到java.io.*这个包中的函数和方法是不能用到的。 我现在用的是LONG RAW 类型实现的!很别方便!CLOB和BLOB没有搞定! 在做有关rmi时也遇到此问题,当时是把file放到一个byte array不知有没有好办法 struts2做分页,在jsp显示,请给点指点 自定义标记库+国际化 hibernate annatatoin 问题 关于数据库连接问题!! struts+spring+hibernate问题 在WEBWORK下,对于访问每个应用的用户权限验证问题。。。 spring自动扫描bean EJB的调用问题 怎样将一个dom4j的document对象,格式化后,输出为String (急)奇怪的HelloWorld问题 开始学Java,各位提供点学习经验? 我的weblogic7.0总是用一段时间就不能正常启动
public boolean setBlob(String filename,String tablename,String blobname,String keyname,String keyid){
boolean flag = false;
Connection con = null;
java.sql.PreparedStatement ps = null;
java.sql.ResultSet rs = null;
try{
File file = new File(filename);//建立一个文件对象
FileInputStream fis=new FileInputStream(file);//建立一个文件输入流对象
byte[] fbyte=new byte[(int)file.length()];//建立一个字节数组
int i=fis.read(fbyte);//将文件读入到字节组中
con = this.getConnection();
con.setAutoCommit(false);
String sqlString = String.valueOf(new StringBuffer().append("select ")
.append(blobname+" from "+tablename).append(" where ")
.append(keyname).append("=").append(keyid+" for update"));
//blob对象数据从SELECT语句中选出,要修改BLOB,必须添加"FOR UPDATE"语句("否则会出现BLOB未锁定...等错误")
//还有其他的方法,比如HOLDLOCK也行,...加锁
ps = con.prepareStatement(sqlString);
rs = ps.executeQuery();
if(rs.next()){
oracle.sql.BLOB blob = ((oracle.jdbc.OracleResultSet)rs).getBLOB(blobname);
java.io.OutputStream outx = blob.getBinaryOutputStream();
outx.write(fbyte);
outx.flush();
ps.execute("commit");
con.setAutoCommit(true);
flag = true;
}else{
flag = false;
}
return flag;
}catch(Exception e){
return false;
}finally{
try{
rs.close();
}catch(Exception e){}
try{
ps.close();
}catch(Exception e){}
try{
con.close();
}catch(Exception e){}
}
}
boolean flag = false;
Connection con = null;
java.sql.PreparedStatement ps = null;
java.sql.ResultSet rs = null;
java.io.InputStream in = null;
java.io.OutputStream out = null;
oracle.sql.BLOB blob = null;
byte[] data;
try{
con = this.getConnection();
String sqlstring = "select * from "+tablename+" where "+keyname+"="+keyid;
ps = con.prepareStatement(sqlstring);
rs = ps.executeQuery();
if(rs.next()){
blob = ((oracle.jdbc.OracleResultSet)rs).getBLOB(blobname);
in = blob.getBinaryStream();
out = new java.io.FileOutputStream(filename);
int bufferSize = blob.getBufferSize();
data = new byte[bufferSize];
int bytesRead = 0;
while ((bytesRead = in.read(data)) != -1) {
out.write(data, 0, bytesRead);
//System.out.println(bytesRead);
}
ps.clearParameters();
data = null;
in.close();
out.close();
//con.commit();
flag = true;
}
return flag;
}catch(Exception e){
return false;
}finally{
try{
in = null;
out = null;
blob = null;
rs = null;
ps =null;
con = null;
}catch(Exception e){}
}
}
我有点明白我的错误所在了!但我在试一下,你的程序看起来是对的!重写了Set和Get方法!我没有有想到!等我试一下更希望更多的朋友提出自己的看法!
ejb2.0不是不能使用java.io.*类吗?
CLOB和BLOB没有搞定!
不知有没有好办法