運用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類型的Null 物件為EMPTY_BLOB(),之後通過SELECT命令查詢得到先前插入的記錄並鎖定,繼而將Null 物件修改為所要插入的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.最後介紹讀取Blob資料項目方式
原代碼WebImage.rar 讀取圖片的方式比較簡單,首先把Blob從資料庫中讀取出來,接著產生圖片格式,最後輸出圖片就行。
以上的方式都是實驗成功,如果哪位大蝦有更好的方式請隨時交流哦