能够看出,这三个函数的使用比较复杂,虽然能够通过生成存贮过程来调用执行,但有一个缺陷是在读取数据时,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
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 '­循环读出任何块
ChunkAry = blobColumn.GetChunk(ChunkSize) '在数据库中连续读数据块
Put FileNumber, , ChunkAry() '将数据块写入文档中
Next lngI
Close FileNumber '关闭文档
ReadbolbToFile= True
Exit Function
ErrorHandle:
ReadbolbToFile= False
MsgBox Err.Description, vbCritical, "读图像数据出错!"
End Function
|
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!