摘要:該文在ASP.NET平臺上使用C#編程,通過ADO.NET訪問Oracle后臺數據庫,詳細介紹了存取Oracle數據表中的BLOB數據的方法,并闡述了其工作原理及實現過程。
關鍵詞:.NET平臺;C#;BLOB數據;Oracle數據庫
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)32-8877-02
Methods to Access BLOB Data of Oracle Database in C#
HUANG Sheng-zhong
(Liuzhou Teachers College, Liuzhou 545003, China)
Abstract: This paper programmed with C# on ASP.NET platform and visited the Oracle database through ADO.NET and introduced the method in which users’ access to BLOB data in the Oracle table, and described its working principle and the implementation process.
Key words: .NET platform; C#; BLOB data; oracle database
1 概述
在許多MIS系統中,經常需要存儲圖像、電子文檔、音頻和視頻等多媒體數據,這些數據的數據量很大,具有不規則性,通常被稱作BLOB[1-2]。目前,大多數的DBMS產品都對BLOB數據提供了有力的支持,如Oracle中的Long Binary類型。
BLOB全稱為Binary Large Objects,即大型的、不定的二進制對象,或者字符型數據,通常是文檔(*.txt、*.doc)和圖片(*.jpeg、*.gif、*.bmp)。
設計中常見的問題是將數據存儲在數據庫中還是存儲在文件系統中。存儲在文件系統中的設計比較簡單,只是把文件位置和文件名存放在數據庫中,即在數據庫表中設計一個Text類型的字段來存放這些信息。但缺點是顯而易見的:一方面是在發布應用程序時所有的數據文件都要同時發布出去,并且還要注意路徑的更新;另一方面數據有隨時丟失、被查看、更改的危險[3]。因此在大多數情況下,最好把這些大型二進制數據與其他數據一起存在數據庫中。主要有以下幾個優點:首先,這種存放方式非常便于管理,BLOB數據存放在Oracle數據庫,可以通過Oracle所提供的高效、安全的管理機制對BLOB數據進行存儲和管理,避免了人工管理BLOB數據所帶來的額外開銷,此外,利用oracle數據庫的備份恢復機制,也大大提高了BLOB數據存儲的安全性。同時,BLOB字段可以根據實際內容的長度來占用存儲空間,這一特點大大節省了信息存儲空間的開銷;其次,這種存放形式保證了數據的一致性,BLOB數據和其他數據的插入、更新、刪除都在同一個事務中實現,這樣就保證了文件與數據庫之間的一致性;最后,這種存放形式,還可以實現數據的共享,便于網絡開發。
2 工作原理
在C#中,對數據庫中的BLOB數據進行操作之前,首先對其進行 “初始化”操作,即將其置為空BLOB[4-5]。Oracle提供了EMPTY_BLOB()函數對BLOB字段進行初始化操作。可以通過在INSERT語句中插入EMPTY_BLOB()函數,實現在一張表中插入一條新記錄,并將BLOB字段初始化為空BLOB。初始化操作后,即可利用Oracle提供的DBMS_LOB函數包對BLOB數據進行讀取和寫入。
從數據庫中讀取BLOB數據時,使用 Oracle.DataAccess.Types.OracleBlob類的存儲使用OracleDataReader的GetOracleBlob() 方法讀取的定位器,然后使用Read() 方法訪問 OracleBlob 中的數據[6]。往數據庫中寫BLOB數據時,調用OracleDataReader 的GetOracleBlobForUpdate() 方法,將 FOR UPDATE 子句添加到 SELECT 語句,然后調用GetOracleBlob() 方法取得 BLOB,然后使用OracleBlob對象的 Write() 方法寫入 BLOB中,其工作原理如圖1所示。
3 數據庫的設計與連接配置
3.1 數據庫設計
本文使用Oracle作為后臺數據庫系統。在Image數據庫System方案中的Imgspace表空間建立ImgTable表來存儲BLOB類型數據(圖片、文檔等),其結構如表1所示,其中,Product_id字段是圖片所對應的產品信息表中的產品ID,其值通過相應頁面的文本框productid.Text獲得。
3.2 數據庫連接配置
為了與數據庫相連,需要在Web應用程序的配置文件web.config中配置數據庫連接字符串:
//定義Oracle數據庫連接字符串(數據庫名、用戶名和密碼)
由于Web頁面獲取連接字符串時需要使用的類ConfigurationSettings被包含在System.Configuration命名空間中,因此需要引入該命名空間。頁面獲取連接字符串的程序代碼如下:
Using System.Configuration;//引入命名空間
Private string ORACLECONNSTR=ConfigurationSettings.AppSettings
[“ConnectionString”].ToString();//獲取連接字符串
OracleClient是為Oracle特別定制的數據提供程序,用于訪問Oracle數據源。但默認情況下,VS2005并不加載這個組件資源,因此,需要把System.Data.OracleClient.dll文件拷貝到項目解決方案的\\Bin文件夾下,然后引入此命名空間:Using System.Data.OracleClient。
4 應用程序設計與實現
4.1 寫入BLOB數據的應用設計
寫入BLOB類型的圖片或文檔數據時,可以通過VS2005提供的控件FileUpload的屬性PostedFile.ContentLength獲取上傳文件字節大小,PostedFile.FileName獲取上傳文件文件名,PostedFile.ContentType獲取上傳文件類型[7]。然后使用Stream流對象讀取上傳文件數據到一個字節數組中,再將該字節數組數據存儲到Oracle數據庫中。具體步驟如下:
1) 在ASPX頁面布局:1個FileUpload控件,命名為FileUp;1個button按鈕,命名為BtnSave(保存);1個Label控件,命名為FileLabel,用來顯示上傳文件的類型、大小和提示信息等。
2) 在BtnSave_Click()事件中建立connection和command對象,使用ADO.NET訪問數據庫,用Stream流讀取數據內容到pic數組,保存BLOB數據到Oracle數據庫。
4.2 讀取BLOB數據的應用設計
在數據庫中,圖片的保存方法與文本數據的保存方法不同。文本數據可以直接在數據庫中查看,而圖片數據是以二進制方式保存,查看時必須使用Stream流的Read方法讀出圖片數據,同時需要引入輸入輸出接口命名空間:System.IO[8]。為實現高效地訪問數據,還需要編寫自定義HTTP處理程序創建進程,并返回動態創建的內存流數據[9]。在項目中,使用Datalist控件綁定要即時顯示的圖片。
1) 在需要顯示圖片的ASPX頁面上布局一個Datalist控件,在

