Using ADO in C++(在C++中使用ADO)
时间:2011-04-01 来源:cylee025
Microsoft ActiveX Data Object (ADO)提供了一种简单的访问和操作数据的方法。ADO不的使用,不依赖于数据的存贮、 所使用的工具和语言(这也是COM的特点之一);这种灵活性和易用性使得ADO成为开发者的完美选择;ADO接口是利用COM技术实现的。不同于VB程序 员,C++程序员如果要在C++中使用ADO,需要了解一些COM技术的知识。所以,要在C++中使用ADO还是比较复杂的。但是,使用ADO还有一些比 较简单的使用方法。这些方法将帮助你隐藏COM使用的一些细节。在这篇文章中,我将为大家简单实现一个用于封装ADO的Connection对象的C++ 类。你可以用相同的方法封装其他的ADO对象;
在C++程序中添加ADO支持
在程序中使用ADO的一种方法就是利用import指令将ADO的类型库信息导入到程序中。ADO类型库的信息包含在一个叫做msado15.dll的动态链接库中。导入类型库的代码如下:
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF", "EndOfFile")
当然,你可能需要根据msado15.dll在你的计算机中的位置适当的改变路径。因为我没有使用#import指令的no_namespace选项,所以该指令将产生一个类型库的的头文件(一般是msado15.tlh),该头文件包含了ADODB命名空间中的typedef声明、接口的智能指针和枚举类型。rename宏告诉预处理器将ADODB命名空间中的EOF常数用EndOfFile代替(从而避免命名冲突);ADO定义了九个对象(Connection/Command/Recordset/Record/Stream/Parameter/Field/Property/Error)和四个集合(Parameters/Fields/Properties/Errors).#import指令将产生所有ADO对象的只能指针,例如:指向_Connection对像的智能指针类型是_ConnectionPtr类型;所以,如果你想要使用一个_Connection对象,就必须定义一个_ConnectionPtr类型:
ADODB::ConnectionPtr Cnn;
现在,创建一个名为DataBase.h的C/C++头文件,并添加以下代码:
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF", "EndOfFile") typedef ADODB::_RecordsetPtr RecPtr; typedef ADODB::_ConnectionPtr CnnPtr;
注意:这里利用typedef命令重新定义了ADODB::_RecordsetPtr和ADODB::_ConnectionPtr CnnPtr
class Database { public: CnnPtr m_Cnn; Database(); ~ Database(); bool Open(char* UserName, char* Pwd, char* CnnStr, char* ErrStr); RecPtr Execute(char* CmdStr); bool Close(); };
事实上,ADO Connection对象有很多的methods(注意:这里的method是COM技术中的一种术语,相当于C++类中的成员函数)。但是,为了简化代码,我只声明三个method(Open/Close/Execute)来实现Connection对象中的三个相应的method:Open---建立与数据库的连接;Exexcute---在已建立的连接上执行一段命令或者存储过程;Close---断开于数据库的连接;
Database类中成员函数的实现
//析构函数 Database::Database() { m_Cnn=NULL; }
这里设置m_Cnn为NULL,因为在对象定义的时候,还没有建立好的连接;
//Open函数 bool Database::Open(char* UserName, char* Pwd, char* CnnStr) { HRESULT hr; try { if(m_Cnn==NULL) return 0; hr = m_Cnn.CreateInstance( __uuidof( ADODB::Connection ) ); m_Cnn->Open(CnnStr, UserName, Pwd, NULL); } catch(_com_error &e) { // Handle errors return 0; } return 1; }
这里的__uuidof(ADODB::Connection)返回接口的ID,该ID用来创建Connection对象的一个实例(具体可以学习一下COM技术的基本概念和实现方法,也可以查阅MFC中关于COM的一些C++实现)。如果一个connection对象被成功创建,Open方法将试图建立与数据库的连接;Open需要三个参数:connection string(连接字符串),user name(用户名)和password(密码)。如果连接建立成功,该函数返回1。这里我用一个catch语句来捕获connection对象的method抛出的异常;
//Execute函数 RecPtr Database::Execute(char* CmdStr) { try { if(m_Cnn==NULL) return NULL; return m_Cnn->Execute(CmdStr,NULL,1); } catch(_com_error &e) { // Handle errors return NULL; } }
Execute()方法需要一个有效的SQL查询语句,然后返回一个指向Recordset对象的智能指针。
//Close()函数 bool Database::Close() { //is there any established connection? //if no, return 0 if (m_Con==NULL) return 0; //if any, close that connection try { m_Con->Close(); m_Con=NULL; } catch(_com_error &e) { // Handle errors return 0; } return hr==S_OK; } //析构函数 Database::~Database() { try { //close connection, if not yet closed if (m_Con) { m_Con->Close(); m_Con=NULL; } } catch(_com_error &e) { // Handle errors } }
注意:在使用程序中使用ADO时,必须首先初始化COM环境。所以在使用该类之前,必须首先利用下面所示的代码对COM环境进行初始化:
if(FAILED(::CoInitialize(NULL))) return;
在程序的最后还需要调用::CoUninitialize();该函数将关闭当前进程中的COM库,卸载当前程序所加载的所有的COM动态链接库,释放当前程序所维护的所有资源,并且迫使所有为断开的连接断开。
注:该文是本人从http://www.codeguru.com/cpp/data/mfc_database/ado/article.php/c6729__2/Using-ADO-from-C.htm翻译而来,如果需要源代码,可以到该网址上去下载。