科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道SQL Server对图像数据的存储机制介绍

SQL Server对图像数据的存储机制介绍

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:ahcit.com 李小琳 来源:天新网 2008年4月28日

关键字: 数据库 Mssql SQL SQL Server

  • 评论
  • 分享微博
  • 分享邮件

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
           ReadbolbToFile= False
           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                 '关闭文件
           ReadbolbToFile= True
           Exit Function
ErrorHandle:
           ReadbolbToFile= False
           MsgBox Err.Description, vbCritical, "读图像数据出错!"
End Function

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

4、 总结

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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章