文档库 最新最全的文档下载
当前位置:文档库 › C++连接数据库

C++连接数据库

使用 Microsoft ActiveX Data Object(ADO)连接数据库

0在C++中使用ADO
Microsoft ActiveX Data Object (ADO)提供了一种简单的访问和操作数据的方法。
ADO的使用,不依赖于数据的存贮、所使用的工具和语言(这也是COM的特点之一);
这种灵活性和易用性使得ADO成为开发者的完美选择;
ADO接口是利用COM技术实现的。不同于VB程序员,C++程序员如果要在C++中使用ADO,
需要了解一些COM技术的知识。所以,要在C++中使用ADO还是比较复杂的。
但是,使用ADO还有一些比较简单的使用方法。这些方法将帮助你隐藏COM使用的一些细节。
在这篇文章中,我将为大家简单实现一个用于封装ADO的Connection对象的C++ 类。
你可以用相同的方法封装其他的ADO对象;


1.在C++程序中添加ADO支持

在程序中使用ADO的一种方法就是利用import指令将ADO的类型库信息导入到程序中。ADO类型库的信息包含在一个叫做msado15.dll的动态链接库中。导入类型库的代码如下:
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")

当然,你可能需要根据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动态链接库,
释放当前程序所维护的所有资源,并且迫使所有为断开的连接断开。









相关文档