第 18 卷 第 11 期 武 汉 科 技 学 院 学 报 Vol.18 No.11
2005 年 11 月 JOURNAL OF WUHAN UNIVERSITY OF SCIENCE AND ENGINEERING Nov. 2005
C++ Builder 存取多媒体数据到 SQL Server
数据库的方法
徐 涛
(武汉科技学院 计算机科学与技术系,湖北 武汉 430073)
摘要:主要介绍使用 C++ Builder 存取各种图像媒体数据到 SQL Server 数据库的方法。按照同样的思路,可
以推广到其它的前端和后端开发工具以及其它媒体类型。
关键词:BDE;BLOB;流
中图分类号:TP314 文献标识码:A 文章编号:1009-5160(2005)-0100-03
多媒体是改善人机接口的有效方法。多媒体信息包括文本、图像、声音和视频等,它们都是以二进制数据集合的形式存
在的,SQL Server 提供了 image 数据类型来存储可变长度二进制数据(大小范围为 0~2GB)。但 image 字段并不能将多媒体
数据直接装入,必须经过一些中间步骤才能将数据存进去。在本文中以图像为例说明 Borland C++ Builder(以下简称为 BCB)
存取多媒体数据到 SQL Server 数据库的方法。C++了 Builder 中的 TStream 数据类型以流的形式对字符或非字符数据进行存
储,就像在内存中开辟了一个大小可变的临时缓存区。它不仅能方便地对外部文件进行读写,而且还可以将流中的全部数据
直接转入数据库,所以用它作桥梁来完成数据存入工作是非常合适的。程序可根据媒体文件的类型,在流中的头上写入类型
描述以及媒体数据本身,而后再将流写入数据库。从数据库中读出数据则是其逆过程:对于从数据库中读出流数据,根据流
数据中提供的类型描述,调用相应的驱动播放。
1 实现
1.1 关于 BDE 和 ADO
BDE(Borland Database Engine)是 BCB 的数据库引擎。当使用 BCB 访问数据库时,需要借助于 TField 对象及其派生对
象 TBlobField,TStream 对象及其派生对象 TMemoryStream 和 TBlobStream。问题在于 BDE 对于 BLOB 字段的缺省长度为
32K,因此,若流数据长度超过 32K 时,BCB 存储到数据库中是尚没有问题(数据库的 image 类型的字段最多可存储 2GB
的数据),但是,由数据库将 image 类型的数据读到 BCB 的 Tstream 对象时,超过 32K 的数据将被截去。若是图像数据,
则只能显示部分图像。解决上述问题的方法是增加 BDE 的 BLOB 字段的缺省长度。具体来说,首先执行 BDE Administrator,
然后找到要修改的数据库,将其 BLOB SIZE的值由缺省的 32 修改为希望的大小(单位为 KB),最后执行菜单命令 Object/Apply
即可。ADO(ActiveX Data Object)能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用、高速度、
低内存支出和占用磁盘空间较少,支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。由于 ADO 没有 BDE 在
BLOB 方面的限制,且使用方便,是微软技术发展的趋势,BCB 亦将其封装为 VCL 组件,因此,ADO 是更好的选择。
1.2 多媒体数据在几种常见对象之间的转移
BCB 支持多媒体数据在几种常见对象之间的转移,见图 1。
2 举例
将一图像文件数据存储到数据库,然后从数据库中取出,并显示出来。
收稿日期:2005-09-01
作者简介:徐涛(1974 -),男,讲师,研究生在读,研究方向:计算机软件.
第 11 期
徐 涛:C++ Builder 存取多媒体数据到 SQL Server 数据库的方法
101
SaveToStream
流
SaveToClipboardFormat
剪切板
LoadFromStream
LoadFromClipboardFormat
媒体控件
LoadFromFile
SaveToFile
SaveToFile
LoadFromStream
SaveToStream
LoadFromFile
文件
LoadFromFile
SaveToFile
数据库(TBlobField)
图 1 多媒体数据在几种常见对象之间的转移示意图
2.1 首先要根据媒体文件类型,将媒体类型数据及媒体数据存储到 TMemoryStream 对象 ms 中
根据文件的扩展名来判断媒体文件类型是一种简单有效方法。
流(stream)是一种能够从各种存储媒体中读写的数据类型。在 BCB 中,TStream 是一个抽象类,其派生出 TFileStream、
TStringStream 和 TMemoryStream 等子类。
在 ms 中除了要保存多媒体数据本身以外,还要保存多媒体数据的类型。因此,通常采用的方法用流的第 0 个字节描述
多媒体数据的类型(比如用 1 表示 Bitmap 类型的图像,用 2 表示 JPEG 类型的图像,用 3 表示 ICON 类型的图像,用 4 表示
WMF 类型的图像,用 5 表示 AVI 类型的视频等),而流从第 1 个字节起存储多媒体数据本身。下面以 JPEG 类型的图像为
例说明。
if(FileStyle==".JPG" || FileStyle==".JPEG" || FileStyle==".JPE" )
{
TJPEGImage *jpeg = new TJPEGImage();
ms->Position=0;
int fs=1;
ms->Write(&fs,1);
ms->Position=1;
jpeg->LoadFromFile(Form1->OpenPictureDialog1->FileName);
jpeg->SaveToStream(ms);
jpeg->Free();
}
2.2 将 ms 中的数据存储到数据库的 image 类型的字段中
设表 TryUseImage 包含字段 pictureid(int 类型,主键)和 picture(image 类型)。现在将 2.1 中的 ms 对象中的数据存储到 picture
字段中,代码如下:
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("update TryUseImage set picture=:picture where pictureid=1");
ADOQuery1->Parameters->ParamByName("picture")->LoadFromStream(ms,ftBlob);
ADOQuery1->ExecSQL();
2.3 将数据库的 image 类型的字段中的数据存储到 TStream 的对象 stream 中
代码如下:
TStream *stream;
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select picture from TryUseImage where pictureid=1");
ADOQuery1->Open();
102
武 汉 科 技 学 院 学 报
2005 年
stream=ADOQuery1->CreateBlobStream((TBlobField*)ADOQuery1->FieldByName("picture"), bmRead);
2.4 选择合适的媒体控件播放 stream 中的数据
需要注意的是,对于从数据库中读到的流数据,要根据流数据的第 0 字节来判断媒体类型,然后选择 BCB 中合适的播
放控件。
stream->Position=0;
__int8 FileStyle;
stream->Read(&FileStyle,1);
stream->Position=1;
if(FileStyle==1) //JPEG
{
TJPEGImage *jpeg = new TJPEGImage();
jpeg->LoadFromStream(stream);
Image1->Picture->Bitmap->Assign(jpeg);
}
3 小结
上面所述的方法 BCB6+SQL Server 2000 标准版中调试通过,以成功地用于通用试题库系统。经过适当的扩充和修改后,
这些程序也可使用在如学籍管理、档案管理、人事管理、商品交易等涉及到多媒体数据的应用系统中。
本文主要以当前的几中常见图像为例来介绍在 C++ Builder 存取多媒体数据到 SQL Server 数据库的方法,其它多媒体数
据类型如声音、视频等的转出过程与图像的转出完全相同,只是回放部分应针对不同媒体类型采用不同的媒体播放控件。另
外,下面所介绍的方法经过适当的扩充和修改后,同样适合 Sybase、Oracle 等数据库和 Powerbuilder、VB 等前端开发工具。
参考文献:
[1] 闪四清. SQL Server 系统管理和应用开发指南[M]. 北京:清华大学出版社, 2000.197~205.
[2] 程展鹏. Borland C++ Builder 应用开发技术解析[M]. 北京:清华大学出版社, 2000.76~94.
The Technique Of C++ Builder Access Multimedia Data In SQL Server 2000
(Department of Computer Science, Wuhan University of Science and Engineering, Wuhan Hubei 430074, China)
XU Tao
Abstract: In this paper the technique of C++ Builder access image data in SQL Server 2000 is discusswd.According to the technique,it
can be popularized to other proscenium and background designing tools,as well as other multimedia type.
Key words: BDE;BLOB,stream