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