推荐期刊

如何用VB存取SQL Server中的图像数据

时间:2015-12-21 01:49:27 所属分类:计算机技术 浏览量:

摘要本文介绍MISSQLServer对图像数据的存储机制和存取方法。针对VB开发工具,介绍了一种通过ADOField对象的GetChunk方法和AppendChunk方法来存取MISSQLServer中的图像数据的方法。 关键词ADOField对象BLOB对象GetChunk和AppendChunk方法image数据类型医院信

摘要本文介绍MISSQLServer对图像数据的存储机制和存取方法。针对VB开发工具,介绍了一种通过ADOField对象的GetChunk方法和AppendChunk方法来存取MISSQLServer中的图像数据的方法。
关键词ADOField对象BLOB对象GetChunk和AppendChunk方法image数据类型医院信息系统
MISSQLServer

在一个完善的医院信息MIS中,图像数据的存取是必不可少的,比如X光片、CT像片的保存。一方面,这些图像数据在远程诊疗为准确诊断病情提供了重要的依据,另一方面,也为快速查阅病人资料提供了基本条件。图像数据的存取在其它应用系统如GIS中也有广泛的应用。
1、SQLServer中图像数据的存储机制
在MISSQLServer中,对于小于8000个字节的图像数据可以用二进制型(binary、varbinary)来表示。但通常要保存的一些医学影像图片都会大于8000个字节。SQLServer提供了一种机制,能存储每行大到2G的二进制对象(BLOB),这类对象可包括image、text和ntext三种数据类型。Image数据类型存储的是二进制数据,最大长度是231-1(2,147,483,647)个字节[2][3]。
BLOB数据在MISSQLServer系统中的存储方式不同于普通的数据类型,对于普通类型的数据系统直接在用户定义的字段上存储数据值,而对于BLOB类型数据,系统开辟新的存储页面来存放这些数据,表中BLOB类型数据字段存放的仅是一个16个字节的指针,该指针指向存放该条记录的BLOB数据的页面。
2、SQLServer中图像数据的存取
在MISSQLServer中,当数据小于8000个字节时,可以用普通的SQL操纵语句(SELECT、INSERT、UPDATE、DELETE)来完成对字段的操纵,当数据大于8000个字节时,SQL提供了WRITETEXT、READTEXT和UPDATETEXT这三个函数来读取和修改数据。这三个函数的使用方法为:
(1)WRITETEXT{table.columntext_ptr}[WITHLOG]{data}
table.column为表中的字段,text_ptr为一个16个字节的指针,data为要写的数据值。可
选参数WITHLOG表示是否要写入日志文件中。
例:DECLARE@ptrvalbinary(16)--指针
SELECT@ptrval=TEXTPTR(img_ct)FROMzy_ctWHEREid_ct=20010101001
WRITETEXTzy_ct.img_ct@ptrval0x024324142342134214213421421454353452341
(2)READTEXT{table.columntext_ptroffsetsize}[HOLDLOCK]
table.column为表中的字段,text_ptr为一个16个字节的指针,offset为偏移量,即从
第几个字节开始读数据,size为要读的字节数,HOLDLOCK为在读数据中是否充许其他用户
修改该数据。
例:DECLARE@ptrvalvarbinary(16)
SELECT@ptrval=TEXTPTR(img_ct)FROMzy_ctWHEREid_ct=20010101001
READTEXTzy_ct.img_ct@ptrval125
(3)UPDATETEXT{table_name.dest_column_namedest_text_ptr}{NULL|insert_offset}
{NULL|delete_length}[WITHLOG][inserted_data|{table_name.src_column_namesrc_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@ptrvalbinary(16)
SELECT@ptrval=TEXTPTR(img_ct)FROMzy_ctWHEREid_ct=20010101001
UPDATETEXTzy_ct.img_ct@ptrval160x54345
可以看出,这三个函数的使用比较复杂,虽然可以通过生成存贮过程来调用执行,但有一个缺陷是在读取数据时,READTEXT函数读取的数据无法直接传递回前端应用程序。
3、VB6.0中图像数据的存取
VB6.0的ADOField对象提供了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)程序实现
程序一:写数据函数
PublicFunctionAppendBlobFromFile(blobColumnAsADODB.Field,ByValFileName)AsBoolean
DimFileNumberAsInteger’文件号
DimDataLenAsLong’文件长度
DimChunksAsLong’数据块数
DimChunkAry()AsByte’数据块数组
DimChunkSizeAsLong’数据块大小
DimFragmentAsLong’零碎数据大小
DimlngIAsLong’计数器

OnErrorGoToErrorHandle
AppendBlobFromFile=False
ChunkSize=2048’限制每次读取的块大小为2K

FileNumber=FreeFile’产生随机的文件号
OpenFileNameForBinaryAccessReadAsFileNumber’打开图像文件
DataLen=LOF(FileNumber)’获得文件长度
IfIsNull(blobColumn)ThenExitFunction

IfDataLen=0Then’文件长度为0
CloseFileNumber
AppendBlobFromFile=True
ExitFunction
EndIf

Chunks=DataLen\ChunkSize’数据块的个数
Fragment=DataLenModChunkSize
IfFragment>0Then’先写零碎数据
ReDimChunkAry(Fragment-1)
GetFileNumber,,ChunkAry()’读出文件
blobColumn.AppendChunkChunkAry’调用AppendChunk函数写数据
EndIf

ReDimChunkAry(ChunkSize-1)’为数据块开辟空间
ForlngI=1ToChunks’循环读出所有数据块
GetFileNumber,,ChunkAry()’读出一块数据
blobColumn.AppendChunkChunkAry’在数据库中增加数据块
NextlngI

CloseFileNumber’

转载请注明来自:http://www.zazhifabiao.com/lunwen/gcjs/jsjjs/36445.html