vc实现图片的数据库储存(转载)
2008-03-05 15:22
211 查看
vc进行图片的数据库存储
2007-03-10 11:27
2007-03-10 11:27
1 前言 数据库在实际的开发过程中常常需要存储较大的二进制数据对象,如图像、音频文件、视频文件或其他二进制数据,这些数据称之为二进制大对象BLOB(Binary Large Object),其存取方式与普通数据有所区别。在数据库的表中,BLOB实际上是以二进制数据的形式存放的。由于BLOB的特殊性,一般的程序都无法处理它。比如,如果在一张表中存在BLOB,当用access或Database DeskTop(Delphi在带的数据库管理工具)等打开它时,BLOB列将只显示BLOB字样。至于该列中实际存的是什么数据单靠access(Database DeskTop)是无法得到的。如果在我们编制的程序中,用控件打开一个有BLOB字段的表,效果也一样。我们的程序无法直接显示、编辑以及插入BLOB字段。可见,如何处理这种不能直接显示的二进制形式数据,用常规的方法是不能满足要求的。 结合笔者开发的模型库管理系统,本文以Visual C++ 6.0和access 2003环境下的数据库为例,介绍利用ADO实现对超长数据库字段的访问,包括写入和读出。 2 设计数据库 使用Access2003作为数据库系统,数据库名为blob,唯一的一个数据表为blob,如下所示。 其中包括四个字段,分别是id(文本),name(文本),data(OLE对象)和suffix(后缀名),其字段类型必须是OLE对象。id作为主键,name是该blob文件的文件名,data字段用来保存二进制大对象,suffix是二进制文件的后缀名,可以是rm,avi,bmp,mp3等。 3 系统的实现 3.1 SafeArray: 在对BLOB进行操作时,要用到SAFEARRAY结构。SAFEARRAY是一种结构化的数据类型,包含了一个由其它数据类型的数据元素组成的数组。之所以称之为安全的数组是因为它包含了每一维的边界信息,并限制在边界内进行数组元素的访问。其Win32定义SAFEARRAY如下:
rgsabound是一个有趣的成员,它的结构不太直观。它是数据范围的数组。该数组的大小依safe array维数的不同而有所区别。rgsabound成员是一个SAFEARRAYBOUND结构的数组--每个元素代表SAFEARRAY的一个维。
3.2 将二进制文件写入到数据库: 由于这个二进制文件可能很大,所以无法将所有内容一次性读入到内存。我们需要多次读入,每次可以使用函数CFile::Read()从文件中读出一个数据包,然后调用Field对象的AppandChrnk()函数将该包读入数据库。AppandChrnk()函数包含在Field对象中,原型如下:HRESULT AppendChunk (const _variant_t & Data );从函数原型中可以看到关键的问题是我们需把二进制数据赋值给VARIANT类型的变量。实现的关键代码如下:
3.3 从数据库读出二进制对象到文件: 同样,由于这个二进制对象可能很大,无法将所有内容一次性读入内存中对应于保存数据时我们所使用的AppendChunk函数,读取数据应该使用GetChunk函数,GetChunk的原型如下: _variant_t GetChunk (long Length );唯一的参数Length代表需要读取的字节数。 实现的关键代码如下:
4 结束语 由于信息技术的飞速发展,特别是多媒体技术的广泛运用,可以预见,以后数据库中大对象的应用将日益普遍,有关大对象的存取势必将是数据库技术的一个发展方向。本文讨论了二进制大对象BLOB在数据库中的存储与读取的VC实现,能够满足基本的系统要求,具备了一定的可移植性,为今后更广泛的应用和更深入的研究提供的借鉴基础 |
相关文章推荐
- SpringMVC+mybatis实现图片文本同时上传并储存数据库中
- 用vc实现对超长数据库字段的操作(2)转载
- VC实现图片拖拽及动画
- asp下轻松实现将上传图片到数据库的代码
- asp下轻松实现将上传图片到数据库的代码
- Python徒手实现识别手写数字—简易图片数据库
- vc之ODBC连接数据库图文全解(转载)
- FileUpload实现将图片保存到数据库在image中显示
- 转载:Android实现ListView异步加载图片
- 使用ADO实现vc中二进制文件数据的存取(以图像在数据库中的存取为例)
- VC实现透明背景和半透明图片
- C# sql 实现图片批量储存读取
- 详解vb.net实现图片以二进制形式上传和读取到数据库
- 鼠标右键弹出菜单 上传图片自定义控件 弹出菜单(PopUp 控件) 2 实现数据库插入操作 文件名通过参数传递
- jquery实现图片延时加载插件【多处转载】
- [转载]Qt实现滚动图片效果
- php中如何将图片储存在数据库里
- vc++实现对列表框的操作 ado 操作数据库实现对数据的增删 access
- PHP实现上传图片到数据库并显示输出的方法
- 利用JSP的实现图片的数据库存储和显示