扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:高云飞 来源:计算机与信息技术 2007年9月14日
关键字:
维数被定义在cDims成员中。例如,一个'C'类数组的维数可以是[3][4][5]-一个三维的数组。如果我们使用一个SAFEARRAY来表示这个结构,我们定义一个有三个元素的rgsabound数组--一个代表一维。cDims = 3; SAFEARRAYBOUND rgsabound[ 3 ]; rgsabound[0]元素定义第一维。在这个例子中ILBOUND元素为0,是数组的下界。cElements成员的值等于三。数组的第二维([4])可以被rgsabound结构的第二个元素定义。下界也可以是0,元素的个数是4,第三维也是这样。
3.2 将二进制文件写入到数据库
由于这个二进制文件可能很大,所以无法将所有内容一次性读入到内存。我们需要多次读入,每次可以使用函数CFile::Read()从文件中读出一个数据包,然后调用Field对象的AppandChrnk()函数将该包读入数据库。AppandChrnk()函数包含在Field对象中,原型如下:HRESULT AppendChunk (const _variant_t & Data );从函数原型中可以看到关键的问题是我们需把二进制数据赋值给VARIANT类型的变量。实现的关键代码如下:
|
我们所有的读入数据工作都在一个while循环中实现,每次读入一个数据包,直到读完这个数据,即数据量为二进制数据的长度ChunkSize。其中*pBuf为指向缓冲区指针,即要读入的数据包。ChunkSize为VARIANT变量,用于保存二进制数据,psa是指向安全数组SAFEARRAY的指针。
3.3 从数据库读出二进制对象到文件
同样,由于这个二进制对象可能很大,无法将所有内容一次性读入内存中对应于保存数据时我们所使用的AppendChunk函数,读取数据应该使用GetChunk函数,GetChunk的原型如下:
_variant_t GetChunk (long Length );唯一的参数Length代表需要读取的字节数。
实现的关键代码如下:
|
其中f是一个CFile对象,代表了要存储的文件。Long型变量lBlobSize记录了二进制对象的大小。利用一个while循环,每次从数据库中读取lIsRead字节,直至将其全部读出。
4 结束语
由于信息技术的飞速发展,特别是多媒体技术的广泛运用,可以预见,以后数据库中大对象的应用将日益普遍,有关大对象的存取势必将是数据库技术的一个发展方向。本文讨论了二进制大对象BLOB在数据库中的存储与读取的VC实现,能够满足基本的系统要求,具备了一定的可移植性,为今后更广泛的应用和更深入的研究提供的借鉴基础。
参考文献
[1] Visual C++ 6.0数据库开发技术与工程实践,人民邮电出版社,2004
[2] MSDN Liberary Visual Studio 6.0, Microsoft Developer Network
[3] 李博轩,Visual C++ 6.0数据库开发指南,清华大学出版社,2000
[4] 朱春花,张子彪,路新春 BLOB数据类型存取方法的研究及应用,计算机应用与软件,2002.10
[4] 王井阳、张晓明等,在Visual C+ +中利用MFC类库访问数据库中的长二进制类型数据,计算机应用研究,2003.20
作者简介
高云飞(1983—):安徽安庆人,解放军理工大学工程兵工程学院研究生,研究方向作战模拟与决策分析等。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者