歐陽艷階,王家旭
(十堰職業(yè)技術(shù)學(xué)院 信息與智能工程系,湖北 十堰 442000)
隨著計算機(jī)軟件在各個行業(yè)的應(yīng)用發(fā)展,管理信息系統(tǒng)成為必不可少的管理工具。在管理信息系統(tǒng)中,圖像存取成為必不可少的信息處理要求。如照片、醫(yī)用影像、工程圖紙掃描圖像、地圖等。然而圖像信息所含的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)大于普通數(shù)據(jù)的數(shù)據(jù)量。如何在管理信息系統(tǒng)中存取圖像也是程序員在開發(fā)過程中要解決的關(guān)鍵問題。
本文結(jié)合筆者開發(fā)的汽車零部件管理信息系統(tǒng)中汽車及零部件圖像的存取功能,給出了圖像的兩種存儲及讀取方法,并使用C#.Net開發(fā)工具實現(xiàn)了圖像在SQL Server 2005數(shù)據(jù)庫中的存儲和讀取操作。
通常程序員在解決管理信息系統(tǒng)中圖像的存取問題時主要采用兩種方法。一是將圖像以數(shù)據(jù)庫方式存儲;二是將圖像以文件系統(tǒng)存儲。這兩種方式各有優(yōu)缺點,其使用環(huán)境也有差別。
這種圖像存取方式優(yōu)點有以下幾個方面:
(1)管理方便。當(dāng)圖像與其他數(shù)據(jù)一同存儲在數(shù)據(jù)庫中時,圖像與其他數(shù)據(jù)能共同備份和復(fù)原。從而避免了普通數(shù)據(jù)與圖像數(shù)據(jù)的不同步,并且避免了其他用戶無意中誤操作圖像的風(fēng)險。
(2)共享與查詢效率高。將圖像存儲在SQL Server數(shù)據(jù)庫中可以與其他數(shù)據(jù)一樣,同時完成插入、修改、刪除和查詢操作,保證圖像與普通數(shù)據(jù)的一致性。同時操作員可以在任何時間任何地點任何一部終端上打開數(shù)據(jù)庫并使用圖像數(shù)據(jù),大大提高圖像數(shù)據(jù)的共享、查詢效率。
(3)提高圖像安全性。圖像存儲到SQL Server數(shù)據(jù)庫中以后,其安全性,特別是遠(yuǎn)程訪問安全性將由SQL Server提供的安全保證機(jī)制來實現(xiàn),大大提高圖像訪問控制的強(qiáng)度。
但將圖像存儲于數(shù)據(jù)庫方式也存在著以下缺陷:
(1)圖像放在數(shù)據(jù)庫中不便于修改編輯。
(2)數(shù)據(jù)庫讀取數(shù)據(jù)時的I/O消耗比較大。
使用文件系統(tǒng)存儲是指將圖像存儲在文件中,將文件的路徑信息存儲在數(shù)據(jù)庫中,通過數(shù)據(jù)庫中的路徑信息來完成存儲在指定的文件夾中的文件操作。
這種圖像方式有以下優(yōu)點:
(1)圖像編輯簡單方便。編輯圖像時使用工具軟件對圖像進(jìn)行直接編輯、存儲,只與硬盤打交道,不涉及數(shù)據(jù)庫和其他服務(wù)功能,簡單方便。
(2)節(jié)省數(shù)據(jù)庫空間,有效地避免了數(shù)據(jù)庫的膨脹。
但是,這種方式需要借助文件系統(tǒng)實現(xiàn)。其最大的缺點是文件系統(tǒng)的安全保護(hù)措施比較脆弱,可能會造成圖像信息的不良復(fù)制、修改、刪除及誤操作。
.NET平臺下SQL Server常見的數(shù)據(jù)驅(qū)動類在System.Data.SqlClient類庫中,本文SQL Serv-er圖像存取功能的實現(xiàn)必須使用以下兩個類。
(1)SqlConnection類。SqlConnection類用于連接數(shù)據(jù)庫,它代表數(shù)據(jù)庫和數(shù)據(jù)用戶之間的實際連接。這個對象中包含有用于打開和關(guān)閉連接的方法,并且還包含有描述當(dāng)前連接狀態(tài)的屬性。Sql-Connection類的語法格式如下:SqlConnection conn=new SqlConnection(“Server=服務(wù)器標(biāo)識;Data-Base=數(shù)據(jù)庫名稱;Uid=用戶名稱;pwd=密碼;”);
Server:目標(biāo)服務(wù)器IP,若為本機(jī)可使用“.”或“(Local),”;
DataBase:目標(biāo)數(shù)據(jù)庫名稱 ;
Uid或User ID,連接數(shù)據(jù)庫的用戶名;
Pwd或Password:連接數(shù)據(jù)庫的密碼。
(2)SqlCommand類。SqlCommand類是數(shù)據(jù)庫命令的封裝。這個命令既可以是SQL語句,又可以是存儲過程。SqlCommand類可以重置CommandText屬性并重復(fù)使用SqlCommand對象。SqlCommand類特別提供了對SQL Server數(shù)據(jù)庫執(zhí)行命令的方法。ExecuteReader方法執(zhí)行有返回行的命令,該方法需要設(shè)定SQLDataReader對象接受返回結(jié)果;ExecuteNonQuery方法執(zhí)行如INSERT、DELELE、UPDATE語句等無返回結(jié)果的命令;ExecuteScalar方法從數(shù)據(jù)庫中檢索單個值(例如一個聚合值);ExecuteXmlReader方法將CommandText發(fā)送到Connection并生成一個XmlReader對象。
FileStream類是以文件輸入輸出為主的Stream,既支持同步讀寫操作,也支持異步讀寫操作,其命名空間為System.IO。FileStream對象可以通過URL指定的簡單文件打開硬盤中的圖像文件,其作用是提供通用文件訪問功能。在各種數(shù)據(jù)庫文件訪問中,F(xiàn)ileStream以其易于使用、熟悉的界面、高速度以及較低的內(nèi)存占用,成為目前操作最方便的數(shù)據(jù)訪問技術(shù)。
FileStream對象提供文件讀取、寫入以及管理字節(jié)流的手段。該字節(jié)流可以是文本或二進(jìn)制數(shù),并且在大小方面只受限于系統(tǒng)資源。
在SQL Server數(shù)據(jù)庫中,小于8 000字節(jié)的圖像數(shù)據(jù)可以用二進(jìn)制型(binary、varbinary)來表示。對于大于8 000個字節(jié)的圖像,SQL Server提供二進(jìn)制大對象(BLOB)進(jìn)行存儲。Image數(shù)據(jù)類型即是BLOB對象的一種,用于存儲二進(jìn)制類型數(shù)據(jù),比如:圖像、視頻、可執(zhí)行文件等。C#中Image類提供了位圖和元文件操作的函數(shù),該類的圖像處理方法有以下三種:
(1)FromFile方法。它根據(jù)輸入的文件名產(chǎn)生一個Image對象,其函數(shù)形式包括public static Image FromFile(string filename)和public static Image FromFile(string filename,bool useEmbedded-ColorManagement)兩種;
(2)FromHBitmap方法。它從一個 windows句柄處創(chuàng)建一個bitmap對象,其函數(shù)形式包括public static bitmap fromhbitmap(intptr hbitmap)和public static bitmap fromhbitmap(intptr hbitmap,intptr hpalette)兩種;
(3)FromStream方法。從一個數(shù)據(jù)流中創(chuàng)建一個image對象,其函數(shù)形式包括public static image fromstream(stream stream)、public static image fromstream(stream stream,bool useembeddedcolormanagement) 和 fromstream (stream stream,bool useembeddedcolormanagement,bool validateimagedata)三種。
筆者結(jié)合“汽車零部件管理”的開發(fā),詳細(xì)介紹C#.Net+SQL Server數(shù)據(jù)庫圖像存取的實現(xiàn)方法。
創(chuàng)建數(shù)據(jù)庫“AutoManageDB”,并創(chuàng)建表“AutoPhotoTable”,表結(jié)構(gòu)設(shè)計為:(PictureID int;PictureContent Image;PictureText varchar(50))。在數(shù)據(jù)庫設(shè)計中,設(shè)計圖像字段PictureContent的類型為Image,存儲二進(jìn)制數(shù)據(jù);設(shè)計圖像描述字段PictureText為varchar(50),用于存儲圖像的查詢關(guān)鍵字。
在使用SQL Server數(shù)據(jù)庫進(jìn)行圖片存儲時,首先將圖像文件轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),并保存在內(nèi)存。然后建立與數(shù)據(jù)庫的連接,使用SqlCommand類的Insert語句將圖像插入數(shù)據(jù)庫中表的指定字段。Stream對象提供讀取、寫入以及管理字節(jié)流的手段。該字節(jié)流可以是文本或二進(jìn)制數(shù),并且在大小方面只受限于系統(tǒng)資源?!按鎯D像到數(shù)據(jù)庫”的代碼如下:
代碼中最關(guān)鍵的設(shè)計是圖像變量的定義及圖像長度的獲取。使用Parameters.Add方法和photo.Length屬性即可獲取和設(shè)置。
讀取存儲在數(shù)據(jù)庫表中的二進(jìn)制圖像數(shù)據(jù)時,直接查詢圖像所在記錄,讀入內(nèi)存,并通過字節(jié)數(shù)組轉(zhuǎn)換為PictureBox控件能顯示的文件流數(shù)據(jù)直接顯示。其核心代碼如下:
一個好的圖像存取解決方案不僅能夠使管理信息系統(tǒng)具有更大的適應(yīng)性,而且能大大提高管理信息系統(tǒng)的使用方便性和執(zhí)行效率。本文介紹的設(shè)計思想在Visual C#.Net 2008+SQL Server 2008環(huán)境中成功地實現(xiàn)了圖像在數(shù)據(jù)庫的存取。該方法操作簡單,容易掌握,使得我們不需要編寫大量的代碼,就可以實現(xiàn)在管理信息系統(tǒng)中存儲和顯示圖像文件。
[1]徐人鳳.SQL Server 2005數(shù)據(jù)庫及應(yīng)用[M].北京:高等教育出版社,2007:72.