中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > 数据库综合
如何用VB存取SQL Server中的图像数据
作者:未知 时间:2005-09-13 23:43 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:如何用VB存取SQL Server中的图像数据

摘要   本文介绍MIS SQL Server对图像数据的存储机制和存取方法。针对VB开发工具,介绍了一种通过ADO Field 对象的GetChunk 方法和AppendChunk 方法来存取MIS SQL Server中的图像数据的方法。

关键词    ADO Field对象  BLOB  对象 GetChunkAppendChunk 方法   image数据类型   医院信息系统

 MIS SQL Server  

 

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

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

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

BLOB数据在MIS SQL Server系统中的存储方式不同于普通的数据类型,对于普通类型的数据系统直接在用户定义的字段上存储数据值,而对于BLOB类型数据,系统开辟新的存储页面来存放这些数据,表中BLOB类型数据字段存放的仅是一个16个字节的指针,该指针指向存放该条记录的BLOB数据的页面。

2SQL Server中图像数据的存取

MIS SQL Server中,当数据小于 8000 个字节时,可以用普通的SQL操纵语句(SELECTINSERTUPDATEDELETE)来完成对字段的操纵,当数据大于8000个字节时,SQL提供了 WRITETEXT READTEXTUPDATETEXT这三个函数来读取和修改数据。这三个函数的使用方法为:

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

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 | 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为偏移量,对于textimage为从

第几开始字节开始写,对于ntext为从第几个字符(双字节)开始写;delete_length

为从insert_offset开始删除delete_length长度的字节(符),为0时不删除,为NULL

为删除从insert_offset开始到结束的所有数据。要插入的数据为 inserted_data为,也可

是表table_namesrc_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函数读取的数据无法直接传递回前端应用程序。

3VB 6.0中图像数据的存取

VB 6.0 ADO Field 对象提供了GetChunk 方法和AppendChunk 方法来存取BLOB数据[1],这两个函数实质是通过API调用WRITETEXT READTEXTUPDATETEXT这三个函数,简化了调用的方法。

1GetChunk AppendChunk方法介绍

GetChunk 方法检索其部分或全部长二进制或字符数据[4]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            '数据块数

关闭本页

 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有