MFC下使用ADO連接數(shù)據(jù)庫(kù)_第1頁(yè)
MFC下使用ADO連接數(shù)據(jù)庫(kù)_第2頁(yè)
MFC下使用ADO連接數(shù)據(jù)庫(kù)_第3頁(yè)
MFC下使用ADO連接數(shù)據(jù)庫(kù)_第4頁(yè)
MFC下使用ADO連接數(shù)據(jù)庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、MFC下使用ADO讀寫Access數(shù)據(jù)庫(kù)實(shí)例 TOC o 1-3 h z u HYPERLINK l _Toc293783795 一、原型系統(tǒng)描述 PAGEREF _Toc293783795 h 2 HYPERLINK l _Toc293783796 二、數(shù)據(jù)庫(kù)表設(shè)計(jì) PAGEREF _Toc293783796 h 2 HYPERLINK l _Toc293783797 三、數(shù)據(jù)庫(kù)編程 PAGEREF _Toc293783797 h 2 HYPERLINK l _Toc293783798 1.新建MFC基于對(duì)話框項(xiàng)目 PAGEREF _Toc293783798 h 2 HYPERLINK l

2、_Toc293783799 2.用#import指令引入ADO類型庫(kù) PAGEREF _Toc293783799 h 2 HYPERLINK l _Toc293783800 3.創(chuàng)建數(shù)據(jù)庫(kù)操作類CADODatabase PAGEREF _Toc293783800 h 3 HYPERLINK l _Toc293783801 3.1為CADODatabase添加兩個(gè)成員變量 PAGEREF _Toc293783801 h 3 HYPERLINK l _Toc293783802 3.2添加OpenDatabase函數(shù) PAGEREF _Toc293783802 h 3 HYPERLINK l _To

3、c293783803 3.3添加CloseDatabase函數(shù) PAGEREF _Toc293783803 h 4 HYPERLINK l _Toc293783804 3.4添加Select函數(shù) PAGEREF _Toc293783804 h 5 HYPERLINK l _Toc293783805 3.5添加Execute函數(shù) PAGEREF _Toc293783805 h 6 HYPERLINK l _Toc293783806 四、MFC界面編程 PAGEREF _Toc293783806 h 6 HYPERLINK l _Toc293783807 1.在對(duì)話框中添加控件 PAGEREF _

4、Toc293783807 h 6 HYPERLINK l _Toc293783808 2.在程序啟動(dòng)時(shí)初始化列表框,并連接數(shù)據(jù)庫(kù) PAGEREF _Toc293783808 h 7 HYPERLINK l _Toc293783809 2.1初始化列表框 PAGEREF _Toc293783809 h 7 HYPERLINK l _Toc293783810 2.2連接數(shù)據(jù)庫(kù) PAGEREF _Toc293783810 h 7 HYPERLINK l _Toc293783811 3.添加查詢功能 PAGEREF _Toc293783811 h 8 HYPERLINK l _Toc293783812

5、 4.添加新增記錄功能 PAGEREF _Toc293783812 h 9 HYPERLINK l _Toc293783813 五、使用Datagrid ActiveX控件 PAGEREF _Toc293783813 h 10 HYPERLINK l _Toc293783814 1.添加Datagrid控件 PAGEREF _Toc293783814 h 10 HYPERLINK l _Toc293783815 2.創(chuàng)建數(shù)據(jù)庫(kù) PAGEREF _Toc293783815 h 11 HYPERLINK l _Toc293783816 3.創(chuàng)建數(shù)據(jù)庫(kù)操作類CADODatabase PAGEREF

6、_Toc293783816 h 12 HYPERLINK l _Toc293783817 4.使用Datagrid PAGEREF _Toc293783817 h 12 HYPERLINK l _Toc293783818 4.1 綁定數(shù)據(jù)源 PAGEREF _Toc293783818 h 12 HYPERLINK l _Toc293783819 4.2 添加記錄 PAGEREF _Toc293783819 h 13說(shuō)明:本文以“學(xué)生信息管理”系統(tǒng)雛形為例子,介紹在MFC下如何使用ADO連接數(shù)據(jù)庫(kù)編程,并給出示例代碼。下面內(nèi)容第一至四節(jié)介紹如何采用ADO連接數(shù)據(jù)庫(kù)、關(guān)閉數(shù)據(jù)、執(zhí)行sql語(yǔ)句及如何

