在网上看到了不少介绍
VB
如何在
SQL SERVER
中存取图片数据的文章。
经自己实现后,最终把心得拿出来和大家分享。
经
GOOGLE
搜索,网上的对数据库图片进行存储的文章,绝大部分是来自一篇。都是采用
ADO Stream
方法使用
field
对象的
AppendChunk
和
GetChunk
方法将大容量的二进制数组通过
Update
存储到数据库中。
Dim Conn as ADODB.Connection '
声明
Connection
对象
Dim Rs as ADODB.RecordSet '
声明
RecordSet
对象
CONST BLOCKSIZE=4096 '
定义缓冲区块大小
Set Conn = New ADODB.Connection
Conn.ConnectionString = " DATA SOURCE = PUBS " 'ODBS
数据源名称为
PUBS
Conn.Open
Set Rs = New ADODB.RecordSet
Rs.Open "test", Conn, adOpenKeyset, adLockOptimistic '
数据库表为
"test"
Dim Data() as Byte '
声明字节型数组,存放数据库图片信息
Dim FileLength as Integer '
文件长度变量
Dim BlockNum as Integer '
存放缓冲区块的个数
Dim DataLeft as Integer '
存放取整块后的遗留信息
Open "C:\TEST.BMP" for BINARY as #1 '
假设图片文件为
C:\TEST.BMP
Dim i as Integer
FileLength = LOF(1)
BlockNum = FileLength \ BLOCKSIZE '
整取块大小,得缓冲区块数
DataLeft = FileLength Mod BLOCKSIZE '
整块取后的遗留
ReDim Data(BLOCKSIZE) '
重新定义缓冲区块大小为
BLOCKSIZE
For i=1 to BlockNum
Get #1,,Data()
Rs(0).AppenChunk Data() '
将
Data()
复制至
Rs(0)
字段,假设
test
表中的
image
为第一字段
Next i
ReDim Data(DataLeft) '
重新定义块大小取得遗留信息
Get #1,,Data()
Rs(0).AppendChunk Data() '
此时图片信息已全部拷贝至当前记录
Rs(0)
字段
Close #1
...
Rs.UpDate
具体的存储方法如上所述。
下面将简单的介绍取出信息的方法:
介绍说,将图片二进制存储信息用
GetChunk
方法取出,将其存储为临时文件即可。
REM
设
Rs
为打开的数据库表对应的
RecordSet
对象,其中的
image
对象仍然为第一字段
REM
接着上面的思路
Dim Data() as Byte '
声明字节型数组,存放数据库图片信息
Dim FileLength as Integer '
文件长度变量
Dim BlockNum as Integer '
存放缓冲区块的个数
Dim DataLeft as Integer '
存放取整块后的遗留信息
Dim i as Integer
ReDim Data(BLOCKSIZE)
Open "C:\TMP.BMP" for BINARY as #1
FileLength = Rs(0).ActualSize
BlockNum = FileLength \ BLOCKSIZE
DataLeft = FileLength Mod BLOCKSIZE
ReDim Data(BLOCKSIZE)
For i = 1 to BlockNum
Data() = Rs(0).GetChunk(BLOCKSIZE) 'GetChuk
方法有一个参数为
Size
Next i
Put #1,,Data()
ReDim Data(DataLeft)
Data() = Rs(0).GetChunk(DataLeft)
Put #1,,Data()
Close #1
关于存取的内容全部于上面已经列出,组织的方法还请各位网友自行去组织一下。
如果有什么缺乏说明或是不正确的地方,还请各位能够指出。
对于此问题的实现,本人还有一个设想,打算利用
SQL SERVER
的服务器端来实现存储过程,使得客户端的存取数据库图片信息更加方便。
具体的实现可能还得努力等看书之后,期待中
......
后记:
在具体存储过程中,遇到了一个关于Rs的属性长度的问题,原先采用的是Len(Rs(0))[Rs(0)为image对象],但测试时总是缺少一半的字符长度,后来查明对于Byte型数组进行Len()求值时,只会取到一半的数值。如:
Dim a(4096) as Byte
Msgbox Len(a())
结果是:2048
原因分析:可能跟VB中Len函数的ANSI或是UniCODE有关。但是了准确的原因还没有查出,因为时间关系,暂时还不能去做,到时查出后再附上。