在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对象;

在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翻译而来,如果需要源代码,可以到该网址上去下载。

原文链接: https://www.cnblogs.com/cylee025/archive/2011/04/01/2002651.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    在C++中使用ADO

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/23184

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午1:09
下一篇 2023年2月8日 上午1:10

相关推荐