国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關(guān)注微信公眾號

SQL Server對圖像數(shù)據(jù)的存儲機(jī)制介紹
2007-07-29   計算機(jī)與信息技術(shù)

在一個完善的醫(yī)院信息MIS中,圖像數(shù)據(jù)的存取是必不可少的,比如X光片、CT像片的保存。一方面,這些圖像數(shù)據(jù)在遠(yuǎn)程診療為準(zhǔn)確診斷病情提供了重要的依據(jù),另一方面,也為快速查閱病人資料提供了基本條件。圖像數(shù)據(jù)的存取在其它應(yīng)用系統(tǒng)如GIS中也有廣泛的應(yīng)用。

1、SQL Server中圖像數(shù)據(jù)的存儲機(jī)制

在MIS SQL Server 中,對于小于 8000 個字節(jié)的圖像數(shù)據(jù)可以用二進(jìn)制型(binary、varbinary)來表示。但通常要保存的一些醫(yī)學(xué)影像圖片都會大于 8000個字節(jié)。SQL Server提供了一種機(jī)制,能存儲每行大到 2GB的二進(jìn)制對象(BLOB),這類對象可包括image、text和ntext三種數(shù)據(jù)類型。Image數(shù)據(jù)類型存儲的是二進(jìn)制數(shù)據(jù),最大長度是 231-1 (2,147,483,647)個字節(jié)。

BLOB數(shù)據(jù)在MIS SQL Server系統(tǒng)中的存儲方式不同于普通的數(shù)據(jù)類型,對于普通類型的數(shù)據(jù)系統(tǒng)直接在用戶定義的字段上存儲數(shù)據(jù)值,而對于BLOB類型數(shù)據(jù),系統(tǒng)開辟新的存儲頁面來存放這些數(shù)據(jù),表中BLOB類型數(shù)據(jù)字段存放的僅是一個16個字節(jié)的指針,該指針指向存放該條記錄的BLOB數(shù)據(jù)的頁面。

2、SQL Server中圖像數(shù)據(jù)的存取

在MIS SQL Server中,當(dāng)數(shù)據(jù)小于 8000 個字節(jié)時,可以用普通的SQL操縱語句(SELECT、INSERT、UPDATE、DELETE)來完成對字段的操縱,當(dāng)數(shù)據(jù)大于8000個字節(jié)時,SQL提供了 WRITETEXT 、READTEXT和UPDATETEXT這三個函數(shù)來讀取和修改數(shù)據(jù)。這三個函數(shù)的使用方法為:

(1)WRITETEXT {table.column text_ptr}[WITH LOG] {data}

table.column為表中的字段,text_ptr為一個16個字節(jié)的指針,data為要寫的數(shù)據(jù)值。可選參數(shù)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個字節(jié)的指針,offset 為偏移量,即從第幾個字節(jié)開始讀數(shù)據(jù),size為要讀的字節(jié)數(shù),HOLDLOCK 為在讀數(shù)據(jù)中是否充許其他用戶修改該數(shù)據(jù)。

例:

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為從第幾開始字節(jié)開始寫,對于ntext為從第幾個字符(雙字節(jié))開始寫;delete_length為從insert_offset開始刪除delete_length長度的字節(jié)(符),為0時不刪除,為NULL時為刪除從insert_offset開始到結(jié)束的所有數(shù)據(jù)。要插入的數(shù)據(jù)為 inserted_data為,也可是表table_name的src_column_name字段中指針 src_text_ptr所指數(shù)據(jù)。

例:

DECLARE @ptrval binary(16)

SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001

UPDATETEXT zy_ct.img_ct @ptrval 16 0x54345

可以看出,這三個函數(shù)的使用比較復(fù)雜,雖然可以通過生成存貯過程來調(diào)用執(zhí)行,但有一個缺陷是在讀取數(shù)據(jù)時,READTEXT函數(shù)讀取的數(shù)據(jù)無法直接傳遞回前端應(yīng)用程序。

3、VB 6.0中圖像數(shù)據(jù)的存取

