当前位置:首页 > 系统运维 > 正文内容

MIS SQL Server中的图像数据描述

a8116255316年前 (2010-07-02)系统运维7

以下的文章主要教会大家的是如何正确的用VB来对SQL Server数据库中的图像数据进行存取,本文介绍MIS SQL Server对图像数据的存储机制和存取 *** 。针对VB开发工具,介绍了一种通过ADO Field 对象的GetChunk *** 和AppendChunk *** 来存取MIS SQL Server中的图像数据的 *** 。

在一个完善的医院信息MIS中,图像数据的存取是必不可少的,比如X光片、CT像片的保存。一方面,这些图像数据在远程诊疗为准确诊断病情提供了重要的依据,另一方面,也为快速查阅病人资料提供了基本条件。图像数据的存取在其它应用系统如GIS中也有广泛的应用。

1、SQL Server中图像数据的存储机制

在MIS SQL Server中,对于小于8000个字节的图像数据可以用二进制型(binary、varbinary)来表示。但通常要保存的一些医学影像图片都会大于 8000个字节。SQL Server提供了一种机制,能存储每行大到2GB的二进制对象(BLOB),这类对象可包括image、text和ntext三种数据类型。Image数据类型存储的是二进制数据,更大长度是231-1 (2,147,483,647)个字节。

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 

可以看出,这三个函数的使用比较复杂,虽然可以通过生成存贮过程来调用执行,MIS SQL Server但有一个缺陷是在读取数据时,READTEXT函数读取的数据无法直接传递回前端应用程序。

3、VB 6.0中图像数据的存取

VB 6.0 的ADO Field对象提供了GetChunk *** 和AppendChunk *** 来存取BLOB数据,这两个函数实质是通过API调用WRITETEXT 、READTEXT和UPDATETEXT这三个函数,简化了调用的 *** 。

(1)GetChunk和AppendChunk *** 介绍:

GetChunk *** 检索其部分或全部长二进制或字符数据。GetChunk 调用返回的数据将赋给“变量”。假如 Size 大于剩余的数据,则 GetChunk 仅返回剩余的数据而无需用空白填充“变量”。假如字段为空,则 GetChunk *** 返回 Null。每个后续的 GetChunk 调用将检索从前一次 GetChunk 调用停止处开始的数据。

但是,假如从一个字段检索数据然后在当前记录中设置或读取另一个字段的值,ADO 将认为已从之一个字段中检索出数据。假如在之一个字段上再次调用 GetChunk *** ,ADO 将把调用解释为新的 GetChunk 操作并从记录的起始处开始读取。

Field 对象的之一个 AppendChunk 调用将数据写入字段,覆盖所有现有的数据,随后的 AppendChunk 调用则添加到现有数据。

由于系统资源总是有限的,假如一次读(存)取大量数据,可能会引起服务器、客户机死机或是服务器的性能大大下降,因此使用这两个函数时,要将图像数据进行分段读写。

(2)程序实现:

程序一:写数据函数:

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

As Boolean Dim FileNumber As Integer '文件号 Dim DataLen As Long '文件长度 Dim Chunks As Long 

'数据块数 Dim ChunkAry() As Byte '数据块数组Dim ChunkSize As Long '数据块大小 Dim Fragment As Long 

'零碎数据大小 Dim lngI As Long '计数器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 If DataLen = 0 Then 

'文件长度为0 Close FileNumber  AppendBlobFromFile = True  

Exit Function End If 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 Close FileNumber 

'关闭文件 AppendBlobFromFile = True Exit Function ErrorHandle: AppendBlobFromFile = 

False MsgBox Err.Description, vbCritical, "写图像数据出错!" End Function 

程序二:读数据函数:

Public Function ReadbolbToFile (blobColumn As ADODB.Field, ByVal FileName) As Boolean Dim FileNumber As Integer '文件号  Dim DataLen As Long '文件长度 Dim Chunks As Long '数据块数 Dim ChunkAry() As Byte '数据块数组   Dim ChunkSize As Long '数据块大小 Dim Fragment As Long '零碎数据大小 Dim lngI As Long '计数器   On Error GoTo ErrorHandle ReadbolbToFileFalse ChunkSize = 2048 '定义块大小为 2K If IsNull(blobColumn)   Then Exit Function DataLen = blobColumn.ActualSize '获得图像大小 If DataLen < 8 Then Exit 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 '&shy;循环读出所有块 ChunkAry = blobColumn.GetChunk(ChunkSize) '  在数据库中连续读数据块 Put FileNumber, , ChunkAry() '将数据块写入文件中 Next lngI Close FileNumber '  关闭文件 ReadbolbToFileTrue Exit Function ErrorHandle:  ReadbolbToFileFalse MsgBox Err.Description, vbCritical, "读图像数据出错!" End Function  

