
用VC实现对超长数据库字段的操作
发布时间:2006-09-24 12:00:27 来源:计算机与信息技术 网友评论 0 条
摘要 介绍了用VC实现对超长数据库字段操作方法的关键技术,并以Access2003环境下的数据库为例,在VC 6.0下进行了实现,给出了关键的程序代码。
关键字 二进制大对象; BLOB; 数据库; VC
前言
数据库在实际的开发过程中常常需要存储较大的二进制数据对象,如图像、音频文件、视频文件或其他二进制数据,这些数据称之为二进制大对象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实现对超长数据库字段的访问,包括写入和读出。
设计数据库
使用Access2003作为数据库系统,数据库名为blob,唯一的一个数据表为blob,如图1所示。

图1
其中包括四个字段,分别是id(文本),name(文本),data(OLE对象)和suffix(后缀名),其字段类型必须是OLE对象。id作为主键,name是该blob文件的文件名,data字段用来保存二进制大对象,suffix是二进制文件的后缀名,可以是rm,avi,bmp,mp3等。
系统的实现:
1、SafeArray:
在对BLOB进行操作时,要用到SAFEARRAY结构。SAFEARRAY是一种结构化的数据类型,包含了一个由其它数据类型的数据元素组成的数组。之所以称之为安全的数组是因为它包含了每一维的边界信息,并限制在边界内进行数组元素的访问。其Win32定义SAFEARRAY如下:
这个结构的成员(cDims,cLocks等)是通过API函数来设置和管理的。真正的数据存放在pvData成员中,而SAFEARRAYBOUND结构定义该数组结构的细节。以下就是该结构成员的简要描述:
rgsabound是一个有趣的成员,它的结构不太直观。它是数据范围的数组。该数组的大小依safe array维数的不同而有所区别。rgsabound成员是一个SAFEARRAYBOUND结构的数组--每个元素代表SAFEARRAY的一个维。
维数被定义在cDims成员中。例如,一个'C'类数组的维数可以是[3][4][5]-一个三维的数组。如果我们使用一个SAFEARRAY来表示这个结构,我们定义一个有三个元素的rgsabound数组--一个代表一维。cDims = 3; SAFEARRAYBOUND rgsabound[ 3 ]; rgsabound[0]元素定义第一维。在这个例子中ILBOUND元素为0,是数组的下界。cElements成员的值等于三。数组的第二维([4])可以被rgsabound结构的第二个元素定义。下界也可以是0,元素的个数是4,第三维也是这样。
关键字 二进制大对象; BLOB; 数据库; VC
前言
数据库在实际的开发过程中常常需要存储较大的二进制数据对象,如图像、音频文件、视频文件或其他二进制数据,这些数据称之为二进制大对象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实现对超长数据库字段的访问,包括写入和读出。
设计数据库
使用Access2003作为数据库系统,数据库名为blob,唯一的一个数据表为blob,如图1所示。

图1
其中包括四个字段,分别是id(文本),name(文本),data(OLE对象)和suffix(后缀名),其字段类型必须是OLE对象。id作为主键,name是该blob文件的文件名,data字段用来保存二进制大对象,suffix是二进制文件的后缀名,可以是rm,avi,bmp,mp3等。
系统的实现:
1、SafeArray:
在对BLOB进行操作时,要用到SAFEARRAY结构。SAFEARRAY是一种结构化的数据类型,包含了一个由其它数据类型的数据元素组成的数组。之所以称之为安全的数组是因为它包含了每一维的边界信息,并限制在边界内进行数组元素的访问。其Win32定义SAFEARRAY如下:
| typedef struct tagSAFEARRAY { unsigned short cDims; unsigned short fFeatures; unsigned long cbElements; unsigned long cLocks; void * pvData; SAFEARRAYBOUND rgsabound[ 1 ]; } SAFEARRAY; |
这个结构的成员(cDims,cLocks等)是通过API函数来设置和管理的。真正的数据存放在pvData成员中,而SAFEARRAYBOUND结构定义该数组结构的细节。以下就是该结构成员的简要描述:
| 成员 | 描述 |
| cDims | 数组的维数 |
| fFeatures | 用来描述数组如何分配和如何被释放的标志 |
| cbElements | 数组元素的大小 |
| cLocks | 一个计数器,用来跟踪该数组被锁定的次数 |
| pvData | 指向数据缓冲的指针 |
| rgsabound | 描述数组每维的数组结构,其大小是可变的 |
rgsabound是一个有趣的成员,它的结构不太直观。它是数据范围的数组。该数组的大小依safe array维数的不同而有所区别。rgsabound成员是一个SAFEARRAYBOUND结构的数组--每个元素代表SAFEARRAY的一个维。
| typedef struct tagSAFEARRAYBOUND { unsigned long cElements; unsigned long lLbound; } SAFEARRAYBOUND; |
维数被定义在cDims成员中。例如,一个'C'类数组的维数可以是[3][4][5]-一个三维的数组。如果我们使用一个SAFEARRAY来表示这个结构,我们定义一个有三个元素的rgsabound数组--一个代表一维。cDims = 3; SAFEARRAYBOUND rgsabound[ 3 ]; rgsabound[0]元素定义第一维。在这个例子中ILBOUND元素为0,是数组的下界。cElements成员的值等于三。数组的第二维([4])可以被rgsabound结构的第二个元素定义。下界也可以是0,元素的个数是4,第三维也是这样。
推荐阅讯
- 掀起你的盖头来——谈VC++对象模型
- Visual C#程序员面试基础问题和答案
- 在VC中使用Windows管道技术编程
- Visual C++程序设计中的API和SDK
- VC和Delphi程序只运行一个实例的方法
- 利用VC# 2005为数码照片添加拍照日期
- VC#2005快速入门之使用if语句
- 深入浅出VC++串口编程之基于Win32 API
- Visual C#中用WMI编写黑客程序之简介
- Visual C#2005快速入门之基础语法
阅读排行
- 1.VC++编程实现广告窗口自动关闭
- 2.深入浅出VC++串口编程之基于控件
- 3.解读VC++编程中的文件操作API和CFile类
- 4.利用Visual C#实现ICMP网络协议
- 5.深入浅出VC++串口编程之第三方类
- 6.掀起你的盖头来——谈VC++对象模型
- 7.Visual C#中用WMI控制远程计算机
- 8.深入浅出VC++串口编程之基于Win32 API
- 9.Visual C++2005中开发自定义绘图控件
- 10.深入浅出VC++串口编程之基本概念
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