VB 6.0 的ADO Field 對象提供了GetChunk 方法和AppendChunk 方法來存取BLOB數(shù)據(jù),這兩個函數(shù)實質(zhì)是通過API調(diào)用WRITETEXT 、READTEXT和UPDATETEXT這三個函數(shù),簡化了調(diào)用的方法。

(1)GetChunk 和AppendChunk方法介紹

GetChunk 方法檢索其部分或全部長二進(jìn)制或字符數(shù)據(jù)。GetChunk 調(diào)用返回的數(shù)據(jù)將賦給“變量”。如果 Size 大于剩余的數(shù)據(jù),則 GetChunk 僅返回剩余的數(shù)據(jù)而無需用空白填充“變量”。如果字段為空,則 GetChunk 方法返回 Null。每個后續(xù)的 GetChunk 調(diào)用將檢索從前一次 GetChunk 調(diào)用停止處開始的數(shù)據(jù)。但是,如果從一個字段檢索數(shù)據(jù)然后在當(dāng)前記錄中設(shè)置或讀取另一個字段的值,ADO 將認(rèn)為已從第一個字段中檢索出數(shù)據(jù)。如果在第一個字段上再次調(diào)用 GetChunk 方法,ADO 將把調(diào)用解釋為新的 GetChunk 操作并從記錄的起始處開始讀取。Field 對象的第一個 AppendChunk 調(diào)用將數(shù)據(jù)寫入字段,覆蓋所有現(xiàn)有的數(shù)據(jù),隨后的 AppendChunk 調(diào)用則添加到現(xiàn)有數(shù)據(jù)。

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

(2)程序?qū)崿F(xiàn)

程序一:寫數(shù)據(jù)函數(shù)

Public Function AppendBlobFromFile

(blobColumn As ADODB.Field, ByVal FileName) As Boolean

Dim FileNumber As Integer '文件號

Dim DataLen As Long '文件長度

Dim Chunks As Long '數(shù)據(jù)塊數(shù)

Dim ChunkAry() As Byte '數(shù)據(jù)塊數(shù)組

Dim ChunkSize As Long '數(shù)據(jù)塊大小

Dim Fragment As Long '零碎數(shù)據(jù)大小

Dim lngI As Long '計數(shù)器



On Error GoTo ErrorHandle

AppendBlobFromFile = False

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



FileNumber = FreeFile '產(chǎn)生隨機(jī)的文件號

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

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

If IsNull(blobColumn) Then Exit Function



If DataLen = 0 Then '文件長度為0

Close FileNumber

AppendBlobFromFile = True

Exit Function

End If



Chunks = DataLen \ ChunkSize '數(shù)據(jù)塊的個數(shù)

Fragment = DataLen Mod ChunkSize

If Fragment > 0 Then '先寫零碎數(shù)據(jù)

ReDim ChunkAry(Fragment - 1)

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

blobColumn.AppendChunk ChunkAry '調(diào)用AppendChunk函數(shù)寫數(shù)據(jù)

End If



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

For lngI = 1 To Chunks '循環(huán)讀出所有數(shù)據(jù)塊

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

blobColumn.AppendChunk ChunkAry '在數(shù)據(jù)庫中增加數(shù)據(jù)塊

Next lngI



Close FileNumber '關(guān)閉文件

AppendBlobFromFile = True

Exit Function

ErrorHandle:

AppendBlobFromFile = False

MsgBox Err.Description, vbCritical, "寫圖像數(shù)據(jù)出錯!"

End Function

程序二:讀數(shù)據(jù)函數(shù)

Public Function ReadbolbToFile

(blobColumn As ADODB.Field, ByVal FileName) As Boolean

Dim FileNumber As Integer '文件號

Dim DataLen As Long '文件長度

Dim Chunks As Long '數(shù)據(jù)塊數(shù)

Dim ChunkAry() As Byte '數(shù)據(jù)塊數(shù)組

Dim ChunkSize As Long '數(shù)據(jù)塊大小

Dim Fragment As Long '零碎數(shù)據(jù)大小

Dim lngI As Long '計數(shù)器



On Error GoTo ErrorHandle

ReadbolbToFile= False

