SQL Server存儲圖像數據大閱兵
文章描述的是SQL Server存儲圖像數據,我們大家都知道SQL Server數據庫中的圖像數據的存儲機制在MIS SQL Server 數據庫中,對于小于8000個字節的圖像數據,其可以用二進制型(binary、varbinary)來表示。但通常要保存的一些醫學影像圖片都會大于 8000個字節。
SQL Server提供了一種機制,能存儲每行大到 2G的二進制對象(BLOB),這類對象可包括image、text和ntext三種數據類型。Image數據類型存儲的是二進制數據,***長度是 231-1 (2,147,483,647)個字節[2][3]。
BLOB數據在MIS SQL Server存儲圖像數據系統中的存儲方式不同于普通的數據類型,對于普通類型的數據系統直接在用戶定義的字段上存儲數據值,而對于BLOB類型數據,系統開辟新的存儲頁面來存放這些數據,表中BLOB類型數據字段存放的僅是一個16個字節的指針,該指針指向存放該條記錄的BLOB數據的頁面。
2、 SQL Server中圖像數據的存取 在MIS SQL Server存儲圖像數據中,當數據小于 8000 個字節時,可以用普通的SQL操縱語句(SELECT、INSERT、UPDATE、DELETE)來完成對字段的操縱,當數據大于8000個字節時,SQL提供了 WRITETEXT 、READTEXT和UPDATETEXT這三個函數來讀取和修改數據。
這三個函數的使用方法為: (1) WRITETEXT {table.column text_ptr}[WITH LOG] {data} table.column為表中的字段,text_ptr為一個16個字節的指針,data為要寫的數據值。可 選參數WITH LOG表示是否要寫入日志文件中。
例:
- DECLARE @ptrval binary(16) --指針 SELECT @ptrval =
- TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001 WRITETEXT zy_ct.img_ct @ptrval
- 0x024324142342134214213421421454353452341 (2) READTEXT {table.column text_ptr offset size} [HOLDLOCK] table.column
為表中的字段,text_ptr為一個16個字節的指針,offset 為偏移量,即從 第幾個字節開始讀數據,size為要讀的字節數,HOLDLOCK 為在讀數據中是否充許其他用戶 修改該數據。
例:
- DECLARE @ptrval varbinary(16) SELECT @ptrval = TEXTPTR(img_ct)
- FROM zy_ct WHERE id_ct = 20010101001 READTEXT zy_ct.img_ct @ptrval
- 1 25 (3) UPDATETEXT {table_name.dest_column_name dest_text_ptr}{NULL|insert_offset} { NULL |
- delete_length}[WITH LOG][ inserted_data| {table_name.src_column_name src_text_ptr}] table_name.dest_column_name
為要修改的text, ntext, 或 image字段;
dest_text_ptr為指向其的指針;insert_offset為偏移量,對于text和image為從 第幾開始字節開始寫,對于ntext為從第幾個字符(雙字節)開始寫;delete_length 為從insert_offset開始刪除delete_length長度的字節(符),為0時不刪除,為NULL時 為刪除從insert_offset開始到結束的所有數據。要插入的數據為 inserted_data為,也可 是表table_name的src_column_name字段中指針 src_text_ptr所指數據。
例: DECLARE @ptrval binary(16) SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001 UPDATETEXT zy_ct.img_ct @ptrval 16 0x54345 可以看出,這三個函數的使用比較復雜,雖然可以通過生成存貯過程來調用執行SQL Server存儲圖像數據,但有一個缺陷是在讀取數據時,READTEXT函數讀取的數據無法直接傳遞回前端應用程序。
3、 VB 6.0中圖像數據的存取 VB 6.0 的ADO Field 對象提供了GetChunk 方法和AppendChunk 方法來存取BLOB數據[1],這兩個函數實質是通過API調用WRITETEXT 、READTEXT和UPDATETEXT這三個函數,簡化了調用的方法。
(1)GetChunk 和AppendChunk方法介紹 GetChunk 方法檢索其部分或全部長二進制或字符數據[4]。GetChunk 調用返回的數據將賦給“變量”。如果 Size 大于剩余的數據,則 GetChunk 僅返回剩余的數據而無需用空白填充“變量”。如果字段為空,則 GetChunk 方法返回 Null。
每個后續的 GetChunk 調用將檢索從前一次 GetChunk 調用停止處開始的數據。但是,如果從一個字段檢索數據然后在當前記錄中設置或讀取另一個字段的值,ADO 將認為已從***個字段中檢索出數據。
如果在***個字段上再次調用 GetChunk 方法,ADO 將把調用解釋為新的 GetChunk 操作并從記錄的起始處開始讀取。Field 對象的***個 AppendChunk 調用將數據寫入字段,覆蓋所有現有的數據,隨后的 AppendChunk 調用則添加到現有數據。
由于系統資源總是有限的,如果一次讀(存)取大量數據SQL Server存儲圖像數據,可能會引起服務器、客戶機死機或是服務器的性能大大下降,因此使用這兩個函數時,要將圖像數據進行分段讀寫。
【編輯推薦】