MFC利用ADO操作Access数据库

一、 导入ADO动态连接库

在工程的stdafx.h中加入以下语句:

       #import "c:\program files\commonfiles\system\ado\msado15.dll"  no_namespace   rename("EOF","adoEOF")
二、连接数据库

新建一个类,用来专门处理数据库的连接和各种操作

ADO库包含三个基本接口:_ConnectionPtr接口,_CommandPtr接口,_RecordsetPtr接口。这些都是智能指针,和普通的指针一样,也需要定义指针变量、创建其实例,然后就可以调用它的方法和属性。不同的是,改只能指针最后是自动进行内存释放的,调用Close方法就可以了。

1、_ConnectionPtr接口:该接口返回一个记录集或一个空指针,通常用它来创建一个数据库连接,或执行一条不返回任何结果的SQL语句,不推荐用它来返回一个记录集

2、_CommandPtr接口:返回一个记录集,提供一种简单的方法来执行返回记录集的存储过程和SQL语句。

3、_RecordsetPtr接口:是一个记录集对象,对记录集提供更多的控制功能,多用于得到查询操作的返回结果。

在类中新建上述上个接口的变量

   _ConnectionPtr m_pConnection;
   m_pConnection.CreateInstance(__unidof(Connection));
   //m_pConnection.CreateInstance(“ADODB.Connection”); //第二种方法
   _CommandPtr m_pCommand;
   _RecordsetPtr m_pRecordset;

新建一个函数,专门用于数据库的连接

    _bstr_t strSQL="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=test.mdb";
    try
    {
       m_pConnection.CreateInstance("ADODB.Connection");
       m_pConnection->Open(strSQL,"","",adModeUnknown);
    }
    catch(_com_errore)
    {
       AfxMessageBox(e.ErrorMessage());
    }

关闭连接

    m_pConnection->Close();
    m_pConnection=NULL;

三、  数据库的操作

1 查询:

一般用_RecordsetPtr才完成查询操作,并存储得到的结果

	HRESULT Recordset15::Open (const _variant_t & Source,
                                   const_variant_t & ActiveConnection,
                                   enumCursorTypeEnum  CursorType,
                                   enumLockTypeEnum  LockType,
				   long Options ) ;

参数Source:为_variant_t类型的引用,可以为有效的Command对象、SQL语句、表名、存储过程调用等。

参数ActiveConnection:为_variant_t类型的引用,为已经建立好的连接。

参数CursorType:用于设置在打开Recordset时提供者应使用的游标类型,它可取CursorTypeEnum 中的任一值,默认值为adOpenForwardOnly。

参数 LockType:用于设置在打开Recordset时提供者应使用的锁定类型,它可取枚举LockTypeEnum中的任一值,默认值为adLockReadOnly。

参数 Options:用于设置获取Source(即Open第一个参数)的方式,其类型long。

例如:m_pRecordset.CreateInstance(__uuidof(Recordset));

 

      try
       {
              m_pRecordset->Open("select* from lesson",
                     m_pConnection.GetInterfacePtr(),//采用已经建好的连接
                     adOpenDynamic,adLockOptimistic,adCmdText);
              _variant_t var;
              while(!m_pRecordset->adoEOF) //遍历结果集中的内容
              {
                     var=m_pRecordset->GetCollect("id");//根据表名来获得内容
                     if(var.vt != VT_NULL)
                            id =(LPCSTR)_bstr_t(var); //获得表项的内容
                     m_pRecordset->MoveNext();//指针向下移动
              }
       }
       catch(_com_error e)
       {
              AfxMessageBox(e.ErrorMessage());
       }


2 添加

三种方法:一、用m_pConnection的Open方法;二、用m_pRecordset的Addnew 方法。三、用m_pCommand执行

用m_pConnection的Open方法

	_variant_t RecordsAffected;
       try
       {
              CStringstr;
              str.Format("insert…………");//插入的SQL语句
              m_pConnection->Execute(_bstr_t(str),&RecordsAffected,adCmdText);
       }
       catch(_com_errore)
       {
              AfxMessageBox(e.ErrorMessage());
       }

用m_pRecordset的Addnew 方法:

    m_pRecordset.CreateInstance(__uuidof(Recordset));
    try
    {
       m_pRecordset->Open("select * from tab",
           m_pConnection.GetInterfacePtr(),
           adOpenDynamic,adLockOptimistic,adCmdText);//获得表
       m_pRecordset->AddNew(); //添加操作
       m_pRecordset->PutCollect(字段名,新值); //添加表的元素
       m_pRecordset->Update(); //执行更新,成功插入
    }
    catch(_com_errore)
    {
       AfxMessageBox(e.ErrorMessage());
    }

用m_pCommand执行:

  m_pCommand.CreateInstance("ADODB.Command");
  m_pCommand->ActiveConnection = m_pConnection; //关键的一句,将建立的连接赋值给它
  m_pCommand->CommandText=“”; //SQL语句
  m_pCommand->Execute(NULL,NULL,adCmdText);


3 删除,也是有三种相应的方法

用m_pConnection的Open方法

和添加的m_pConnection方法一样,只需要修改SQL语句

m_pRecordset方法:

    m_pRecordset.CreateInstance(__uuidof(Recordset));
    try
    {
       m_pRecordset->Open("select * from tab where ……",
           m_pConnection.GetInterfacePtr(),
           adOpenDynamic,adLockOptimistic,adCmdText);//获得要删除的内容
       if(!m_pRecordset->adoEOF)
       {
           m_pRecordset->MoveFirst();//用来定位
           m_pRecordset->Delete(adAffectCurrent);//根据位置删除
           //注:这里根据自己的需要进行操作,如果有多个结果,则要循环获得下标进行删除
       }
      
    }
    catch(_com_errore)
    {
       AfxMessageBox(e.ErrorMessage());
    }


m_pCommand方法:只需要修改SQL语句即可

4 修改

m_pConnection方法:和添加的m_pConnection方法一样,只需要修改SQL语句

m_pRecordset方法:

    m_pRecordset.CreateInstance(__uuidof(Recordset));
    try
    {
       m_pRecordset->Open("select * from tab ……",
           m_pConnection.GetInterfacePtr(),
           adOpenDynamic,adLockOptimistic,adCmdText);//获得想要修改的内容
       if(!m_pRecordset->adoEOF)
       {
           m_pRecordset->MoveFirst();//定位,位置自己确定
           m_pRecordset->PutCollect(字段名,新值);
           m_pRecordset->Update();
       }
    }
    catch(_com_errore)
    {
       AfxMessageBox(e.ErrorMessage());
    }


m_pCommand方法:只需要修改SQL语句即可

 注:在此总结,方便自己加深理解,真正掌握,以免以后碰到同样的问题依旧从头开始,浪费时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值