当BLOB类型的字段为空时,调用AppendChunk或 GetChunk函数将出错。此时假如想给该字段插入图像数据,应该先使用 Update语句给该字段赋初值如0x0,以便数据库系统为该字段分配一个页面地址来存放BLOB数据。

4、总结

Microsoft SQL Server为保存大二进制数据提供了存储平台,Visual Basic 6.0为存取这种数据提供了灵活的接口。本文介绍的用VB接口存取 MIS SQL Server中大二进制数据的 *** ,不但适用于图像文件,同样适用于其它类型的文件。该 *** 应用于医院管理系统的图像存取中,在存取速度、对系统的性能影响等方面都取了满意的效果。

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://2345hao.cn/blog/index.php/post/21433.html

分享给朋友:

“MIS SQL Server中的图像数据描述” 的相关文章

windows 7系统的电脑发出嘟嘟嘟的声音该怎么解决?

windows 7系统的电脑发出嘟嘟嘟的声音该怎么解决?

在某些电脑中,机器内部蜂鸣器与系统的声音输出方案是相关联的,这样一来会导致当系统输出声音时,即使电脑没有连接外部音响或耳机,也会通过内置蜂鸣器发出“嘟嘟哔哔”的声音。这个问题主要出现在Windows 7电脑中,假如你的电脑恰好遇到了这样的问题,可参考下面的方法来解决: 1、在桌面“计算机”图标上右...

windows 7系统开机提示press any key to restart的故障分析及解

windows 7系统开机提示press any key to restart的故障分析及解

Windows 7 64位系统开机后提示"press any key to restart",无法进入系统了,具体现象如下所示: 故障分析: 故障的主要原因还是硬盘的问题,可以先检查是不是接触不良或坏了,进行修复或更换即可。 解决方法: 1、开机按F8不动到高级选项出现在松手,选“...

如何删除自带的不常用应用为windows 7减负

如何删除自带的不常用应用为windows 7减负

对于Windows 7系统来说,其默认安装的许多工具是我们很少使用或从来不用的,比如系统自带的扫雷、纸牌游戏等。删除此类长期不用的系统组件,不但可以让系统更清爽,更重要的是还可以提高系统的运行速度,特别是对于硬件配置相对较低的上网本来说,尤其如此。接下来,笔者就给大家介绍一下如何删除Windows...

各个都很实用:windows 7系统电脑日常小技巧

各个都很实用:windows 7系统电脑日常小技巧

在使用Windows 7的时候很多用户对于系统的很多功能并不是很了解,也正是因为这样的不了解导致很多用户在使用Win 之后并不能体验Windows 7的功能便携和强大功能,导致很多用户对于Windows 7的认识还是比较模糊,不过为了让更多的朋友了解Windows 7的特点和便携应用,今天就为大家汇...

windows 7系统重装后卡在正在启动Windows开机界面怎么办

windows 7系统重装后卡在正在启动Windows开机界面怎么办

重装系统是我们面对许多电脑问题时的终极方法,不过重装系统也不意味着就能将全部的问题都修复。一些用户在重装系统后开机时,电脑卡在“正在启动Windows”开机界面上了,这要怎么解决呢? Windows 7系统重装后卡在开机界面的解决方法: 一、首先可以看看该故障出现的原因是否是因为启动了acp...

windows 7旗舰版系统提示应用程序错误代码0xc0000409的故障原因

windows 7旗舰版系统提示应用程序错误代码0xc0000409的故障原因

问题现象,具体如下所示:  故障分析: 一般来说,出现这种情况是因为电脑误删系统文件或者是系统文件被顽固木马破坏。       解决方法: 1、下载360安全卫士,找到里面的急救箱开始急救,然后进行修复,完成后重新启动; 2、下载瑞...