c++ mysql 存储图片路径_3.用ADO实现图片在数据库中存储

这篇博客分享了如何在C++中利用ADO(ActiveX Data Objects)来处理MySQL数据库中的图片存储。作者通过VB示例展示了如何使用ADO Stream的AppendChunk和GetChunk方法,实现图片数据的读写。文章提到了在存储过程中遇到的字节数组长度问题,并提醒读者注意Len函数在处理Byte型数组时可能出现的不准确情况。
摘要由CSDN通过智能技术生成

在网上看到了不少介绍

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 ByteMsgbox Len(a())

结果是:2048

原因分析:可能跟VB中Len函数的ANSI或是UniCODE有关。但是了准确的原因还没有查出,因为时间关系,暂时还不能去做,到时查出后再附上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值