在Visual C++中使用ADO存取数据库

发表于:2007-07-14来源:作者:点击数: 标签:
文/潘娅、王牛、景玲 我们本次的话题就是——在VC中使用ADO(ActiveX Data Objects)。Visual C++提供了多种 数据库 处理方法,我们既可以直接从DAO SDKs(Data Access Objects Software Development Kits)或ODBC SDKs(Open Database Connectivity)中调用数据库
  文/潘娅、王牛、景玲

  我们本次的话题就是——在VC中使用ADO(ActiveX Data Objects)。Visual C++提供了多种数据库处理方法,我们既可以直接从DAO SDKs(Data Aclearcase/" target="_blank" >ccess Objects Software Development Kits)或ODBC SDKs(Open Database Connectivity)中调用数据库API函数,也可以选择使用MFC(Microsoft Foundation Class Library),即使用MFC DAO和MFC ODBC类来处理数据库API。

  
  1、导入ADO接口

  VC编译器有这样一个特性:它可以读出COM类型库(.tlb文件),并提取其中声明的有关接口的类型库的详细资料,Microsoft的#import指令即可完成此工作。因此,为使C++程序进入ADO接口,我们用Visual Studio创建了一个空的Win32 Consol Project之后,在头文件中加入下面的一行代码:

  #import "D:Program FilesCommon Files

  SYSTEMADOmsado15.dll" no_namespace

  rename("EOF","rsEOF")

  卧龙传说提醒:该行代码应在同一行上,不能断行,这里只是版面的缘故。

  因为它指明了msado15.dll的具体位置。用户也可以在自己的Visual Studio 6的“Tools”菜单中选择“OLE/COM Object Viewer”,打开OLE/COM对象视图,通过“File|TypeLiB…”打开上面路径中的msado15.dll,查看该类型库的详细信息。

  2、创建ADO连接类

  (景玲一身淑女打扮)正确地导入类型库信息后,就可以声明一个ADO Connection对象类。该对象可以提供许多方法,在本文中我们只进行简介,仅创建了3个最有用的方法,即:Open()、Execute()和Close()。Open()方法打开一个数据库连接;Execute()方法对该数据库执行一个SQL请求并返回一组记录值;Close()方法关闭一个已打开的对象。

  class CADOConnection

  { _ConnectionPtr m_Con;

  public:

   // member functions

  CADOConnection();

  ~CADOConnection();

  bool Open(char *DSN,char *u_id,char *pass);

  bool Close(void);

  _RecordsetPtr Execute(char *sqlquery);};

  该段代码中,_ConnectionPtr定义了一个ADO对象,用变量m_Con来存储当前打开的对象的指针;而Execute()方法返回了一组记录的指针,我们用_RecordsetPtr来定义。

  3、ADO对象的实现

  (帅哥王牛向大家挥挥手)ADO依赖COM来实现。因此在我们的CADOConnection开始使用ADO对象之前,我们应该先对COM进行初始化,它可以在WinMain()中或其他程序段中实现。这里,我们把它放在类构造器中。如下:

  CADOConnection::CADOConnection()

  { // initialize COM

  CoInitialize(NULL);

  // holds current connection

  m_Con=NULL;}

  因为在对象创建的时候,没有任何数据库被打开,所以应设置m_Con为空。

  CADOConnection::Open()方法需要3个参数:被打开的DSN(ODBC Data Source Name,即ODBC数据源)、指定的用户名及口令。如果检测到一个空的DSN,Open()将创建一个连接对象的实例,如下面的代码所示:

  HRESULT hCon;

  _ConnectionPtr con = NULL;

  // ...

  hCon=con.CreateInstance(_uuidof(Connection));

  if(hCon != S_OK)

  //...

   COM组件对象有一个惟一的标识,称为CLSID。_uuidof机制利用对象的名称返回它的CLSID,而Open()通过它调用_com_ptr_t模板类中的CreateInstance()方法。COM的方法总是返回一个HRESULT,如果成功,它应该为S_OK。若ADO Connection对象创建成功,Open()就使用DSN、用户名、口令组成连接字串来打开数据库,接下来Open()再调用ADO Connection对象的Open()方法:

  HRESULT result =con-〉Open(_bstr_t(constr),"","",0);

   卧龙传说提醒:现在con是一个非空的指针了。ADO对象的第一个参数是连接字串;第二个和第三个参数分别是用户名和口令,可以为空;最后一个参数指明打开是的选项,设置为0。

  如果Open()调用成功则返回TRUE,否则返回FALSE。

   CADOConnection::Execute()主要对已经打开的数据库执行一个SQL请求,并返回一组记录值。代码实现如下:

  _RecordsetPtr CADOConnection::Execute(char *sqlquery)

  { // we should have a connection open, right ?

   if (m_Con==NULL)

   return NULL;

   _variant_t rec_affected;

   return m_Con-〉Execute(_bstr_t(sqlquery),&&rec_affected,0);}

   当检测到一个打开的数据库连接,该代码就执行Execute()方法。它的第二个参数是请求返回的一组记录数据的指针。

   CADOConnection::Close()只是简单地关闭一个打开的数据库连接。

  bool CADOConnection::Close(void)

  { if (m_Con==NULL)

  return false;

  else

  { HRESULT hr=m_Con-〉Close();

  m_Con=NULL;

  return (hr==S_OK?true:false);} }

   最后,再介绍一下CADOConnection类中重要的析构函数:

  CADOConnection:~CADOConnection()

  {// close connection, if not yet closed

  if (m_Con)

  m_Con-〉Close();

  m_Con=NULL;// VIMP !!!

  // un-initialize COM

  CoUninitialize();}

  析构函数的工作是在用户退出该连接类的时候,检查该对象是否仍处于打开状态。如果是,它首先应被关闭,即设置指向活动连接的指针变量为NULL;最终,在构造函数中被初始化的COM运行环境,将调用Win32的CoUninitialize()方法结束。

  本文的目的就是阐明如何创建VC的类,使之在使用ADO COM对象时更为方便。当然,同样的概念也适用于其他类型库中的COM对象。

原文转自:http://www.ltesting.net