ADO在VC++中的应用
来源:岁月联盟
时间:2010-08-30
关键词 ADO;数据库;应用程序的开发;VC++
1 引言
ADO是Microsoft 公司新的数据访问技术,由于它是基于OLE DB接口上实现的COM对象,其性能和易用性都达到了极佳水平。ADO并不与数据库直接打交道,而是要通过ODBC驱动程序或OLE DB连接字符串来操作数据库。ODBC或OLE DB是应用程序与数据库进行连接通信的接口,其作用是将特定类型数据库中的数据变换为标准而能统一操作的数据源。利用ADO对象并通过ODBC或OLE DB,可以实现对任意数据库的存取和访问。
ADO模型包括7个对象,主要对象有3个:Connection、Command和 Recordset ,可以被独立创建和释放。此外,还包括其他4个集合对象:Fields、Errors、Parameters和Properties。一个典型的ADO应用程序使用Connection对象建立与数据源的连接,然后用一个Command对象给出对数据库操作的命令,如插入数据或者查询数据等,而Recordset用于对结果集进行维护或者浏览等操作。其中Command命令所使用的语言与低层所对应的OLE DB数据源有关,不同的数据源可以使用不同的命令语言,对于关系数据库,通常使用SQL作为命令语言。
2 VC++中使用ADO开发数据库应用程序一般步骤
在VC++中使用ADO开发数据库应用程序一般包括以下步骤:
(1)初始化COM库,引入ADO库定义文件。
(2)用Connection对象连接数据库。
(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行处理、查询。
(4)使用完后关闭连接,释放对象所占的资源。
3 ADO使用实例
3.1 引入ADO动态链接库,初始化COM库环境
在使用Visual C++的MFC编程时,MFC并没有提供对ADO的封装类,能够支持ADO编程的是ADO的COM动态链接库文件msado*.dll ,“*”位置的数字代表ADO库的版本。引入该文件的方法是在stdafx .h头文件中,添加如下代码:
#import”c:/program files/common files/system/ado/ maado15.dll”/
no_namespace rename(“EOF”,”adoEOF”)
这些命令声明在工程中使用ADO,但不使用ADO的名字空间,并为了避免冲突,将EOF改名为adoEOF。
ADO是基于COM技术的,所以,在应用程序调用ADO前,必须初始化COM库环境。ADO使用结束后需要关闭库,释放初始化加载的动态链接库。
::CoInitialize(NULL) ; //初始化COM库
::CoUninitialize(); //清除COM库
3.2 创建ADO与数据库的连接
使用Connection对象打开连接,在引入的动态链接库生成的定义文件(msado15.tlh)中Open方法的定义如下:
HRESULT Open(_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options)
由于使用的数据库软件的不同,连接串的格式也有所不同,给程序员带来很多麻烦。微软公司提供了一种可视化的方法来解决这个问题,它提供了通用数据连接文件(UDL)来建立和测试ADO的连接属性。
主要代码如下:
HRESULT _ConnectionPtr m_pConnection; //连接对象智能指针
//初始化数据库连接
HRESULT hr;
try
{
hr= m_pConnection.CreateInstance(_uuidof(Connection)); //实例化连接对象
if(SUCCEEDED(hr))
{
//设置连接串属性为UDL文件
m_pConnection-> ConnectionString=”File Name=name.udl”;
//设置等待连接打开的时间为20s
m_pConnection-> ConnectionTimeout=20;
hr= m_pConnection->Open(” ”,” ”,” ”,adConnectUnspecified);
if(FAILED(hr))
{
AfxMessageBox(“Open fail”);
Return TRUE;
}
}
else
{
AfxMessageBox(“createinstance of Connection fail”);
return TRUE;
}
}
catch(_com_error e)
{
//给出异常信息
_bstr_t bstrSource(e,Source());
_bstr_t bstrDescription(e. Description());
AfxMessageBox(bstrSource+ bstrDescription)
return TRUE;
}
3.3 使用记录集(Recordset)对象操作数据库
在ADO程序中,记录集实际上缓存可从数据库获得的记录,应用程序可以从记录集中获得每条记录的字段。Open方法在msado15.h文件中的定义如下:
HRESULT Open(const _variant_t & Source, const _variant_t & ActiveConntction, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long options )
其中,参数Source是记录源;参数ActiveConntction指定在哪个连接中打开该记录集;参数CursorType指定打开Recordset时使用的游标;参数LockType指定打开记录集时应该使用的锁定类型;参数options指定参数Source的种类。
主要代码如下:
HRESULT hr;
_variant_t var;
_RecordsetPtr pRecordset; //定义记录集指针
hr= pRecordset.CreateInstance(_uuidof(Recordset)); //实例化记录集指针
CString strsql;
strsql=”SELECT * FROM nametable”//定义并初始化SQL语句字符串,nametable为表名
try
{//利用Open函数执行SQL命令,获得查询结果记录集
hr=pRecordset->Open(_variant_t(strsql),m_pConnection.GetInterfacePtr(),adOpenDynamic,
adLockOptimistic,adCmdText);
if(hr)
{
while(!pRecordset->adoEOF)
{//获取第1列的值,从0开始计数,也可以直接给出列的名字
var= pRecordset->GetCollect((long)0);
var= pRecordset->GetCollect(“Name”);
pRecordset->MoveNext(); //移动当前记录到下一条记录
}
pRecordset->MoveFirst(); //移动到首条记录
pRecordset->Delete(adAffectCurent); //删除当前记录
pRecordset->AddNew( ); //添加新记录
pRecordset->PutCollect(“ID”, _variant_t((long)72));
pRecordset->PutCollect(“Name”, _variant_t(“小王”));
pRecordset->MoveNext();
pRecordset->PutCollect(“Name”, _variant_t(“小周”));//修改Name字段的值
pRecordset->Update // 保存到数据库中
}
else
{
AfxMessageBox(“Open recordset fail”);
return;
}
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
return;
}
pRecordset->Close();
pRecordset=NULL;
3.4 使用Command对象操作数据库
Command对象定义了将对数据源执行的指定命令。使用Command对象的流程和记录集对象类似,首先声明_CommandPtr变量;实例化变量;设置对象的某些属性值;调用Execute方法执行命令。所以,这里就不给出代码了。
4 结束语
ADO是应用级的编程接口,它以OLE DB为基础,对OLE DB进行了封装。它的主要优点是易于使用、速度快、内存支出少和使用较少的流量。ADO技术是微软大力支持和的技术,对于致力与Visual C++的程序员来说,了解和掌握ADO技术具有深远的意义。
[1] 原奕等编著.Visual C++实践与提高——数据库开发与工程应用篇[M].北京:铁道出版社,2006
[2] David Sceppa著,石钧,葛俊译.ADO编程技术[M].北京:清华大学出版社,2001
[3] 厄拉森.MFC Visual C++6编程技术内幕[M].北京:机械出版社,2000
[4] 江淑娟,苏蕊等.利用ADO方法在C/S模式下实现远程数据访问[J] ,山东科技大学学报(版),2003 ,22(1):73-75
上一篇:层次化设计的时序收敛性研究