VC中使用ADO存取OLE对象类型数据

时间:2022-10-16 06:52:46

【前言】VC中使用ADO存取OLE对象类型数据由文秘帮小编整理而成,但愿对你的学习工作带来帮助。(College of Information Science and Technology, ChengDu University of Technology, Chengdu 610059, China) Abstract: Large object data (sound file and large text file etc.) can be stored in binary type fields of database in form of long binary stream...

VC中使用ADO存取OLE对象类型数据

摘要:在数据库中的长二进制类型字段往往存储了如声音文件,“大文本文件”等大对象数据,并且这些数据以二进制流的形式存储,如何来存取这些数据就成了要解决的问题。文章以“大文本文件”为例,讨论了在vc++ 6.0中,如何利用ADO中对ACCESS数据库中的OLE对象类型数据进行读取和存储。

关键词:VC++ 6.0;ADO技术;ACCESS数据库;长二进制数据;OLE对象

中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)29-7065-03

Using ADO Technology to Access OLE Object Data in VC

DING Rui, ZHOU Dong-mei, YAN Qiang

(College of Information Science and Technology, ChengDu University of Technology, Chengdu 610059, China)

Abstract: Large object data (sound file and large text file etc.) can be stored in binary type fields of database in form of long binary stream,how to access these data has become our problem to be solved. Based on large text file as an example, this paper discussed how to use ADO techinology to access the OLE object data of ACCESS database in VC++6.0.

Key words: VC++ 6.0; ADO technology; ACCESS database; long binary data; OLE object

1 绪论

随着计算机科学技术的不断发展,在应用程序中,数据库不但要处理简单类型的数据,还要处理大量的大对象数据,比如:图形、音频、视频文件或其他二进制数据,这些数据称之为二进制大对象(BLOB Binary Large Object)[1]。翻阅资料发现,对图形、音视频的大对象数据的读取的资料比较多,而对“大文本文件”的资料较少,因此本文以“大文本文件”为例,给出了在VC++ 6.0中,使用ADO中Field想象的GetChunk()方法和AppendChunk()方法对ACCESS中OLE对象类型数据读取和存储的实现方法。

2 ADO技术

ADO是ActiveX数据对象(ActiveX Data Object),是Microsoft开发的数据库应用程序的面向对象的新接口[2]。它封装并实现了OLE DB的所有功能,他通过OLE DB提供的COM接口访问数据库,可以访问各种类型的数据源。ADO同OLE DB、数据库应用以及数据源之间的关系如图1所示[3]。

2.1 ADO对象模型

ADO对象模型包括的主要对象:

1) 连接对象(Connection)

用于建立与数据库的连接。通过连接可从应用程序访问数据源。它保存诸如指针类型、连接字符串、查询超时、连接超时和缺省数据库这样的连接信息。

2) 命令对象(Command)

定义了将对数据源执行的指定命令。Command对象可以在数据库中添加、删除或更新数据、或者在表中进行数据查询。返回的结果保存在Recordset对象中。

3) 记录集(RecordSet)

表示的是来自基本表或命令执行结果的记录全集。任何时候,Recordset对象所指的当前记录均为集合内的单个记录。使用ADO时,通过Recordset对象可对几乎所有数据进行操作。所有Recordset对象均使用记录(行)和字段(列)进行构造。在一个Connection对象上,可以同时打开多个Recordset。

4) 字段对象(Field)

Recordset对象包含一个或多个Fields对象。每一个字段(列)都分别包含有名称、数据类型和值的属性,值中包含了来自数据源的真实数据。要修改数据源中的数据,可在记录集行中修改Field对象的值,对记录集的更改最终被传送给数据源。

ADO对象模型可以表示为如图2所示[4]。

2.2 ADO编程的基本步骤

在VC++中,使用ADO操作数据库的主要步和方法:

1)初始化COM库,引入ADO库定义文件。

ADO是一组 COM动态库,这意味着应用程序在调用 ADO前,必须初始化OLE/COM库环境,在MFC应用程序中,通常在 CWinApp:: InitIns tance()的重载函数中完成。代码如下:

BOOL COLEDataApp::InitInstance()

{

if(!AfxOleInit())

{

AfxMessageBox("初始化OLEDLL失败");

return FALSE;

}}

在VC中利用ADO访问数据库时,需要导入ADO库。通常在ADO程序的预编译头文件:stdAfx.h中导入该库,方法是利用improt指令将此动态链接库导入,具体代码如下[5]:

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

2)打开数据库。

首先需要创建数据库连接对象(connection),然后调用该对象的Open方法即可打开数据库。

声明一个指向Connecti on对象的指针_ConnectionPtr m_pConnection;

通过JET数据库引擎对 Access 2000, Access2003数据库进行连接,代码如下:

m_pConnection->Open("Provider=microsoft.Jet.OLEDB.4.0; DataSource=db1.mdb","","",adModeUnknown);

3)操作数据库数据。