7、用另一種方式執(zhí)行常用的select語(yǔ)句。第五節(jié)介紹如何使用Datagrid控件:建立_RecordsetPtr對(duì)象與Datagrid控件之間的綁定,通過(guò)改變_RecordsetPtr對(duì)象的內(nèi)容更新數(shù)據(jù)庫(kù)表的記錄。第一至四節(jié)的內(nèi)容請(qǐng)參考代碼“CtrlListDatabase.rar”,第五節(jié)內(nèi)容請(qǐng)參考“Datagrid.rar”請(qǐng)同學(xué)們結(jié)合ADO.NET課程內(nèi)容自主學(xué)習(xí),將所學(xué)到的技術(shù)應(yīng)用到項(xiàng)目實(shí)訓(xùn)中。原型系統(tǒng)描述本程序?yàn)橐粋€(gè)學(xué)生信息管理系統(tǒng)雛形。程序界面如下圖左圖所示。用戶在姓名欄輸入查詢字段,列表框中列出查詢結(jié)果。如下圖右圖所示。用戶點(diǎn)擊新增記錄按鈕新增學(xué)生信息記錄。數(shù)據(jù)庫(kù)表設(shè)計(jì)建立Acce

8、ss文件test.mdb,創(chuàng)建student表,表中字段名稱、數(shù)據(jù)類型及各字段的說(shuō)明設(shè)置如下數(shù)據(jù)庫(kù)編程新建MFC基于對(duì)話框項(xiàng)目新建MFC基于對(duì)話框項(xiàng)目。本例中對(duì)項(xiàng)目命名為CtrlListDatabase。用#import指令引入ADO類型庫(kù)為了引入ADO類型庫(kù),需要在項(xiàng)目的stdafx.h文件中加入如下語(yǔ)句:#import C:Program FilesCommon FilesSystemadomsado15.dll no_namespace rename(EOF, adoEOF)注意添加的位置在#endif /_AFX_NO_AFXCMN_SUPPORT之后創(chuàng)建數(shù)據(jù)庫(kù)操作類CADODatab

9、ase為CADODatabase添加兩個(gè)成員變量_ConnectionPtr m_pConnection;_RecordsetPtr m_pRecordset;其中m_pConnection是一個(gè)指向Connection對(duì)象的指針,通過(guò)它來(lái)連接數(shù)據(jù)庫(kù)。m_pRecordset是一個(gè)指向記錄集合的指針,從數(shù)據(jù)庫(kù)查詢得到的結(jié)果放在m_pRecordset中。添加OpenDatabase函數(shù)功能:連接數(shù)據(jù)庫(kù)輸入:數(shù)據(jù)庫(kù)連接串strConnection(其含義見(jiàn)第四部分第二步中2.2的解釋)輸出:TRUE,如果成功連接數(shù)據(jù)庫(kù),F(xiàn)ALSE,如果連接數(shù)據(jù)庫(kù)失敗BOOL CADODatabase:OpenD

