999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

利用VB存取SQL Server中的圖像數據的實現方法

2008-12-31 00:00:00李春燕
電腦知識與技術 2008年28期

摘要:文章主要介紹管理信息系統(MIS)中對圖像數據的存儲機制和存取方法。以visual basic為開發工具,介紹了一種通過ADO Field 對象的GetChunk 方法和AppendChunk 方法來存取MIS 中的圖像數據的方法。

關鍵詞:BLOB;對象;GetChunk方法;AppendChunk方法

中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)28-0044-02

A Way of Access Image Data with the VB in SQL Server

FU JieLI Chun-yan

(Southwest University of Science and Technology, Mianyang, 621010, China)

Abstract: This paper introduces the mechanism of MIS SQL Server memory and access image data. In accordance with Visual Basic, it present two kinds of method to access image data’s from MIS SQL Server ,GetChunk method and AppendChunk method which are provided by ADO Field object.

Key words: BLOB; object; GetChunk; AppendChunk

1 引言

在信息管理系統,尤其是醫院的信息管理系統(MIS)中,圖像數據比如X光片、CT像片的保存是必不可少的,而且是非常重要。一方面,這些圖像數據在遠程診療為準確診斷病情提供了重要的依據,另一方面,也為快速查閱病人資料提供了基本條件。

2 SQL Server中圖像數據的存儲機制

在醫院的信息管理系統中,由于系統的數據量巨大,我們采用SQL Server作為后臺數據庫,以下我們簡稱MIS SQL Server。 在一般的MIS中,對于小于 8000字節的圖像數據可以用二進制型(binary、varbinary)來表示。但是在醫院的MIS系統中,要保存的一些醫學影像圖片都會大于 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數據的頁面。

3 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

這三個函數的使用比較復雜,雖然可以通過生成存貯過程來調用執行,但有一個缺陷是在讀取數據時,READTEXT函數讀取的數據無法直接傳遞回前端應用程序。

4VB 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 調用則添加到現有數據。

由于系統資源總是有限的,如果一次讀(存)取大量數據,可能會引起服務器、客戶機死機或是服務器的性能大大下降,因此使用這兩個函數時,要將圖像數據進行分段讀寫。

2) 對大BLOB圖像存取的實現

寫數據函數的實現:寫數據函數的實現方法主要是將文件分為若干相同大小的塊來讀寫,避免對大量文件的一次性讀寫帶來網絡的擁塞和服務器負擔的加重。下面是核心代碼部分

Public Function AppendBlobFromFile(blobColumn As ADODB.Field, ByVal FileName) As Boolean

…..定義相應的信息……

On Error GoTo ErrorHandle

AppendBlobFromFile = False

ChunkSize = 2048'限制每次讀取的塊大小為 2K

FileNumber = FreeFile '產生隨機的文件號

Open FileName For Binary Access Read As FileNumber'打開圖像文件

DataLen = LOF(FileNumber) '獲得文件長度

If IsNull(blobColumn) Then Exit Function

…..驗證,以保證文件長度不會為0……

Chunks = DataLen \\ ChunkSize'數據塊的個數

Fragment = DataLen Mod ChunkSize

If Fragment > 0 Then'先寫零碎數據

ReDim ChunkAry(Fragment - 1)

Get FileNumber, , ChunkAry()'讀出文件

blobColumn.AppendChunk ChunkAry'調用AppendChunk函數寫數據

End If

ReDim ChunkAry(ChunkSize - 1) '為數據塊開辟空間

For lngI = 1 To Chunks'循環讀出所有數據塊

Get FileNumber, , ChunkAry()'讀出一塊數據

blobColumn.AppendChunk ChunkAry '在數據庫中增加數據塊

Next lngI

…..關閉數據文件,如果操作有誤,彈出相應錯誤消息…..

End Function

讀數據函數關鍵代碼的實現,讀函數,同樣是分塊讀取。核心代碼如下:

Public Function ReadbolbToFile(blobColumn As ADODB.Field, ByVal FileName) As Boolean

…….定義相關信息…..

…..讀取文件大小與上面相同……

DataLen = blobColumn.ActualSize '獲得圖像大小

If DataLen < 8 ThenExit Function'圖像大小小于8字節時認為不是圖像信息

FileNumber = FreeFile '產生隨機的文件號

Open FileName For Binary Access Write As FileNumber'打開存放圖像數據文件

Chunks = DataLen \\ ChunkSize'數據塊數

Fragment = DataLen Mod ChunkSize'零碎數據

If Fragment > 0 Then'有零碎數據,則先讀該數據

