logo资料库

C++Builder存取多媒体数据到SQLServer数据库的方法.pdf

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
第 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
分享到:
收藏