利用自定義HTTP處理程序類Handler處理HTTP Web請求。
2) 由于內存流MemoryStream可有效降低應用程序對臨時緩沖區和臨時文件的需求,且與其他流相比,執行I/O操作的速度和效率高得多,因此可以利用Handler類的同步處理HTTP Web請求的函數ProcessRequ est,將圖片數據用內存流MemoryStream讀取顯示出來。
5 小結
該文對關系數據庫系統中的BLOB數據的存取策略進行了分析,并在.NET平臺上使用C#編程實現了對Oracle數據庫BLOB數據的存儲和讀取。該方法對聲音、視頻、文檔、動畫等其他BLOB類型數據同樣適用,具有實際的參考價值和意義。
參考文獻:
[1] 蘇貴洋,黃穗.ASP.NET網絡編程從基礎到實踐[M].北京:電子工業出版社,2006.
[2] Watson K,Nagel C.C#入門經典[M].3版.北京:清華大學出版社,2006.
[3] 高曉兵.基于數據倉庫的質量信息系統關鍵技術研究[D].西安:西北工業大學,2005.
[4] 楊勇.數據庫系統中BLOB對象的管理[J].微電子學與計算機,2006,23(7):148-150.
[5] 楊光年,胡昌平,李方泉.Net企業應用架構技術探討[J].淮海工學院學報:自然科學版,2008,17(2):31-34.
[6] 孟現飛,李浩,孫統風.ADO.NET數據訪問模型研究[J].微機發展,2003,13(6):94-98.
[7] 楊勇.數據庫系統中BLOB對象的管理[J].微電子學與計算機,2006,23(7):148-150.
[8] Kauffman J,Matsik B.Beginning ASP.NET Databases Using C#[M].[S.l.]:Wrox Press Ltd.,2002.
[9] 楊光年,胡昌平,李方泉.Net企業應用架構技術探討[J].淮海工學院學報:自然科學版,2008,17(2):31-34.