日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Oracle數(shù)據(jù)庫(kù)中BLOB字段的存取問(wèn)題

以下的文章主要是對(duì)Oracle數(shù)據(jù)庫(kù)中BLOB字段的存取問(wèn)題的介紹,我在經(jīng)常會(huì)碰到Oracle數(shù)據(jù)庫(kù)中BLOB字段的存取這一問(wèn)題,需求是將一個(gè)文件或者文件流存儲(chǔ)到Oracle數(shù)據(jù)庫(kù)里,Oracle8提供了Blob和Clob用來(lái)存儲(chǔ)二進(jìn)制大對(duì)象數(shù)據(jù)。

勃利網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,勃利網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為勃利上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的勃利做網(wǎng)站的公司定做!

可是它和Java.sql.里面的Blob不兼容,經(jīng)常導(dǎo)致Blob字段無(wú)法鎖定或者操作失敗,總之我總結(jié)了一些經(jīng)驗(yàn)大家共享。

首先建立測(cè)試數(shù)據(jù)表

 
 
 
  1. drop table filelist;  
  2. commit;  
  3. CREATE TABLE SYSTEM.FILELIST (  
  4. "FILENAME" VARCHAR2(50) NOT NULL,  
  5. "FILESIZE" NUMBER(20) NULL,  
  6. "FILEBODY" BLOB NULL,  
  7. PRIMARY KEY("FILENAME"), UNIQUE("FILENAME")) ;  
  8. commit;  

 

測(cè)試過(guò)程,首先將硬盤(pán)文件讀入Oracle數(shù)據(jù)庫(kù),然后再讀出到硬盤(pán)的另一個(gè)新文件里,原碼如下:

 
 
 
  1. import java.io.*;  
  2. import java.util.*;  
  3. import java.sql.*;  
  4. import oracle.sql.*;  
  5. import oracle.jdbc.driver.*;  
  6. import java.text.*;  
  7. public class test  
  8. {  
  9. public static void main(String args[]) throws java.io.IOException,java.sql.SQLException  
  10. {  
  11. dbBean db1=new dbBean();  
  12. /**  

 

*這里是我的數(shù)據(jù)聯(lián)接Bean

*大家可以用自己的連接Bean

 
 
 
  1. */  
  2. byte a[]=null;  

 

**將測(cè)試文件test.doc讀入此字節(jié)數(shù)組

 
 
 
  1. java.io.FileInputStream fin=null;  
  2. java.io.FileOutputStream fout=null;  
  3. oracle.jdbc.OracleResultSet ors=null;  

 

**這里rs一定要用Oracle數(shù)據(jù)庫(kù)提供的

 
 
 
  1. oracle.jdbc.driver.OraclePreparedStatement opst=null; 

**PreparedStatement用

Oracle提供的

 
 
 
  1. try  
  2. {  
  3. java.io.File f1=new java.io.File("c:/temp/test.doc");  
  4. java.io.File f2=new java.io.File("c:/temp/testout.doc");  

**從BLOB讀出的信息寫(xiě)

//入該文件,和源文件對(duì)比測(cè)試用

 
 
 
  1. fin=new java.io.FileInputStream(f1);  
  2. fout=new java.io.FileOutputStream(f2);  

 

int flength=(int)f1.length();//**讀入文件的字節(jié)長(zhǎng)度

 
 
 
  1. System.out.println("file length::"+flength);  
  2. a=new byte[flength];  
  3. int i=0;int itotal=0;  

 

/**將文件讀入字節(jié)數(shù)組

 
 
 
  1. for (;itotal
  2. {  
  3. i=fin.read(a,itotal,flength-itotal);  
  4. }  
  5. fin.close();  
  6. System.out.println("read itotal::"+itotal);  

 

/**注意Oracle數(shù)據(jù)庫(kù)的 BLOB一定要用EMPTY_BLOB()初始化

 
 
 
  1. String mysql="insert into filelist (FileName,FileSize,FileBody) values (?,?,EMPTY_BLOB())";  
  2. opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql);  
  3. opst.setString(1,"wordtemplate");  
  4. opst.setInt (2,flength);  
  5. opst.executeUpdate();  
  6. opst.clearParameters();  

 

/**插入其它數(shù)據(jù)后,定位BLOB字段

 
 
 
  1. mysql="select filebody from filelist where filename=?";  
  2. opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql);  
  3. opst.setString(1,"wordtemplate");  
  4. ors=(oracle.jdbc.OracleResultSet)opst.executeQuery();  
  5. if (ors.next())  
  6. {  

 

oracle.sql.BLOB blob=ors.getBLOB(1);/**得到BLOB字段

int j=blob.putBytes(1,a);/**將字節(jié)數(shù)組寫(xiě)入BLOB字段

 
 
 
  1. System.out.println("j:"+j);  
  2. db1.conn.commit();  
  3. ors.close();  
  4. }  
  5. System.out.println("insert into ok");  

 

byte b[]=null;/**保存從BLOB讀出的字節(jié)

 
 
 
  1. opst.clearParameters();  
  2. mysql="select filebody from filelist where filename=?";  
  3. opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(mysql);  
  4. opst.setString(1,"wordtemplate");  
  5. ors=(oracle.jdbc.OracleResultSet)opst.executeQuery();  
  6. if (ors.next())  
  7. {  
  8. oracle.sql.BLOB blob2=ors.getBLOB(1);  
  9. System.out.println("blob2 length:"+blob2.length());  

 

b=blob2.getBytes(1,flength);/**從BLOB取出字節(jié)流數(shù)據(jù)

 
 
 
  1. System.out.println("b length::"+b.length);  
  2. db1.conn.commit();  
  3. }  
  4. ors.close();  

 

/**將從BLOB讀出的字節(jié)寫(xiě)入文件

 
 
 
  1. fout.write(b,0,b.length);  
  2. fout.close();  
  3. System.out.println("write itotal::"+b.length);  
  4. }  
  5. catch(Exception e)  
  6. {  
  7. System.out.println("errror :"+e.toString() );  
  8. e.printStackTrace();  
  9. }  
  10. finally  

 

{ /**關(guān)閉所有數(shù)據(jù)聯(lián)接

 
 
 
  1. stmt.close();  
  2. db1.closeConn();  
  3. }  
  4. }  
  5. }  

 

編譯運(yùn)行在TomCat下調(diào)試通過(guò)。

需要注意的是Blob存取的過(guò)程,一般先存入和BLOB相關(guān)的控制數(shù)據(jù),如文件的名字,然后查詢定位BLOB字段,利用Oracle數(shù)據(jù)庫(kù)Blob提供的方法:

 
 
 
  1. public int putBytes(long pos,byte bytes[])  
  2. public byte[] getBytes(long pos,byte bytes[])  

 

或者利用

 
 
 
  1. public OutputStream getBinaryOutputStream() throws SQLException  
  2. public InputStream getBinaryStream() throws SQLException  

 

因?yàn)槔幂斎胼敵隽骺倸w還是利用到字節(jié)數(shù)組緩沖流,所以就不舉例子了。


網(wǎng)頁(yè)名稱:Oracle數(shù)據(jù)庫(kù)中BLOB字段的存取問(wèn)題
網(wǎng)頁(yè)路徑:http://m.5511xx.com/article/dhghcii.html