ReDim ChunkAry(Fragment - 1)

ChunkAry = blobColumn.GetChunk(Fragment)

Put FileNumber, , ChunkAry'寫入文件

End If

ReDim ChunkAry(ChunkSize - 1) '為數據塊重新開辟空間

For lngI = 1 To Chunks'循環讀出所有塊

ChunkAry = blobColumn.GetChunk(ChunkSize) '在數據庫中連續讀數據塊

Put FileNumber, , ChunkAry() '將數據塊寫入文件中

Next lngI

…..操作完畢,關閉文件,讀取錯誤,給出相關信息…..

End Function

當BLOB類型的字段為空時,調用AppendChunk或 GetChunk函數將出錯。此時如果想給該字段插入圖像數據,應該先使用 Update語句給該字段賦初值如0x0,以便數據庫系統為該字段分配一個頁面地址來存放BLOB數據。

4 結論

Microsoft SQL Server為保存大二進制數據提供了存儲平臺,Visual Basic 6.0為存取這種數據提供了靈活的接口。本文介紹的用VB接口存取 MIS SQL Server中大二進制數據的方法,不但適用于圖像文件,同樣適用于其它類型的文件。該方法應用于醫院管理系統的圖像存取中,在存取速度、對系統的性能影響等方面都取了滿意的效果。

參考文獻:

[1] [美] Curtis Smith Michael Amundsen .Visual Basic 6.0 數據庫編程.陳海林,譯.北京:清華大學出版社.

[2] SQL Server對圖像數據的存儲機制介紹,http://database.ccidnet.com/art/1105/20070320/ 1040611_1.html.

[3] 圖像數據的數據庫存儲實現,http://www.ibm.com/developerworks/cn/db2/library/ techarticles/dm-0807daiwei/index.html.

[4] [美] JEFFOEY P.MCMANUS.VISUAL BASIC6數據庫訪問技術[M].趙軍鎖,龔波,李志等,譯.北京:機械工業出版社.

主站蜘蛛池模板: 青青极品在线| 超清无码一区二区三区| 色婷婷色丁香| 五月六月伊人狠狠丁香网| 日韩欧美91| 日韩欧美综合在线制服| 免费黄色国产视频| 久久免费视频6| 亚洲精品另类| 中文字幕在线日本| 欧美日韩第二页| 日本不卡在线| 中文字幕无码电影| 婷婷午夜天| 黄色三级毛片网站| 免费观看男人免费桶女人视频| 中文字幕在线一区二区在线| 亚洲福利一区二区三区| 在线日本国产成人免费的| 婷婷综合在线观看丁香| 露脸国产精品自产在线播| 成人精品区| 麻豆国产在线观看一区二区| 91偷拍一区| 永久免费av网站可以直接看的| 久久综合亚洲色一区二区三区| 99精品在线看| 亚洲成人在线网| 免费看a级毛片| 日本少妇又色又爽又高潮| 亚洲一区二区精品无码久久久| 亚洲无码37.| 亚洲男人在线天堂| 日韩无码精品人妻| 亚洲欧美自拍中文| 国产福利在线观看精品| 久久性妇女精品免费| 欧美日韩午夜| 国产麻豆精品久久一二三| 亚洲成A人V欧美综合天堂| 婷婷六月在线| 国产欧美日韩在线一区| 国产一在线| 特级aaaaaaaaa毛片免费视频| 国内精品小视频在线| 亚洲永久色| 日韩国产亚洲一区二区在线观看| 欧美精品影院| 无码国产伊人| 一级毛片在线播放| 伊人色天堂| 亚洲aaa视频| 看看一级毛片| 色婷婷成人网| 性网站在线观看| 国内精品视频区在线2021| 国产精品妖精视频| 91午夜福利在线观看精品| 亚洲天堂高清| 高清无码手机在线观看| 激情五月婷婷综合网| 久久国产亚洲欧美日韩精品| 手机在线免费不卡一区二| 美女被操黄色视频网站| 亚洲精品成人片在线播放| AV无码无在线观看免费| 一本无码在线观看| 美女高潮全身流白浆福利区| 国产SUV精品一区二区6| 午夜国产精品视频| 精品视频一区在线观看| www.91在线播放| 国产精品成| 不卡无码h在线观看| 国产欧美一区二区三区视频在线观看| 精品久久人人爽人人玩人人妻| 久久特级毛片| 国产成人高清精品免费| 99性视频| 国产精品免费p区| 亚洲AV电影不卡在线观看| 青草视频在线观看国产|