導讀:
運用C#處理lob數據類型(Oracle)
一、 介紹不規則數據類型
隨著媒體技術的進步,人們的要求也越來越多,因此現在的數據庫中不單單存儲簡單的數據類型,還可以存儲圖片、文件、聲音等非常龐大的二進制數據,我們把這種不規則數據類型叫做LOB(Large Object)。對於LOB數據即可以存儲50K還可以存儲50M的二進制數據內容。
Oracle數據庫中,大型數據類型有以下幾種:
Clob:和long型相似,clob可以存儲單字節型數據
Nclob:Nclob存儲定寬的多字節國家字符集數據
Blob:可以存儲無結構的二進制數據如圖片
Bfile:Bfile允許對Oracle數據庫以外存儲的大型二進制文件進行只讀形式的訪問。和其它三種lob類型數據不同的是,bfile類型數據存儲在一個單獨的文件中,該文件不由Oracle來維護。
在這裡主要介紹運用C#儲存和讀取圖片(數據庫Oracle)。
二、 處理Blob數據項的方式
1.首先介紹數據表結構
表:student
字段名 類型 說明
STUDENTID number id關鍵字段
SNAME varchar2(50) 姓名
SPHOTO Blob 圖片
定義了序列SEQ_STUDENT_ID
2.接著介紹存儲Blob數據項方式
注意:Blob數據不能象其它類型數據一樣直接插入(INSERT)。插入前必須先插入一個空的Blob對象,BLOB類型的空對象為EMPTY_BLOB(),之後通過SELECT命令查詢得到先前插入的記錄並鎖定,繼而將空對象修改為所要插入的Blob對象。
⑴ 調用儲存過程方式
http://www.cnblogs.com/surprise/archive/2005/04/19/140461.Html
優點:層次清晰明了,存儲速度快
缺點:運用dbms_lob包用dbms_lob.write()寫入只能存儲32k以下的圖片
⑵ 另一種調用儲存過程方式
在Oracle中寫存儲過程如下:
create or replace procedure update_student_clob (
id in number,
file_name in varchar2)
is
b_lob BLOB;
f_lob BFILE;
BEGIN
--首先把SPHOTO數據插入空值
Update student set SPHOTO=empty_blob() where STUDENTID=id;
--通過SELECT命令查詢得到先前插入的記錄並鎖定
SELECT SPHOTO INTO b_lob from student where STUDENTID=id for update;
--讀取圖片文件對象
f_lob:=bfilename(‘bb_images’, file_name);
--打開圖片文件對象
dbms_lob.fileopen(f_lob,dbms_lob.file_readonly);
--把圖片文件對象寫入Blob數據中
dbms_lob.loadfromfile(b_lob,f_lob,dbms_lob.getlength(f_lob));
dbms_lob.fileclose(f_lob);
END;
/
其中:id代表關鍵字段id,file_name代表文件名
bb_images代表目錄對象,目錄對象創建如下
create directory bb_images as ‘d:\kk’;
在C#中的代碼部分與
http://www.cnblogs.com/surprise/archive/2005/04/19/140461.Html雷同,在這裡就不必多說了
優點:無論多大的圖片都能處理,速度上也非常快
缺點:只能存儲數據庫本地的圖片
⑶ 不用儲存過程的方式
原代碼ConsoleApplication2.rar (推薦,在我們公司項目中就用到了)
優點:解決了所有以上的缺點
缺點:破壞了項目的層次感
3.是用C#的代碼方式
//利用傳參數
OracleConnection Con = new System.Data.OracleClIEnt.OracleConnection(strCon);
Con.Open();
//自己用時,替換自己的sql語句
string cmdText="insert into xmgl_wd(pk_wdbh,wdmc,lbbh,wdnr,wdfjdz,wdsj,istj) values (XMGL_WD_SEQ.Nextval,''"+wdmc+"'',''"+lbbh+"'',:pb,''"+wdfjdz+"'',"+str_add_wdsj+",''"+istj+"'')";
OracleCommand cmd = new OracleCommand(cmdText,Con);
OracleParameter op = new OracleParameter("pb",OracleType.Clob);
op.Value = wdnr;
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();
Con.Close();
4.最後介紹讀取Blob數據項方式
原代碼WebImage.rar 讀取圖片的方式比較簡單,首先把Blob從數據庫中讀取出來,接著生成圖片格式,最後輸出圖片就行。
以上的方式都是試驗成功,如果哪位大蝦有更好的方式請隨時交流哦
本文轉自
http://www.cnblogs.com/surprise/archive/2005/06/27/182057.Html