加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

对oracle中BLOB字段读写的总结

(2009-08-21 01:23:21)
标签:

oracle

blob

阿堂

杂谈

分类: 数据库技术
     最近两天,阿堂在处理将页面中的文件上传和下载时,要将页面上,客户选择的任意类型上传的文件,写入到oracle中的BLOB类型的字段中,同时,客户也能下载上传的多个任意类型的文件,遇到了一些问题,也到网上查了不少资料,感觉网上的资料都或多或少有些错务,最后通过自己的反复测试总算解决了,解决的过程中,还真有不少收获,这里还是写下来,和朋友们分享一下!

以下是本人的几点总结,当然,上面的两个方法(上传和下载)中,本身已经加了注解了
1.个人感觉对于mysql中blob类型的字段,sql server中的image类型的字段,oracle中的blob类型的字段读写操作的方式是有区别的,既有相同点,也有不同点
2.mysql中的BLOB类型字段的读写,sql server中image类型的字段读写,oracle中的BLOB类型的字段的读写的比较(写对应的上传文件,读对应的下载文件)
对于mysql中的blob类型的字段和sql server中的image字段类型的写(文件上传),在插入insert操作时,
pst.setBinaryStream(1, fis, int(f.length()))这种类似的写法,基本上就可以将数据插入到其BLOB类型的字段中去了。
对于mysql中的blob类型的字段和sql server中image字段的读(文件下载)
mysql中 用 BLOB orderfile=rs.getBlob("order");得到输入流,再用输出流输出这些二进制就可以下载文件
sqlserver中用rs.getBinaryStream("orderfile");得到输入流,再用输出流输出这些二进制就可以下载文件

对于oracle中的写(上传文件)
第一步 先向BLOB字段中先插入一个空的BLOB值,用EMPTY_BLOB()
如 insert into Webfiles(PATH,FILENAME,USERNAME,JOB_NO,ORDERFILE) values(?,?,?,?,EMPTY_BLOB())
第二步再用select ...for update这种形式的语句来更新数据库中blob字段对应的值
如 select orderfile from Webfiles where Webfiles.job_no=? and Webfiles.filename=? for update
(更多细节请参照我上面贴的我项目中的源代码)

对于oracle中的读(下载文件)
第一步。得到数据库中的BLOB类型的字段
oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("orderfile");
第二步。将blob作为输入流,再通过输出流输出即可

in = new BufferedInputStream(blob.getBinaryStream());   
byte[] buf = new byte[1024]; 
int hasRead=0;
while((hasRead=in.read(buf))>0)
     
 sos.write(buf, 0, hasRead);

 

 

对oracle中BLOB字段读写的总结

对oracle中BLOB字段读写的总结 

对oracle中BLOB字段读写的总结

 

对oracle中BLOB字段读写的总结

 

 //上传文件
 public synchronized  boolean insert_Wfiles(WebfilesBean wb) throws IOException, SQLException
  
   
  boolean flag=false;
  //得到文件输入流
  String filePath = wb.getPath() + "\\" + wb.getFilename();
  File f = new File(filePath);
  InputStream fis = new FileInputStream(f);
  //定义输入流和输出流
  BufferedOutputStream out=null;
  BufferedInputStream in=null ;
  //插入一个空的Blob值
  String str1 = "insert into Webfiles(PATH,FILENAME,USERNAME,JOB_NO,ORDERFILE) values(?,?,?,?,EMPTY_BLOB())";  
  ResultSet rs=null;
  PreparedStatement pst = null;  
  try {
//   这里一定要手工设置控制事务
   conn.setAutoCommit(false);
   pst = conn.prepareStatement(str1);
   pst.setString(1,ConvertString.converString1(filePath));
   pst.setString(2, ConvertString.converString1(wb.getFilename()));
   pst.setString(3, ConvertString.converString1(wb.getUsername()));
   pst.setString(4, wb.getJobno());     
   pst.executeUpdate();
   
   
   String str2="select orderfile from Webfiles where Webfiles.job_no=? and Webfiles.filename=? for update";
   pst=conn.prepareStatement(str2);
   pst.setString(1, wb.getJobno()); 
   pst.setString(2, wb.getFilename());   
   rs=pst.executeQuery();
   while (rs.next())
       
    
    oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("orderfile");       
    
    out = new BufferedOutputStream(blob.getBinaryOutputStream());
    
    in = new BufferedInputStream(fis);
    int c;
    //将实际文件中的内容以二进制的形式来输出到BLOB对象对应的输出流中
    while ((c=in.read())!=-1)
        
     out.write(c);
    }
    in.close();
    out.close();
     
    conn.commit();  
   if (f.exists())
    f.delete();   
   flag=true;
   return flag;
  } catch (SQLException e)
    
   conn.rollback();
   e.printStackTrace();
   System.out.println("插入数据不成功");
   return false;
  } finally {
   pst.close();   
   fis.close();   
  }
 }
 
 //下载文件
 public  void getdownFile1(String jobno,String filename,ServletOutputStream sos) throws Exception
  
  ResultSet rs=null;
  PreparedStatement pst = null;
  BufferedInputStream in=null;
  try
   
   //这里一定要手工设置控制事务
   conn.setAutoCommit(false);
   String str="SELECT orderfile from Webfiles wf where wf.job_no=? and wf.filename=?";
   pst = conn.prepareStatement(str);
   pst.setString(1, jobno);
   pst.setString(2, filename);
   rs=pst.executeQuery();   
   while (rs.next())
     
    oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("orderfile");
    
    in = new BufferedInputStream(blob.getBinaryStream());   
    byte[] buf = new byte[1024]; 
    int hasRead=0;
    while((hasRead=in.read(buf))>0)
         
     sos.write(buf, 0, hasRead);
       
    in.close();
    sos.close();
   }
   conn.commit();
   conn.setAutoCommit(true);   
  }
  catch(Exception e)
  {
   conn.rollback();
   e.printStackTrace();
  }
  finally
  
   if (pst != null)
   {
    pst.close();
   
   if (rs != null)
   {
    rs.close();
     
   
 }
 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有