使用ADO存取数据

       Visual C 提供了对ADO编程的支持,在每个windows系统的系统盘下面都有目录“program files\common files\system\ado”,在这个目录下面包含一个msado**.dll文件,根据不同的windows版本,可以提供msado15.dll、msado2.dll。

 

      利用#import宏可以将这个动态库文件加载到工程中,这个动态库提供对ADO对象的封装,主要的类有:

 
_ConnectionPtr   指向某个connection对象的指针 
_RecordsetPtr    指向某个Recordset对象的指针
_CommandPtr      指向某个Command对象的指针
 
      ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。

  _CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。

  _RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。
 
 
   1、导入ADO接口

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

       

        根据自己的系统ado所在的目录及msado**.dll响应设置#import宏

        在对话框类的头文件的所有的#include宏之后及类声明之前加入下面的#include宏:

  1.  #import "c:/program files/commonfiles/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")

  该行代码应在同一行上,不能断行。
       为了避免常数冲突,通常将常数EOF改名为adoEOF。

   因为它指明了msado15.dll的具体位置。用户也可以在自己的Visual Studio 6的“Tools”菜单中选择“OLE/COM Object Viewer”,打开OLE/COM对象视图,通过“File|TypeLiB…”打开上面路径中的msado15.dll,查看该类型库的详细信息。
 
         2、初始化COM库
 
          ADO依赖COM来实现。因此在我们的CADOConnection开始使用ADO对象之前,我们应该先对COM进行初始化,它可以在WinMain()中或其他程序段中实现。这里,我们把它放在类构造器中。如下:

   _CADOConnection::CADOConnection()

   { // initialize COM

   CoInitialize(NULL);

   // holds current connection

   m_Con=NULL;}

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

 
          3、创建一个connection对象
 
       在使用#import宏后,不能自己创建某个ADO类的对象,而必须通过这些封装类的CreatInstance()函数来创建一个对应的对象。
       如
  1.        _ConnectionPtr  m_pAdoConnect = MULL;
  2.        //创建一个connection对象
  3.        m_ pAdoConnect.CreatInstance(_uuidof(Connection));

 

        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()方法结束。



 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值