0734w-月下竹音

          0734是來自家鄉的聲音

          常用鏈接

          統計

          最新評論

          Blob字段

           從CSDN上看到的感覺挺有用的

                最近幾次碰到這個問題,需求是將一個文件或者文件流存儲到Oracle數據庫里,
          Oracle8提供了Blob和Clob用來存儲二進制大對象數據,可是它和Java.sql.里面的Blob
          不兼容,經常導致Blob字段無法鎖定或者操作失敗,總之我總結了一些經驗
          大家共享
          首先建立測試數據表
           drop table filelist;
           commit;
           
           CREATE TABLE SYSTEM.FILELIST (
           "FILENAME" VARCHAR2(50) NOT NULL,
           "FILESIZE" NUMBER(20)  NULL,
           "FILEBODY" BLOB  NULL, 
           PRIMARY KEY("FILENAME"), UNIQUE("FILENAME")) ;
           commit;


                 測試過程,首先將硬盤文件讀入數據庫,然后再讀出到硬盤的另一個新文件里,原碼如下:


          /**
          * @author 秋南(Ryan)
          * @email  guoyf@sinosoft.com.cn
          * @version 2002 1 14
          */
          import java.io.*;
          import java.util.*;
          import java.sql.*;
          import oracle.sql.*;
          import oracle.jdbc.driver.*;
          import java.text.*;

          public class test
          {
           public static void main(String args[]) throws java.io.IOException,java.sql.SQLException
           {
            dbBean db1=new dbBean();
            /**
            *這里是我的數據聯接Bean
            *大家可以用自己的連接Bean
            */
            byte a[]=null;//**將測試文件test.doc讀入此字節數組
            java.io.FileInputStream fin=null;
            java.io.FileOutputStream fout=null;
            oracle.jdbc.OracleResultSet ors=null;//**這里rs一定要用Oracle提供的
            oracle.jdbc.driver.OraclePreparedStatement opst=null;//**PreparedStatement用

                                                                                        //Oracle提供的
             
            try
            {
             
             java.io.File f1=new java.io.File("c:/temp/test.doc");
             java.io.File f2=new java.io.File("c:/temp/testout.doc");//**從BLOB讀出的信息寫

                                                                           //入該文 件,和源文件對比測試用
             fin=new java.io.FileInputStream(f1);
             fout=new java.io.FileOutputStream(f2);
             
             
             int flength=(int)f1.length();//**讀入文件的字節長度
             System.out.println("file length::"+flength);
             a=new byte[flength];
             
             int i=0;int itotal=0;
             /**將文件讀入字節數組
             for (;itotal<flength;itotal=i+itotal )
             {
              
              i=fin.read(a,itotal,flength-itotal);
              
             }
             fin.close();
             
             System.out.println("read itotal::"+itotal);
            /**注意Oracle的 BLOB一定要用EMPTY_BLOB()初始化 
            String mysql="insert into filelist (FileName,FileSize,FileBody) values (?,?,EMPTY_BLOB())";
            opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql);
                   opst.setString(1,"wordtemplate");
                     opst.setInt (2,flength);
                   opst.executeUpdate();
                   opst.clearParameters();
                   /**插入其它數據后,定位BLOB字段
                     mysql="select filebody from filelist where filename=?";
                     opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql);
                     opst.setString(1,"wordtemplate");
                     ors=(oracle.jdbc.OracleResultSet)opst.executeQuery();
                     if (ors.next())
                     {
                    
                     oracle.sql.BLOB blob=ors.getBLOB(1);/**得到BLOB字段          
                     int j=blob.putBytes(1,a);/**將字節數組寫入BLOB字段
                     System.out.println("j:"+j);
                               
                     db1.conn.commit();
                     ors.close();
                     }        
                    
               System.out.println("insert into ok");
              
              byte b[]=null;/**保存從BLOB讀出的字節
              opst.clearParameters();
                     mysql="select filebody from filelist where filename=?";
                     opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql);
                     opst.setString(1,"wordtemplate");
                     ors=(oracle.jdbc.OracleResultSet)opst.executeQuery();
                     if (ors.next())
                     {
                     oracle.sql.BLOB blob2=ors.getBLOB(1); 
                    
                     System.out.println("blob2 length:"+blob2.length());
                     b=blob2.getBytes(1,flength);/**從BLOB取出字節流數據
                     System.out.println("b length::"+b.length);
                     db1.conn.commit();
                     } 
                     ors.close();
                     /**將從BLOB讀出的字節寫入文件
                     fout.write(b,0,b.length);
                     fout.close();  
              
               System.out.println("write itotal::"+b.length);
                          
             
            }
            catch(Exception e)
            {
             System.out.println("errror :"+e.toString() );
             e.printStackTrace();
             
            }
            finally
            { /**關閉所有數據聯接
             stmt.close();
             db1.closeConn();
            }
            

            
           }
          }
              編譯運行在TomCat下調試通過。
              需要注意的是Blob存取的過程,一般先存入和BLOB相關的控制數據,如文件的名字,
              然后查詢定位BLOB字段,利用OracleBlob提供的方法:
              public int putBytes(long pos,byte bytes[])
              public byte[]  getBytes(long pos,byte bytes[])
              或者利用
              public OutputStream getBinaryOutputStream() throws SQLException
              public InputStream  getBinaryStream() throws SQLException
             因為利用輸入輸出流總歸還是利用到字節數組緩沖流,所以就不舉例子了。

          posted on 2005-09-01 21:57 sparkwu 閱讀(521) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 九寨沟县| 灵寿县| 冀州市| 太白县| 玉溪市| 建始县| 鄱阳县| 榆树市| 内江市| 北海市| 永昌县| 新昌县| 西充县| 高陵县| 绥化市| 安庆市| 竹溪县| 治县。| 长垣县| 黄石市| 咸丰县| 东阳市| 宁津县| 乐陵市| 江山市| 左云县| 七台河市| 垣曲县| 夏河县| 富顺县| 永福县| 泰州市| 迁西县| 耒阳市| 安泽县| 于都县| 西和县| 灌南县| 揭东县| 宜兰县| 栾川县|