SQL Server存儲圖像數據的策略與方法
2024-07-21 02:23:25
供稿:網友
目前對于圖像數據的管理大都采用表+實體的方法,即圖像數據以文件形式存放于指定的計算機目錄下,在數據庫表中只反映圖像數據文件的存儲路徑。這種管理模式,給數據的維護增加了難度,同時,也給數據的安全帶來一定的隱患。因此,要真正做到各類數據在數據庫中安全管理,研究和探索直接將圖像數據存儲在數據庫關系表中的方法是非常必要的。
筆者在visual basic 6.0開發環境中,采用客戶機/服務器的工作方式,針對sql server數據庫關系表中存儲圖像數據的問題進行了初步探討,提出了一套基本解決方案,供讀者參考。
一、 存儲圖像數據的策略
圖像數據庫技術一直致力于解決海量數字圖像的有效存儲和管理問題。它是數據庫技術的繼承和發展,一方面,圖像數據和文本數據存在著本質的區別,在文本數據領域得以成功應用的傳統數據庫技術,如果一成不變的照搬到圖像數據庫領域,結果往往是低效,甚至無效;另一方面,傳統數據庫的許多成果,如sql語言、索引技術等都值得圖像數據庫借鑒。上述兩個方面的結合成為目前圖像數據庫技術發展的主流。
1.1 blob數據類型
blob是非常巨大的不定的二進制或者字符型數據,通常是文檔(.txt、.doc)和圖片(.jpeg、.gif、.bmp),它可以存儲在數據庫中。在sql server中,blob可以是text、ntext或者image數據類型。 image數據類型存儲的是長度不確定的二進制數據,最大長度是2gb。
blob數據在sql server系統中的存儲方式不同于普通的數據類型,對于普通類型的數據系統直接在用戶定義的字段上存儲數據值,而對于blob類型數據,系統開辟新的存儲頁面來存放這些數據,表中blob類型數據字段存放的僅是一個16個字節的指針,該指針指向存放該條記錄的blob數據的頁面。
1.2 blob的設計策略
blob數據是數據量很大的數據類型,它會占用大量的硬盤空間、內存和網絡資源,因此合理地設計包含有blob數據類型的屬性表,對提高存儲效率、查詢速度有很大的影響。一般blob的設計原則如下:
(1) 使用blob數據類型還是使用varchar或者varbinary數據類型
二進制大對象并不一定要存儲為text、ntext或者image數據類型,它們也可以作為varchar或者varbinary數據類型村處在表格中。數據類型的選擇要根據將要存儲的blob的實際大小。如果數據不會超過8k,那么就使用varchar或者varbinary數據類型。如果這些大對象的尺寸超過8k,那么就使用text、ntext或者image數據類型。
(2) 存儲blob在數據庫中或者在文件系統中
常見的設計問題是將圖片存在數據庫中還是存在文件系統中。在大多數情況下,最好把圖片文件與其它數據一起存在數據庫中。因為將影像數據文件存儲在數據庫中有許多優點:
易于管理 當blob與其他數據一起存儲在數據庫中時,blob和表格是數據一起備份和恢復。這樣就降低了表格數據與blob數據不同步的機會,而且降低了其他用戶無意中刪除了文件系統中blob數據位置的路徑和風險。另外,將數據存儲在數據庫中blob和其他數據的插入、更新和刪除都在同一個事務中實現。這樣就確保了數據的一致性和文件與數據庫之間的一致性。還有一點好處是不需要為文件系統中的文件單獨設置安全性。
可伸縮性 盡管文件系統被設計為能夠處理大量不同大小的對象,但是文件系統不能對大量小文件進行優化。在這種情況下,數據庫系統可以進行優化。
可用性 數據庫具有比文件系統更多的可用性。數據庫復制允許在分布式環境中復制、分配和潛在的修改數據。在主系統失效的情況下,日志轉移提供了保留數據庫備用副本的方法。
當然,在某些情況下,將圖片存儲在文件系統中將是更好的選擇:
(1)使用圖片的應用程序需要數據流性能,例如實時的視頻重現。
(2)象microsoft photodraw或者adobe photoshop這樣的應用程序經常訪問blob,這些應用程序只知道怎樣訪問文件。
(3)需要使用一些ntfs文件系統中的特殊功能,例如遠程存儲。
二、 存儲圖像數據的方法
1 建立具有image宇段的sql server數據庫
當需要在sql server數據庫中存儲圖像數據時,首先應建立包含image數據類型字段的數據庫關系表。sql server數據庫平臺支持的數據類型中,image數據類型主要用于存儲圖像數據等大段的二進制數據。sql server 7.0之后的版本,image類型可存儲2gb的數據。
2 使用remote data控件建立與數據庫的連接
remote data控件是在visual basic應用程序中用來獲取遠程數據的控件。它在.遠程數據對象(rdo)和數據綁定控件之間提供了接口,只要給它提供有關數據存儲的位置、獲取的數據和一些接口控制,就可以連接到數據庫,實現對數據庫的基本操作。
使用remote data控件建立與遠程數據庫的連接步驟如下:
1.在visual basic的窗體中加入一個remote data控件。 ,
2.在remote data控件datasourcename屬性的下拉列表中選擇一個odbc數據源。例如pubs。
3.在remote data控件的sql屬性中輸入sql查詢語句。例如,select * from pub_info。
2.3 綁定ole和remote data控件實現圖像數據的存儲與編輯
ole是允許應用程序相互之間交換和顯示數據的一項技術,使用ole,可以從支持ole技術的任何應用程序中讀取信息,也可以在任何支持ole的程序中顯示和編輯它。在visual basic中,可利用ole容器控件與remote data控件的綁定,來實現顯示、存儲和編輯sql serve數據庫中的image類型數據。
1.顯示sql serve數據庫image類型字段的圖像數據
具體步驟如下:
(1)在加入了remote data控件的visual basic的窗體中,添加一個ole容器控件。創建ole容器控件時,會出現“插入對象’:對話框,此時點擊“取消”按鈕,不必為該容器指定對象。
(2)將ole容器控件的datasource屬性設置為remote data控件的名字,實現控件的綁定。
(3)在ole容器控件。datafield屬性的下拉列表中選擇要顯示的字段名。例如,logo。
(4)運行應用程序。對于包含image數據類型的logo字段的數據將在ole容器控件中顯示一幅圖像。
2.在sql sever數據庫image類型字段中添加存儲圖像數據
具體步驟如下:
(1)將remote data控件的eofaction屬性設置為rdaddnew,實現數據庫的數據添加功能。
(2)在visual baisic的窗體中添加一個commandbutton控件,并編寫圖像文件嵌入ole容器控件的程序代碼。例如:
private sub command_click()
olel.createembed“c:\圖片.bmp”
end sub
(3)運行應用程序,點擊remote data控件的記錄指示按鈕,移動到新的記錄,然后點擊commandbutton控件按鈕,實現圖像數據的添加入庫操作。
3.編輯sql serve數據庫image數據類型字段的圖像數據
具體步驟如下:
(1)在visual basic的窗體中添加一個commandbutton控件,編寫對ole對象的編輯程序代碼。例如:
private sub command2--_click()
olel.doverb vboleopen
end sub
(2)運行應用程序,點擊remote data控件的記錄指示按鈕,選擇需要編輯的圖像,然后點擊commandbutton控件按鈕,在分隔的應用程序窗口打開對象,進行圖像的編輯操作。
4、圖像文件自動入庫方式的實現
在數據庫的實際應用中,經常需要將圖像文件批量存儲,以提高數據入庫操作的自動化程度。對于圖像文件批量存儲,在程序代碼的編寫中,可充分利用ole容器控件與remotedata控件的諸多屬性和方法,加以實現。
具體步驟如下:
(1)將ole和remotedata控件的visible屬性設置成false,使ole和remotedata控件不可視。
(2)建立圖像文件的批處理文件。
(3)編寫以下基本代碼,實現批處理功能。
private sub command3_click()
dim filename as string
open "c:\tesffile.txt"forlnputas#1'打開批處理文件。
dowhilenoteof(1)'循環至文件尾。
input#l,filename'讀入圖像文件名。
msrdcl.resultset.addnew‘結果集添加記錄
olel.createembedfilename‘嵌入圖像文件
msrdcl.resultset.update
loop
close #1
end sub
(4)運行應用程序。點擊commandbutton控件按鈕,完成圖像文件的自動入庫。
五、結束語
隨著sql serve數據庫管理系統功能的不斷增強、性能的不斷完善,將各類數據完全由數據庫管理系統統一存儲和管理,已成為技術發展的趨勢。只有這樣,sql serve數據庫管理系統的強大功能才能得到充分發揮,數據的安全性才能得到充分的保障,使得諸如數據庫復制、數據的轉移等許多工作,變得非常簡單容易。