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語句即可

 注:在此總結,方便自己加深理解,真正掌握,以免以後碰到同樣的問題依舊從頭開始,浪費時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章