在数据库打开之后,通过Connection、Command对象执行SQL命令,或者创建记录集(Recordset)对象,使用该对象的各种方法就可以进行数据库数据的查询、定位以及增加、删除和修改。

4)关闭数据库。使用上面创建的数据库连接对象的close方法就可以进行数据库的关闭。

2.3 ADO存取OLE对象类型数据的方法

VC++中用ADO对OLE对象类型数据存取是利用Field对象提供的AppendChunk()和GetChunk()[6]方法来存取的。

GetChunk()返回一个variant值,该值包含大的文本或二进制数据Field对象的全部内容或部分内容。

AppendChunk()用于将数据追加到大的文本或二进制数据Field或追加到Parameten对象。

3 应用举例

Microsoft Access 具备完善的数据库功能,可以作为独立的DBMS使用,是PC机上开发客户机/服务器型数据库应用的优秀工具。它将若干个相互关联的表(table)组成一个数据库(*. mdb)[7]。

在db1.mdb数据库中,存在一张名为avtw的表,数据结构如表1所示。

其中,avld字段中存储的为250个地区每天的亮温数据。

3.1 前期准备

1) 利用 MFC AppWizard[exe]创建一个单文档的工程,名为OLEData。首先为该工程添加一个子菜单,名称为“长二进制数据”。接着,为该子菜单添加两个菜单项,分别为他们添加相应的命令响应函数。各菜单项的ID、名称、以及响应函数如表2所示。

2) 在InitInstance()成员函数中用AfxOleInit()函数来初始化COM库。

3) 在stdafx.h头文件中用#import导入ADO库文件。

3.2 从OLE类型字段读出数据

从OLE字段读数据,我们采用GetChunk()返回包含数据的VARIANT类型变量,然后利用SafeArrayAccessData()得到VARIANT变量中指向数据的short *类型的指针,以方便我们的处理对象。关键代码如下:

_variant_tvarBLOB;

varBLOB =m_pRecordset->GetFields()->

GetItem("avld")->GetChunk(lDataSize);

if(varBLOB.vt == (VT_ARRAY | VT_UI1))

{

varBLOB.vt=VT_I2;

short *m_pBuffer = new short[lDataSize/2];

SafeArrayAccessData(varBLOB.parray,(void **)&m_pBuffer); //得到指向数据的指针

/*这里我们可以把m_pBuffer 中的数据存储到指定的.txt文件中*/

SafeArrayUnaccessData (varBLOB.parray);

}

3.3 把数据保存到OLE类型字段

保存数据到OLE字段,我们需要先从文件中读取数据存入内存中,然后组织一天数据到pRow,利用AppendChunk()将数据存到OLE字段,而存取的关键问题是需把二进制数据赋值给VARIANT类型的变量。关键代码如下:

/*首先组织一天数据到pRow中,代码省略*/

char *pBuf =(char *)pRow;

VARIANT varBLOB;

SAFEARRAY *psa;

SAFEARRAYBOUND rgsabound[1];

if(pBuf)

{

rgsabound[0].lLbound = 0;

rgsabound[0].cElements = SIZE*2;

psa = SafeArrayCreate(VT_UI1, 1, rgsabound); //创建SafeArray指针

for (long i = 0; i < (long)SIZE*2; i++)

SafeArrayPutElement (psa, &i, pBuf++); //将pBuf指向的二进制数据保存到SAFEARRAY对象psa中

varBLOB.vt = VT_ARRAY | VT_UI1; //将varBLOB的类型设置为byte类型的数组

varBLOB.parray = psa;

m_pRecordset->GetFields()->GetItem("avld")->AppendChunk(varBLOB);

}

m_pRecordset->Update(); //保存我们的数据到库中

4 结束语

该文利用实例讨论了在VC中如何使用ADO技术对ACCESS数据库中的OLE对象类型的数据进行读取和存储,从而解决了在数据库编程中对大量数据存取的难题。

参考文献:

[1] 费巧玲, 徐向阳. VC中用ADO实现大数据的存取[J].计算机工程与应用,2005(24):182.

[2] 吴涵. 基于VC++的研究生信息管理系统的设计与实现[J].计算机技术与发展,2006,16(12):184.

[3] 郑慧, 范忠诚. 零基础学Visual C++[M].北京:机械工业出版社,2008.

[4] 齐永奇, 乔文生. 基于Visual C++的ADO数据库开发技术[J].华北水利水电学院学报,2008,29(4):68.

[5] 孙鑫. VC++深入详解[M].北京:电子工业出版社,2008.

[6] 马乐荣, 高兴慧. Visual C++ 6.0中使ado实现数据库大字段存取[J].计算机应用与软件,2005,22(12):36.

[7] 谷庆华, 李成贵. 基于Java语言实现数据库的访问[J].计算机技术与发展,2008,18(2):15.

上一篇:数字电路教学探讨及仿真软件在教学中的应用 下一篇:基于数字水印的电子印章系统