[转贴]Java中操作数据库的Blob字段,将文件写入数据库!!!

怎样操作数据库的Blob字段将文件写入数据库!!!  
急急急!!!请高手指教!!!  
---------------------------------------------------------------  
 
希望下面的可以解决你的问题  
 
http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/LOBSample/LOBSample.java.html  
 
上面的朋友,不行啊!他也是将java.sql.Blob强制转换成Oracle.sql.BLOB之后再写入Blob的  
我需要的是不用类型强制转换而写入!!!  
因为强制转换在JNDI环境下报异常!不能转换!!!!  
 
一般来说,大对象存储是把文件存到数据库中,当然也可以内存中的超大字符串。对于象图片这样的文件当然是用二进制存储,这里有很多误区,网络上的教程99%都是行不通的,连SUN自己的文档都一直错误,虽然错误很小。按说二进制文件应该存为BLOB类型,但JBDC2并不能直接对BLOB存入二进制文件,如果你这样做,会得到一个IO而不是SQL异常,为此花了我近两个小时才弄清楚。    
 
  如果要把一个二制文件存入ORACLE,用标准的JDBC你就要用LONG  ROW类型:    
 
create  table  tb_file(name  varchar(20),detail  long  row);    
 
  然后    
 
File  file  =  new  File("aaa.gif");    
int  fileLength  =(int)  file.length();    
InputStream  fin  =  new  FileInputStream(file);    
PreparedStatement  pstmt  =  con.prepareStatement("insert  into  tb_file  values('aaa.gif',?)");    
pstmt.setBinaryStream  (1,  fin,  fileLength);    
pstmt.executeUpdate();    
 
  如果你一定要用BLOB存储,你就必须用ORACLE自己的方法:    
 
create  table  tb_file(name  varchar(20),detail  BLOB);    
con.setAutoCommit(false);    
stmt.executeUpdate("insert  into  tb_file  values('aaa.gif',empty_blob())");    
 
  下面必须SELECT得到BLOB的对象再向里写:    
 
rs  =  stmt.executeQuery("select  detail  from  tb_file  where  name='aaa.gif'  for  upfdate"  );    
if(rs.next())    
{    
Blob  blob  =  rs.getBlob(1);    
BinaryOutputStream  out  =  ((oracle.sql.BLOB)blob).getBinaryOutputStream();    
byte[]  b  =  new  byte[((oracle.sql.BLOB)blob).getBufferSize];    
InputStream  fin  =  new  FileInputStream(file);    
int  len  =  0;    
while(  (len  =  fin.read(b))  !=  -1)    
out.write(b,0,len);    
fin.close();    
out.close();    
con.commit();    
}    
 
  同样读取数据你并不能象LONG  ROW那样    
 
InputStream  in  =  rs.getBinaryInputStream("detail");    
 
  而要    
 
Blob  blob  =  rs.getBlob("detail");    
in  =  blob.getBinaryStream();    
 
以上是转贴的一个关于大数据存储的方法  
 
在Oracle中  
假定有一张表  
lob_table(blob_col  Blob,  clob_col  clob)  
假定你创建了Statement  Object,  stmt  
 
//  Select  LOB  locator  into  standard  result  set.  
ResultSet  rs  =  
     stmt.executeQuery  ("SELECT  blob_col,  clob_col  FROM  lob_table");  
while  (rs.next())  
{  
     //  Get  LOB  locators  into  Java  wrapper  classes.  
     java.sql.Blob  blob  =  (java.sql.Blob)rs.getObject(1);  
     java.sql.Clob  clob  =  (java.sql.Clob)rs.getObject(2);  
     (...process...)  
}  
 
输出强制转换为java.sql.Blob  和  java.sql.Clob,  
你接下来可以强制转换成oracle.sql.BLOB  和  CLOB,以便利用  oracle.sql.*  中class的扩展功能,你可以这样转换  
 
     //  Get  LOB  locators  into  Java  wrapper  classes.  
     oracle.sql.BLOB  blob  =  (BLOB)rs.getObject(1);  
     oracle.sql.CLOB  clob  =  (CLOB)rs.getObject(2);  
     (...process...)  
 
You  can  use  a  BLOB  column  to  serialize  an  object  into  a  database.  There  is  a  problem  serializing  object  >  4K  into  the  db,  but  you  can  get  round  that  in  Oracle.  You  have  to  use  the  Oracle  JNDI  driver,  and  use  class  
oracle.sql.BLOB.  First  INSERT  the  a  new  row  using  the  EMPTY_BLOB()  
function  
e.g.  
 
                               INSERT  INTO  blob_table  VALUES  (  ...,  EMPTY_BLOB(),  ..)  
 
Then  do  a  SELECT  for  the  BLOB  column  on  that  row.  Use  the  ResultSet.getBlob()  function  to  get  an  oracle.sql.BLOB  object,  serialze  the  object  to  a  byte  array,  use  the  BLOB.setBytes()  function  so  set  the  contents  of  the  BLOB.  Then  you  can  UPDATE  the  previously  created  row,  with  your  BLOB  
containing  the  serialized  object  
 
Hope  this  file  can  answer  your  question  
 
我看了上面的这段英文资料!  
oracle自带的jar包class12.jar里好像没有Oracle  JNDI  driver.  
也不知道这个驱动是否支持URL的连接查询!  
 
我就是用的就是先插入空对象,在对其更新!  
可是上面的说,先将Blob序列化成字节数组,然后用Blob.setBytes()方法进行写入!!!  
 
我的问题是怎么将Blob类型的对象序列化,还有setBytes()有两个方法一个是:  
public  int  setBytes(long  pos,byte[]  bytes,int  offset,int  len)另一个是:  
public  int  setBytes(long  pos,byte[]  bytes)  
我没序列化对象,在调用这两个方法时出现异常:  
java.sql.SQLException:  不支持的特性  
           at  oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)  
           at  oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)  
           at  oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)  
           at  oracle.jdbc.dbaccess.DBError.throwUnsupportedFeatureSqlException(DBError.java:689)  
           at  oracle.sql.BLOB.setBytes(BLOB.java:954)  
能否告诉我怎么序列化Blob对象成字节数组和使用setBytes()!!  
非常感谢上面这个朋友的大力支持,花费您宝贵的休息时间,我再次表示衷心的感谢  
 
--------------------------------------------------------------  
郁闷死我了,这个问题困扰了我将近两周!!!  
现在终于解决了!!这个所谓类型转换异常主要是因为oracle.jdbc.driver.OracleDriver驱动不支持oracle8.17(具体版本号记不清了)及更高的版本的类型转换!  
到oracle网站去下载ojdbc.jar文件用它的驱动。  
便解决了类型转换异常!!!  
谢谢上面的朋友的大力支持!  
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值