C++ Access数据库连接、读写等

来源:互联网 发布:小学生有必要学编程吗 编辑:程序博客网 时间:2024/06/04 00:56

       使用C++编程语言,连接对Access数据库进行操作,常用的方法有DAO和ADO两种方式,本文将介绍采用ADO的方式方位Access数据库。

       先介绍一下ADO,ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组建。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。

       在程序的开始,首先导入所需要的库:#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") ,这里重命名EOF是必要的,因为典型的VC应用都已经定义了EOF作为常数-1。

       完整的程序如下,以注释的形式来对程序进行解释:

       _ConnectionPtr m_pConnection;  //连接access数据库的链接对象 

       _RecordsetPtr m_pRecordset;  //结果集对象 

       CoInitialize(NULL);  //初始化 

       m_pConnection.CreateInstance(__uuidof(Connection));//实例化对象  

 

        //连到具体某个mdb ,此处的的Provider语句因Access版本的不同而有所不同。

       try 

      { 

            m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MyAccess.mdb","","", adModeUnknown); 

      } 

      catch(_com_error e) 

      { 

          AfxMessagebox(_T("数据库连接失败!")); 

          return

      } 

 

      m_pRecordset.CreateInstance(__uuidof(Recordset));//实例化结果集对象 

       //执行sql语句 

     try 

     { 

         CString sql= _T("select * from Patient");

         m_pRecordset->Open(sql, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); 

     } 

     catch(_com_error *e) 

     { 

         AfxMessageBox(e->ErrorMessage()); 

         if(m_pConnection->State) 

         { 

             m_pConnection->Close(); 

             m_pConnection= NULL; 

         } 

         return

     } 

     //处理结果集 

     try 

     {    

         //若结果为空,结束 

         if(m_pRecordset->BOF) 

        { 

             AfxMessageBox_T(("表内数据为空!")); 

             if(m_pConnection->State) 

             { 

                 m_pRecordset->Close(); 

                 m_pRecordset = NULL; 

                 m_pConnection->Close(); 

                 m_pConnection= NULL; 

             } 

             return

         }   

         //游标定位到第一条记录 

         m_pRecordset->MoveFirst(); 

         _variant_t var; //从结果集中取出的数据放到var中 

         char *name;  

         while(!m_pRecordset->adoEOF) 

         { 

             var= m_pRecordset->GetCollect("Name");  //要取字段的名称。

             if(var.vt != VT_NULL) 

             { 

                 name= _com_util::ConvertBSTRToString((_bstr_t)var);  //转换成char*类型

             } 

             string MyName = name;

             m_pRecordset->MoveNext(); 

         } 

     } 

     catch(_com_error *e)     

    { 

         AfxMessageBox(e->ErrorMssage()); 

     } 

     //退出程序时的处理  ,关闭数据库的相关操作

     if(m_pConnection->State) 

     { 

         m_pRecordset->Close(); 

         m_pRecordset = NULL; 

         m_pConnection->Close(); 

         m_pConnection= NULL; 

     } 

原创粉丝点击