TanZek's 技术空间

勇往直前,专注于技术...

首页 新随笔 联系 聚合 管理
  7 Posts :: 19 Stories :: 13 Comments :: 0 Trackbacks

在网上看到了不少介绍 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有关。但是了准确的原因还没有查出,因为时间关系,暂时还不能去做,到时查出后再附上。

posted on 2006-04-22 00:16 TanZek 阅读(465) 评论(0)  编辑 收藏 引用 所属分类: 家教办公系统的开发日志

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理