資源描述:
《sqlserver圖片數(shù)據(jù)的存取.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、SQLSERVER中進(jìn)行圖像存取的實(shí)現(xiàn)方法在數(shù)據(jù)庫(kù)應(yīng)用項(xiàng)目開(kāi)發(fā)中,經(jīng)常會(huì)使用一些二進(jìn)制的圖像數(shù)據(jù),存儲(chǔ)和讀取顯示圖像數(shù)據(jù)主要采用的是路徑鏈接法和內(nèi)存流法。路徑鏈接法是將圖像文件保存在固定的路徑下,數(shù)據(jù)庫(kù)中只存儲(chǔ)圖像文件的路徑和名稱(chēng),此方法數(shù)據(jù)庫(kù)容量小,存取速度快,但安全性較差;內(nèi)存流法是將二進(jìn)制數(shù)據(jù)直接存儲(chǔ)在數(shù)據(jù)庫(kù)中,此方法對(duì)數(shù)據(jù)的共享非常方便,安全性相對(duì)較高,常用于圖像容量不是很大的時(shí)候?! ”疚闹饕懻撏ㄟ^(guò)SQLServer2008使用內(nèi)存流法如何實(shí)現(xiàn)二進(jìn)制圖像數(shù)據(jù)的存儲(chǔ)。?1 VARBINARY(MAX)數(shù)據(jù)類(lèi)型簡(jiǎn)介 在SQLServer2000和更早的版本中,如果每條記錄的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)
2、超過(guò)了一個(gè)單獨(dú)記錄的8K,我們常用IMAGE數(shù)據(jù)類(lèi)型以二進(jìn)制存儲(chǔ)該數(shù)據(jù),在使用IMAGE數(shù)據(jù)類(lèi)型時(shí),數(shù)據(jù)是不和普通數(shù)據(jù)存儲(chǔ)在一起的。一個(gè)被稱(chēng)作指針的很小的二進(jìn)制值,和普通數(shù)據(jù)存儲(chǔ)在一起,這個(gè)二進(jìn)制值指向數(shù)據(jù)文件里的數(shù)據(jù)實(shí)際存儲(chǔ)的位置。對(duì)IMAGE數(shù)據(jù)進(jìn)行讀取、插入數(shù)據(jù)時(shí)需要使用READTEXT[1]及WRITETEXT命令,這兩個(gè)命令需使用TEXTPTR函數(shù)來(lái)獲得正確的二進(jìn)制指針,這個(gè)二進(jìn)制指針用于定位物理文件中的數(shù)據(jù),使用起來(lái)較麻煩?! ‰m然在SQLServer2008中依然提供IMAGE數(shù)據(jù)類(lèi)型,但微軟計(jì)劃在未來(lái)的SQLServer版本中刪除IMAGE數(shù)據(jù)類(lèi)型,用VARBINARY(MAX
3、)數(shù)據(jù)類(lèi)型來(lái)代替,在該版本下不應(yīng)當(dāng)使用IMAGE這種類(lèi)型?! ARBINARY(MAX)為可變長(zhǎng)度二進(jìn)制數(shù)據(jù),不限最大長(zhǎng)度,常用于數(shù)據(jù)超出8,000字節(jié)時(shí),可以直接使用insert命令添加數(shù)據(jù),使用起來(lái)較簡(jiǎn)單。?2 使用T-SQL語(yǔ)句將圖像文件直接讀入VARBINARY(MAX)字段 首先在SQLServer2008的查詢(xún)窗口中創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)ImageDB,并建立ImageTable表來(lái)存儲(chǔ)圖像數(shù)據(jù): CREATEDATABASEImageTest GO USEImageTest; GO CREATETABLEImageTable ( ImageDatavarBinary(M
4、AX) ); 然后使用Insert命令將其插入到ImageTest表中(此處圖像文件為C:aa.jpg),OPENROWSET函數(shù)包含訪問(wèn)OLEDB數(shù)據(jù)源中的遠(yuǎn)程數(shù)據(jù)所需的全部連接信息,內(nèi)置的BULK訪問(wèn)接口支持大容量操作,實(shí)現(xiàn)的代碼為:INSERTINTOImageTable(ImageData)??SELECT?*??FROMOPENROWSET(BULKN'C:aa.jpg',SINGLE_BLOB)ASPhotoGO 運(yùn)行Select*fromImageTable語(yǔ)句將會(huì)看到該圖像的二進(jìn)制編碼,但SQLServer2008不提供直接查看圖片的方法,為了查看圖片,我們需要?jiǎng)?chuàng)建應(yīng)
5、用程序,本文第4部分介紹其實(shí)現(xiàn)的方法。?3 在SQLServer中將二進(jìn)制數(shù)據(jù)復(fù)制到圖像文件 在SQLServer2008中將二進(jìn)制數(shù)據(jù)復(fù)制到圖像文件,要對(duì)Windows的文件進(jìn)行操作,我們需要用到xp_cmdshell擴(kuò)展存儲(chǔ)過(guò)程,在使用之前我們需獲得執(zhí)行該命令的權(quán)限: EXECsp_configure'showadvancedoptions',1 GO RECONFIGURE GO EXECsp_configure'xp_cmdshell',1 GO RECONFIGURE GO 通過(guò)執(zhí)行xp_cmdshell將二進(jìn)制數(shù)據(jù)復(fù)制到圖像文件: EXEC??
6、master..xp_cmdshell??'bcp"SELECTImageDataFROMImageTest.dbo.ImageTable"queryout"c:bb.jpg"-T-c' Go 可以看到C盤(pán)下增加了一個(gè)圖像文件bb.jpg。?4 使用C#.NET存取SQLServer2008中的圖像數(shù)據(jù) 為在2中創(chuàng)建的ImageTable表添加一個(gè)ImagePath字段,用于記錄圖像的路徑及文件名。在窗體上添加一個(gè)按鈕,用于實(shí)現(xiàn)將圖像文件讀入SQLServer,實(shí)現(xiàn)的基本過(guò)程是先通過(guò)openFileDialog控件選擇要讀入的圖像文件,將圖像文件轉(zhuǎn)換成二進(jìn)制流,連接數(shù)據(jù)庫(kù)后使用inse
7、rt命令將二進(jìn)制流數(shù)據(jù)存儲(chǔ)到SQLServer,實(shí)現(xiàn)的代碼如下: this.openFileDialog1.ShowDialog(); stringfile=this.openFileDialog1.FileName; try {?? SqlConnectionsqlConnection=newSqlConnection(@"Data Source=.weisql;InitialCa