10、atabase(CString strConection)HRESULT hr = :CoInitialize(NULL); / 初始化COMif (!SUCCEEDED(hr) / 初始化失敗return FALSE;_bstr_t strConnect(strConection);try/ 創(chuàng)建Connection對(duì)象hr = m_pConnection.CreateInstance(ADODB.Connection);if (SUCCEEDED(hr)/ 連接數(shù)據(jù)庫(kù)if (SUCCEEDED(m_pConnection-Open(strConnect, , , adModeUnknown

11、)return TRUE;catch (_com_error e)TRACE(_T(連接數(shù)據(jù)庫(kù)發(fā)生錯(cuò)誤%sn), e.ErrorMessage();return FALSE;上述代碼中,通過(guò)Connection對(duì)象的Open方法來(lái)進(jìn)行連接數(shù)據(jù)庫(kù)的,下面是該方法的原型:HRESULT Connection15:Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options );上述函數(shù)中參數(shù)ConnectionString為連接字串;參數(shù)UserID是用戶名;參數(shù)Password是登陸密碼;在本例子中

12、,數(shù)據(jù)庫(kù)的用戶名和密碼均沒(méi)創(chuàng)建,所以去空值”。參數(shù)Options是連接選項(xiàng),用于指定Connection對(duì)象對(duì)數(shù)據(jù)的更新許可權(quán),一般情況下Options可以是如下幾個(gè)常量:adModeUnknown缺省。當(dāng)前的許可權(quán)未設(shè)置adModeRead只讀adModeWrite只寫adModeReadWrite可以讀寫adModeShareDenyRead阻止其它Connection對(duì)象以讀權(quán)限打開連接adModeShareDenyWrite阻止其它Connection對(duì)象以寫權(quán)限打開連接adModeShareExclusive阻止其它Connection對(duì)象以讀寫權(quán)限打開連接adModeShareDe

13、nyNone阻止其它Connection對(duì)象以任何權(quán)限打開連接添加CloseDatabase函數(shù)功能:關(guān)閉數(shù)據(jù)庫(kù)連接返回:TRUE,如果成功關(guān)閉,否則FALSE。BOOL CADODatabase:CloseDatabase()if (m_pConnection = NULL)/ 如果連接已經(jīng)為空return TRUE;trym_pConnection-Close();m_pConnection = NULL;return TRUE;catch (_com_error e)TRACE(_T(關(guān)閉數(shù)據(jù)庫(kù)發(fā)生錯(cuò)誤:%sn), e.ErrorMessage();return FALSE;添加Sele

14、ct函數(shù)功能:返回查詢結(jié)果輸入:查詢語(yǔ)句字符串sql輸出:查詢結(jié)果集合方法一:直接用Recordset對(duì)象進(jìn)行查詢?nèi)〉糜涗浖痏RecordsetPtr CADODatabase:Select(CString sql)_bstr_t CommandText(sql); / 生成要執(zhí)行的sql語(yǔ)句字符串m_pRecordset.CreateInstance(ADODB.Recordset); / 生成_RecordsetPtr實(shí)例m_pRecordset-Open(CommandText, / 連接數(shù)據(jù)庫(kù)查詢m_pConnection.GetInterfacePtr(),adOpenDynamic

15、,adLockBatchOptimistic,adCmdText);return m_pRecordset;其中Open方法原型如下:HRESULT Recordset15:Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options )上述函數(shù)中參數(shù)Source是數(shù)據(jù)查詢字符串;參數(shù)ActiveConnection是已經(jīng)建立好的連接(我們需要用Connection對(duì)象指

16、針來(lái)構(gòu)造一個(gè)_variant_t對(duì)象);參數(shù)CursorType光標(biāo)類型,它可以是以下值之一;請(qǐng)看這個(gè)枚舉結(jié)構(gòu):enum CursorTypeEnumadOpenUnspecified = -1,/不作特別指定adOpenForwardOnly = 0,/前滾靜態(tài)光標(biāo)。這種光標(biāo)只能向前瀏覽記錄集,比如用MoveNext向前滾動(dòng),這種方式可以提高瀏覽速度。但諸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用adOpenKeyset = 1,/采用這種光標(biāo)的記錄集看不到其它用戶的新增、刪除操作,但對(duì)于更新原有記錄的操作對(duì)你是可見(jiàn)的。a

17、dOpenDynamic = 2,/動(dòng)態(tài)光標(biāo)。所有數(shù)據(jù)庫(kù)的操作都會(huì)立即在各用戶記錄集上反應(yīng)出來(lái)。adOpenStatic = 3/靜態(tài)光標(biāo)。它為你的記錄集產(chǎn)生一個(gè)靜態(tài)備份,但其它用戶的新增、刪除、更新操作對(duì)你的記錄集來(lái)說(shuō)是不可見(jiàn)的。;參數(shù)LockType表示數(shù)據(jù)庫(kù)的鎖定類型,它可以是以下值之一,請(qǐng)看如下枚舉結(jié)構(gòu):enum LockTypeEnumadLockUnspecified = -1,/未指定adLockReadOnly = 1,/只讀記錄集adLockPessimistic = 2,悲觀鎖定方式。數(shù)據(jù)在更新時(shí)鎖定其它所有動(dòng)作,這是最安全的鎖定機(jī)制adLockOptimistic = 3

18、,樂(lè)觀鎖定方式。只有在你調(diào)用Update方法時(shí)才鎖定記錄。在此之前仍然可以做數(shù)據(jù)的更新、插入、刪除等動(dòng)作adLockBatchOptimistic = 4,樂(lè)觀分批更新。編輯時(shí)記錄不會(huì)鎖定,更改、插入及刪除是在批處理模式下完成。;方法二:利用Command對(duì)象來(lái)執(zhí)行SQL命令_RecordsetPtr CADODatabase:Select(CString sql)_CommandPtr m_pCommand;m_pCommand.CreateInstance(ADODB.Command);_variant_t vNULL;vNULL.vt = VT_ERROR;vNULL.scode = D

19、ISP_E_PARAMNOTFOUND; /定義為無(wú)參數(shù)m_pCommand-ActiveConnection = m_pConnection; /非常關(guān)鍵的一句,將建立的連接賦值給它m_pCommand-CommandText = SELECT * FROM users; /命令字串m_pRecordset = m_pCommand-Execute(&vNULL,&vNULL,adCmdText);return m_pRecordset;添加Execute函數(shù)功能:執(zhí)行sql語(yǔ)句(例如Insert、Update操作等)輸入:sql語(yǔ)句字符串返回值:TRUE,如果成功執(zhí)行。BOOL CADOD

20、atabase:Execute(CString sql)_bstr_t CommandText(sql);_variant_t RecordsAffected;m_pConnection-Execute(CommandText, &RecordsAffected, adCmdText);return TRUE;MFC界面編程在對(duì)話框中添加控件控件ID關(guān)聯(lián)變量類型關(guān)聯(lián)變量說(shuō)明編輯框IDC_EDIT_NAMECStringm_strQueryName查詢姓名編輯框列表控件IDC_LIST_STUDENT_INFOCListCtrlm_listCtrl查詢記錄列表狂將列表框控件的View屬性(在St

21、yle選項(xiàng)卡下)設(shè)置為Report在程序啟動(dòng)時(shí)初始化列表框,并連接數(shù)據(jù)庫(kù)在CCtrlListDatabaseDlg:OnInitDialog()函數(shù)中添加兩部分代碼:初始化列表框m_ListCtrl.SetExtendedStyle(LVS_EX_HEADERDRAGDROP| LVS_EX_FULLROWSELECT| LVS_EX_TRACKSELECT); / 設(shè)置列表框的樣式CString header4 = 姓名, 性別, 出生日期, 已修學(xué)分 ; / 增加列表頭部for (int i = 0; i adoEOF)/ 遍歷查詢結(jié)果集合,將每條結(jié)果在列表框中顯示/ pRecordset

22、-GetCollect(name)取出當(dāng)前記錄的Name字段的值。因?yàn)镹ame字段的值是字符串類型,所以取bstrVal屬性獲得字段值。CString temp = pRecordset-GetCollect(name).bstrVal; / 往列表框新增一條記錄m_ListCtrl.InsertItem(row, temp);/ pRecordset-GetCollect(gender)取出當(dāng)前記錄的gender字段的值。因?yàn)間ender字段的值整數(shù)類型,所以取lVal屬性獲得字段值。gender = pRecordset-GetCollect(gender).lVal;if (gender

23、 = 0)m_ListCtrl.SetItemText(row, 1, 男);elsem_ListCtrl.SetItemText(row, 1, 女);/ pRecordset-GetCollect(birthday)取出當(dāng)前記錄的birthday字段的值。因?yàn)閎irthday字段的值為時(shí)間類型,所以取date屬性獲得字段值。time = pRecordset-GetCollect(birthday).date;temp = time.Format(%Y-%m-%d);m_ListCtrl.SetItemText(row, 2, temp);/ pRecordset-GetCollect(c

24、redit)取出當(dāng)前記錄的credit字段的值。因?yàn)閏redit字段的值為整數(shù)類型,所以取lval屬性獲得字段值。credit = pRecordset-GetCollect(credit).lVal;temp.Format(%d, credit);m_ListCtrl.SetItemText(row, 3, temp);row+;pRecordset-MoveNext();添加新增記錄功能新增編輯框,控件擺放如下圖所示。為該編輯框新建一個(gè)關(guān)聯(lián)的類CEditInfoDlg控件ID關(guān)聯(lián)變量類型關(guān)聯(lián)變量說(shuō)明編輯框IDC_EDIT_NAMECStringm_name編輯姓名選擇按鈕IDC_RADIO

