1. 程式人生 > >MFC連線Access資料庫

MFC連線Access資料庫

方法1: 1.首先,要用#import語句來引用支援ADO的元件型別庫(*.tlb),其中型別庫可以作為可執行程式(DLL、EXE等)的一部分被定位在其自身程式中的附屬資源裡,如:被定位在msado15.dll的附屬資源中,只需要直接用 #import引用它既可。可以直接在Stdafx.h檔案中加入下面語句來實現:
#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF", "adoEOF") 【注意,在MFC中路徑要用"/"或者"//"】
其中路徑名可以根據自己系統安裝的ADO支援檔案的路徑來自行設定。當編譯器遇到#import語句時,它會為引用元件型別庫中的介面生成包裝類,#import語句實際上相當於執行了API涵數LoadTypeLib()。#import語句會在工程可執行程式輸出目錄中產生兩個檔案,分別為*.tlh(型別庫標頭檔案)及*.tli(型別庫實現檔案),它們分別為每一個介面產生智慧指標,併為各種介面方法、列舉型別,CLSID等進行宣告,建立一系列包裝方法。語句no_namespace說明ADO物件不使用名稱空間,rename ("EOF", "adoEOF")說明將ADO中結束標誌EOF改為adoEOF,以避免和其它庫中命名相沖突。
    2.其次,在程式初始過程中需要初始化元件,一般可以用CoInitialize(NULL);來實現,這種方法在結束時要關閉初始化的COM,可以用下面語句CoUnInitialize();來實現。在MFC中還可以採用另一種方法來實現初始化COM,這種方法只需要一條語句便可以自動為我們實現初始化COM和結束時關閉COM的操作,語句如下所示: AfxOleInit();

    3.接著,就可以直接使用ADO的操作了。我們經常使用的只是前面用#import語句引用型別庫時,生成的包裝類.tlh中宣告的智慧指標中的三個,它們分別是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分別對它們的使用方法進行介紹:
_ConnectionPtr介面返回一個記錄集或一個空指標。通常使用它來建立一個數據連線或執行一條不返回任何結果的SQL語句,如一個儲存過程。使用 _ConnectionPtr介面返回一個記錄集不是一個好的使用方法。對於要返回記錄的操作通常用_RecordserPtr來實現。而用 _ConnectionPtr操作時要想得到記錄條數得遍歷所有記錄,而用_RecordserPtr時不需要。
    _CommandPtr

介面返回一個記錄集。它提供了一種簡單的方法來執行返回記錄集的儲存過程和SQL語句。在使用_CommandPtr介面時,你可以利用全域性 _ConnectionPtr介面,也可以在_CommandPtr接口裡直接使用連線串。如果你只執行一次或幾次資料訪問操作,後者是比較好的選擇。但如果你要頻繁訪問資料庫,並要返回很多記錄集,那麼,你應該使用全域性_ConnectionPtr介面建立一個數據連線,然後使用_CommandPtr 介面執行儲存過程和SQL語句。
    _RecordsetPtr是一個記錄集物件。與以上兩種物件相比,它對記錄集提供了更多的控制功能,如記錄鎖定,遊標控制等。同_CommandPtr介面一樣,它不一定要使用一個已經建立的資料連線,可以用一個連線串代替連線指標賦給 _RecordsetPtr的connection成員變數,讓它自己建立資料連線。如果你要使用多個記錄集,最好的方法是同Command物件一樣使用已經建立了資料連線的全域性_ConnectionPtr介面,然後使用_RecordsetPtr執行儲存過程和SQL語句。

1.建立一個MFC對話方塊工程
2.在stdafx.h匯入

#import "C://Program Files//Common Files//System//ado//msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
3.新建一個Generic Class,取名AdoAccess。

在public:下新增成員函式     

 _ConnectionPtr   m_pConnection; // 資料庫 
      _RecordsetPtr    m_pRecordset; // 命令 
      _CommandPtr      m_pCommand; // 記錄
      void OnInitADOConn();
      void ExitConnect();

然後寫OnInitADOConn()和ExitConnect()函式:

void AdoAccess::OnInitADOConn()
{
::CoInitialize(NULL);
try
{
        m_pConnection.CreateInstance("ADODB.Connection");

或者 m_pConnection.CreateInstance(__uuidof(Connection));
   _bstr_t strConnect="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Home.mdb";//Home.mdb放在工程目錄下   m_pConnection->Open(strConnect,"","",adModeUnknown);

    AfxMessageBox("連線成功");
}
catch(_com_error e)
{
   AfxMessageBox("連線失敗");
}
}
//這裡是連線master資料庫,無密碼。
void AdoAccess::ExitConnect()
{
     if(m_pRecordset!=NULL)
    m_pRecordset->Close();
   m_pConnection->Close();
   ::CoUninitialize();
}
4.可以開始用了:
首先,把我們類的標頭檔案包含在主程式#include "AdoAccess.h"
申明一個全域性變數:AdoAccess myAccess;//物件宣告
連線的程式碼可以做一個按鈕eg:

void CTestDBDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
myAccess.OnInitADOConn();//連線到資料庫
}

或者在插入在OnInitDialog()函式裡就行了。

查詢資料:

m_pRecordset.CreateInstance("ADODB.Recordset");
   m_pRecordset->Open("SELECT * FROM Type",m_pConnection.GetInterfacePtr(),
    adOpenDynamic,
    adLockOptimistic,
    adCmdText);
   while(!m_pRecordset->adoEOF)
   {
    _variant_t var;
    CString strValue ;
   var = m_pRecordset->GetCollect("Type");
    if(var.vt != VT_NULL)
    strValue = (LPCSTR)_bstr_t(var);
   
    AfxMessageBox(strValue);
    m_pRecordset->MoveNext();
   }

方法2:

首先在VC++中建立一個基於對話方塊的工程(在這裡取名為sjtest)

1、 在StdAfx.h標頭檔案中匯入msado15.dll檔案。(程式碼如下)

#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace /
rename("EOF","adoEOF")rename("BOF","adoBOF")
2、 在主視窗類宣告兩個變數。(在CsjtestDlg.h中)
程式碼:
<span style="white-space:pre">	</span>_ConnectionPtr m_pConnection;
       _RecordsetPtr m_pRecordset;

3、 在對話方塊中新增一個ListControl控制元件,並且將其屬性中的Style設定如圖

將View設定成Report,Single selection,auto arrange no label wrap勾上!

4、 在CLASS WIZARD裡面新增一個和LISTCONTROL想關聯的變數m_Grid。

5、在CSjtestApp應用程式類中的初始化函式InitInstance()中初始化COM環境

在上面新增:      

 ::CoInitialize(NULL);

並在return之前釋放:新增程式碼如下:    

::CoUninitialize();

5、 建立ADO連線資料庫函式

在主視窗類(CSjktestDlg)庫中新增函式OnInitADOConn()如圖:

並在該函式新增如下程式碼:

try
       {
              //建立連線物件例項
              m_pConnection.CreateInstance("ADODB.Connection");
              //設定連線字串
              CString strConnect="DRIVER={Microsoft Access Driver (*.mdb)};/
                     uid=;pwd=;DBQ=shujuku.mdb;";
              //使用Open方法連線資料庫
              m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);
       }
       catch(_com_error e)
       {
              AfxMessageBox("連線資料失敗,請檢查資料庫路徑是否正確!");
       }

當然

CString strConnect="DRIVER={Microsoft Access Driver (*.mdb)};    uid=;pwd=;DBQ=shujuku.mdb;";

也可以使用如下字串連線
       CString strConnect="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=shujuku.mdb;Persist Security Info=False";

代替

6、按照第五步那樣建立關閉記錄集和連線函式ExitConnect()並新增程式碼:

//關閉記錄集和連線
    if(m_pRecordset!=NULL)
              m_pRecordset->Close();
       m_pConnection->Close();

7、 接著在初始化對話方塊中呼叫OnInitADOConn函式,已經獲取資料庫表中資料並顯示在列表控制元件中。程式碼如下:
m_Grid.SetExtendedStyle(LVS_EX_FLATSB
              |LVS_EX_FULLROWSELECT
              |LVS_EX_HEADERDRAGDROP
              |LVS_EX_ONECLICKACTIVATE
              |LVS_EX_GRIDLINES);
       m_Grid.InsertColumn(0,"員工編號",LVCFMT_LEFT,80,0);
       m_Grid.InsertColumn(1,"員工姓名",LVCFMT_LEFT,80,1);
       m_Grid.InsertColumn(2,"所屬部門",LVCFMT_LEFT,80,2);
       m_Grid.InsertColumn(3,"基本工資",LVCFMT_LEFT,80,3);
       //連線資料庫
       OnInitADOConn();
       //設定查詢字串
       _bstr_t bstrSQL = "select * from employees order by 員工編號 desc";
       //建立記錄集指標物件例項
       m_pRecordset.CreateInstance(__uuidof(Recordset));//該句也可以使用
//     m_pRecordset.CreateInstance(“ADODB.Recordset”);代替
       //開啟記錄集
       m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,
              adLockOptimistic,adCmdText);
       while(!m_pRecordset->adoEOF)
       {
              m_Grid.InsertItem(0,"");
              m_Grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("員工編號"));
              m_Grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("員工姓名"));
              m_Grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("所屬部門"));
              m_Grid.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("基本工資"));
              //將記錄集指標移動到下一條記錄
              m_pRecordset->MoveNext();
       }
       //斷開資料庫連線
       ExitConnect();