MFC連線Access資料庫
#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
_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();