25、_MALEIDC_RADIO_FEMALEIntm_gender選擇性別日期控件IDC_DATETIMEPICKER_BIRTHDAYCTimem_birthday選擇出生年月日編輯框IDC_EDIT_CREDITIntm_credit編輯學(xué)分在CCtrlListDatabaseDlg中增加“新增按鈕”響應(yīng)函數(shù)void CCtrlListDatabaseDlg:OnButtonAdd() / TODO: Add your control notification handler code hereCEditInfoDlg dlg;if (IDOK = dlg.DoModal()/ 根據(jù)用戶在編

26、輯框輸入的信息生成sql語(yǔ)句CString sql = insert into student (name, gender, birthday, credit) values (;sql += + dlg.m_name + ;CString gender;gender.Format(%d, dlg.m_gender);sql += , + gender;CString time = dlg.m_birthday.Format(%Y-%m-%d);sql += , + time + ;CString strCredit;strCredit.Format(%d, dlg.m_credit);sql

27、 += , + strCredit + );m_database.Execute(sql);使用Datagrid ActiveX控件本節(jié)演示如何使用Datagrid控件顯示數(shù)據(jù)。新建項(xiàng)目基于對(duì)話框MFC項(xiàng)目,命名為Datagrid。界面控件設(shè)置同上,區(qū)別是采用Datagrid控件代替List Control控件。添加Datagrid控件Datagrid控件的添加:菜單欄-項(xiàng)目(Project) -添加至項(xiàng)目(Add to Project)-組件和控件(Components and Controls)選擇Registered ActiveX Controls,Microsoft DataGrid

28、 Control點(diǎn)擊插入(Insert),確定。此時(shí)彈出一個(gè)確認(rèn)框不作修改,點(diǎn)擊確定。然后點(diǎn)擊關(guān)閉(Close)關(guān)閉文件對(duì)話框。此時(shí)控件列表中會(huì)多了一個(gè)紅色的控件Datagrid控件。將Datagrid控件拉到對(duì)話框界面??丶蘒D設(shè)為ID_DATAGRID_RESULT,Caption設(shè)為“查詢結(jié)果”,關(guān)聯(lián)變量類型為CDatagrid,變量名為m_datagrid。其余控件設(shè)置同上。如圖所示。創(chuàng)建數(shù)據(jù)庫(kù)新建數(shù)據(jù)庫(kù)test.mdb,創(chuàng)建student表。創(chuàng)建數(shù)據(jù)庫(kù)操作類CADODatabase具體操作同上。在窗口創(chuàng)建時(shí),建立數(shù)據(jù)庫(kù)連接。即在CDatagridDlg:OnInitDialog()函

29、數(shù)中添加代碼:CString strConnection = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=;strConnection += test.mdb;m_database.OpenDatabase(strConnection);使用Datagrid4.1 綁定數(shù)據(jù)源給查詢按鈕添加相應(yīng)函數(shù)OnBUTTONQuery。void CDatagridDlg:OnBUTTONQuery() / TODO: Add your control notification handler code hereUpdateData();/ 根據(jù)查詢條件生成sq

30、l語(yǔ)句CString sql = select * from student where name like %;sql += m_QueryName;sql += %;/ 獲得查詢結(jié)果_RecordsetPtr pRecordset = m_database.Select(sql);m_QueryResult.SetRefDataSource(NULL);/ 綁定數(shù)據(jù)源m_QueryResult.SetRefDataSource(LPUNKNOWN)pRecordset);m_QueryResult.SetColumnHeaders(TRUE);_variant_t vIndex;CColumn col = NULL;/ 設(shè)置顯示數(shù)據(jù)列vIndex = long(0);col = m_QueryResult.GetColumns().GetItem(vIndex);col.SetWidth(50); / 設(shè)置列寬度col.SetCaption(id);col.SetVisible(FALSE); / 隱藏主鍵列不顯示vIndex = long(1);col = m_QueryRe

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論