在网上看到了不少介绍
VB
如何在
SQL SERVER
中存取图片数据的文章。
经自己实现后,最终把心得拿出来和大家分享。
经
搜索,网上的对数据库图片进行存储的文章,绝大部分是来自一篇。都是采用
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 ByteMsgbox Len(a())
结果是:2048
原因分析:可能跟VB中Len函数的ANSI或是UniCODE有关。但是了准确的原因还没有查出,因为时间关系,暂时还不能去做,到时查出后再附上。