ChunkSize = 2048 '定義塊大小為 2K

If IsNull(blobColumn) Then Exit Function



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

If DataLen < 8 Then Exit Function '圖像大小小于8字節(jié)時認(rèn)為不是圖像信息

FileNumber = FreeFile '產(chǎn)生隨機(jī)的文件號

Open FileName For Binary Access Write As FileNumber '打開存放圖像數(shù)據(jù)文件

Chunks = DataLen \ ChunkSize '數(shù)據(jù)塊數(shù)

Fragment = DataLen Mod ChunkSize '零碎數(shù)據(jù)

If Fragment > 0 Then '有零碎數(shù)據(jù),則先讀該數(shù)據(jù)

ReDim ChunkAry(Fragment - 1)

ChunkAry = blobColumn.GetChunk(Fragment)

Put FileNumber, , ChunkAry '寫入文件

End If



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

For lngI = 1 To Chunks '&shy;循環(huán)讀出所有塊

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

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

Next lngI

Close FileNumber '關(guān)閉文件

ReadbolbToFile= True

Exit Function

ErrorHandle:

ReadbolbToFile= False

MsgBox Err.Description, vbCritical, "讀圖像數(shù)據(jù)出錯!"

End Function

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

4、總結(jié)

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

熱詞搜索:

上一篇:Windows Vista安全性的提升
下一篇:構(gòu)造SQL Server的安全門

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
91美女在线视频| 亚洲国产视频a| 日韩一级完整毛片| 欧美日韩中文国产| 欧美综合天天夜夜久久| 91麻豆精东视频| 日本乱人伦aⅴ精品| 色伊人久久综合中文字幕| 本田岬高潮一区二区三区| 国产1区2区3区精品美女| 国产亚洲一区二区三区四区| 国产三级精品三级在线专区| 欧美sm极限捆绑bd| 日韩精品中文字幕一区| 欧美人妇做爰xxxⅹ性高电影 | 色视频一区二区| 成人综合婷婷国产精品久久| 国产激情一区二区三区| 国产美女久久久久| 国产一区二区三区四| 国产在线播放一区| 国产尤物一区二区在线| 久久精品国产99| 国产自产2019最新不卡| 国产麻豆精品视频| 国产精品夜夜爽| 成人午夜碰碰视频| 国产乱码精品一区二区三区忘忧草| 国产日韩欧美制服另类| 精品乱人伦一区二区三区| 日韩手机在线导航| 欧美色精品在线视频| 久久久高清一区二区三区| 91国产成人在线| 日本久久一区二区三区| 日韩亚洲欧美中文三级| 国产亚洲综合色| 亚洲另类在线视频| 欧美高清视频在线高清观看mv色露露十八 | 91久久国产综合久久| 欧美亚洲国产bt| 欧美一区二区三区婷婷月色| 精品成人在线观看| 国产肉丝袜一区二区| 一区二区高清免费观看影视大全| 午夜久久久影院| 麻豆国产精品777777在线| 国产成人精品午夜视频免费| 色婷婷国产精品| 日韩欧美激情在线| 中文字幕 久热精品 视频在线| 亚洲三级电影全部在线观看高清| 三级亚洲高清视频| 成人高清在线视频| 欧美日韩国产不卡| 久久蜜桃av一区二区天堂| 亚洲美女屁股眼交3| 九九九精品视频| 色成人在线视频| 久久久久亚洲蜜桃| 亚洲成人黄色小说| 成人国产免费视频| 91精品国产综合久久蜜臀| 亚洲三级在线免费观看| 麻豆传媒一区二区三区| 欧美最猛性xxxxx直播| 久久久久久久精| 视频一区二区不卡| 99久久婷婷国产综合精品| 久久久久99精品国产片| 天天爽夜夜爽夜夜爽精品视频| 岛国精品在线播放| 欧美电视剧免费观看| 一区二区三区国产| 丁香天五香天堂综合| 欧美成人在线直播| 亚洲mv在线观看| 91色视频在线| 久久精品夜夜夜夜久久| 久久精品国产精品亚洲精品| 欧美日韩一区二区不卡| 亚洲欧洲日韩在线| 国产精品亚洲综合一区在线观看| 日韩女优电影在线观看| 亚洲欧美国产高清| 国产成人在线视频免费播放| 欧美日韩五月天| 亚洲欧洲日韩综合一区二区| 国产精品亚洲人在线观看| 欧美高清www午色夜在线视频| 亚洲一卡二卡三卡四卡五卡| 91国内精品野花午夜精品| 亚洲色图.com| 欧美午夜免费电影| 亚洲无线码一区二区三区| 4438x成人网最大色成网站| 午夜视频在线观看一区二区| 在线日韩一区二区| 亚洲一二三四区不卡| 欧美色欧美亚洲另类二区| 午夜精品福利在线| 欧美一二三区在线| 蜜臀久久久久久久| 日韩一区国产二区欧美三区| 久久精品国产亚洲一区二区三区| 欧美成人一级视频| 国产精品99久久久久久久vr| 国产亚洲一区二区在线观看| yourporn久久国产精品| 亚洲欧洲精品一区二区三区| 色婷婷综合久久久中文一区二区| 亚洲一区二区三区四区五区黄| 欧美日韩色一区| 免费精品99久久国产综合精品| 精品国产伦理网| 成人一级片在线观看| 亚洲女同ⅹxx女同tv| 欧美日本在线播放| 国产精品亚洲第一| 亚洲精品老司机| 91精品国产综合久久小美女| 国产一区免费电影| 国产精品国产精品国产专区不蜜 | 天天爽夜夜爽夜夜爽精品视频| 日韩精品中文字幕在线不卡尤物| 国产成人免费视| 亚洲尤物视频在线| 精品理论电影在线| zzijzzij亚洲日本少妇熟睡| 亚洲成年人网站在线观看| 精品少妇一区二区三区视频免付费 | 色琪琪一区二区三区亚洲区| 日韩av一区二区三区| 中文字幕不卡的av| 欧美一区二区三区视频在线| 国产成人av网站| 亚洲福利一区二区三区| 久久久久久日产精品| 欧美性色综合网| 国产又黄又大久久| 午夜精品一区二区三区三上悠亚| 国产午夜精品在线观看| 欧美日韩高清在线| 91免费看片在线观看| 亚洲图片欧美色图| 中文字幕成人av| 欧美一区二区三区视频| 91久久人澡人人添人人爽欧美| 国产在线精品一区二区| 五月天中文字幕一区二区| 欧美经典三级视频一区二区三区| 欧美美女黄视频| 99久久精品一区| 懂色av一区二区在线播放| 久久超碰97中文字幕| 亚洲成人在线免费| 一区二区三区欧美日| 欧美高清在线视频| 国产三级三级三级精品8ⅰ区| 日韩一区二区在线观看| 欧美色男人天堂| 色88888久久久久久影院野外| 成人污视频在线观看| 激情六月婷婷久久| 精彩视频一区二区| 久久精品免费看| 美女www一区二区| 蜜桃久久av一区| 欧美a一区二区| 日韩高清不卡一区二区| 亚洲国产成人porn| 亚洲图片欧美视频| 亚洲不卡在线观看| 亚洲人成网站色在线观看| 亚洲国产精品传媒在线观看| 精品久久久久久久久久久久久久久久久| 日本高清免费不卡视频| 国产91富婆露脸刺激对白 | 91蝌蚪porny成人天涯| 成人午夜视频在线| 91在线精品一区二区| 色94色欧美sute亚洲线路一久| 色综合久久九月婷婷色综合| 欧美亚洲自拍偷拍| 欧美日韩一区二区三区视频| 337p亚洲精品色噜噜狠狠| 制服丝袜亚洲色图| 精品日韩一区二区三区| 欧美精品一区二| 国产精品另类一区| 一二三区精品福利视频| 香港成人在线视频| 激情综合五月婷婷| 久久国产三级精品| 国产91精品一区二区| 国产激情视频一区二区在线观看| 五月天中文字幕一区二区| 青青草国产成人99久久| 99热精品一区二区| 91精品国产欧美日韩|