第9章數(shù)據(jù)庫應(yīng)用_第1頁
第9章數(shù)據(jù)庫應(yīng)用_第2頁
第9章數(shù)據(jù)庫應(yīng)用_第3頁
第9章數(shù)據(jù)庫應(yīng)用_第4頁
第9章數(shù)據(jù)庫應(yīng)用_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第9章數(shù)據(jù)庫應(yīng)用

9.1數(shù)據(jù)庫和ODBC操作9.2MFCODBC應(yīng)用編程9.3ADO數(shù)據(jù)庫編程9.4數(shù)據(jù)庫相關(guān)的ActiveX控件9.5綜合應(yīng)用9.1數(shù)據(jù)庫和ODBC操作

9.1.1數(shù)據(jù)庫基本概念

1.數(shù)據(jù)庫和DBMS

數(shù)據(jù)庫是指以一定的組織形式存放在計算機(jī)存儲介質(zhì)上的相互關(guān)聯(lián)的數(shù)據(jù)的集合。例如,把一個學(xué)校的教師、學(xué)生和課程等數(shù)據(jù)有序地組織起來,存儲在計算機(jī)磁盤上,就構(gòu)成了一個數(shù)據(jù)庫。為了能有效地管理數(shù)據(jù)庫,常常需要數(shù)據(jù)庫管理系統(tǒng)(DBMS)為用戶提供對數(shù)據(jù)庫的操作,包括數(shù)據(jù)庫的建立和記錄的輸入、修改、檢索、顯示、刪除和統(tǒng)計等。DBMS為用戶提供的對數(shù)據(jù)庫操作的方法包括交互界面和SQL語句接口。VisualC++就是通過SQL語句接口操作數(shù)據(jù)庫。目前,使用最多的是關(guān)系數(shù)據(jù)庫,有許多關(guān)系數(shù)據(jù)庫管理系統(tǒng)(DBMS),如Access、SQLServer、Oracle、Sybase和VisualFoxpro等,

2.SQL語句SQL(結(jié)構(gòu)化查詢語言)語句是用來在DBMS中訪問和操作數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,SQL語言主要包括三個方面:9.1數(shù)據(jù)庫和ODBC操作(1)數(shù)據(jù)操縱語言DML(DataManipulationLanguage):主要包括查詢、插入、刪除和修改數(shù)據(jù)庫中的數(shù)據(jù)的操作。(2)數(shù)據(jù)定義語言DDL(DataDefinitionLanguage):定義數(shù)據(jù)庫結(jié)構(gòu),包括定義表、視圖和索引等。(3)數(shù)據(jù)控制語言DCL(DataControlLanguage):包括對數(shù)據(jù)庫的安全性控制、完整性控制以及對事務(wù)的定義、并發(fā)控制和恢復(fù)等。

3.ODBC、DAO和OLEDBVisualC++為用戶提供了ODBC(OpenDatabaseConnectivity,開放數(shù)據(jù)庫連接)、DAO(DataAccessObjects,數(shù)據(jù)訪問對象)及OLEDB(OLEDataBase,OLE數(shù)據(jù)庫)三種數(shù)據(jù)庫方式,使用戶的應(yīng)用程序從特定的數(shù)據(jù)管理系統(tǒng)脫離出來。

ODBC提供了應(yīng)用程序接口(API),使得任何一個數(shù)據(jù)庫都可以通過ODBC驅(qū)動器與指定的DBMS相聯(lián)。用戶的程序可通過調(diào)用ODBC驅(qū)動管理器中相應(yīng)的驅(qū)動程序達(dá)到管理數(shù)據(jù)庫的目的。作為MicrosoftWindowsOpenStandardsArchitecture(WOSA,Windows開放式服務(wù)體系結(jié)構(gòu))的主要組成部分,ODBC一直沿用至今。9.1數(shù)據(jù)庫和ODBC操作

DAO類似于用MicrosoftAccess或MicrosoftVisualBasic編寫的數(shù)據(jù)庫應(yīng)用程序,它使用Jet數(shù)據(jù)庫引擎形成一系列的數(shù)據(jù)訪問對象:數(shù)據(jù)庫對象、表和查詢對象、記錄集對象等。它可以打開一個Access數(shù)據(jù)庫文件(MDB文件),也可直接打開一個ODBC數(shù)據(jù)源以及使用Jet引擎打開一個ISAM(被索引的順序訪問方法)類型的數(shù)據(jù)源(dBASE、FoxPro、Paradox、Excel或文本文件)。

OLEDB試圖提供一種統(tǒng)一的數(shù)據(jù)訪問接口,并能處理除了標(biāo)準(zhǔn)關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)之外,還能處理包括郵件數(shù)據(jù)、Web上的文本或圖形、目錄服務(wù)(DirectoryServices)以及主機(jī)系統(tǒng)中的IMS和VSAM數(shù)據(jù)。OLEDB提供一個數(shù)據(jù)庫編程COM(組件對象模型)接口,使得數(shù)據(jù)的使用者(應(yīng)用程序)可以使用同樣的方法訪問各種數(shù)據(jù),而不用考慮數(shù)據(jù)的具體存儲地點(diǎn)、格式或類型。這個COM接口與ODBC相比,其健壯性和靈活性要高得多。但是,由于OLEDB的程序比較復(fù)雜,因而對于一般用戶來說使用ODBC和DAO方式已能滿足一般數(shù)據(jù)庫處理的需要。

4.ADOADO是目前在Windows環(huán)境中比較流行的客戶端數(shù)據(jù)庫編程技術(shù)。它是Microsoft為最新和最強(qiáng)大的數(shù)據(jù)訪問范例OLEDB而設(shè)計的,是一個便于使用的應(yīng)用程序?qū)咏涌?。ADO使用戶應(yīng)用程序能夠通過“OLEDB提供者”訪問和操作數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)。由于它兼具有強(qiáng)大的數(shù)據(jù)處理功能(處理各種不同類型的數(shù)據(jù)源、分布式的數(shù)據(jù)處理等等)和極其簡單、易用的編程接口,因而得到了廣泛的應(yīng)用。9.1數(shù)據(jù)庫和ODBC操作

ADO技術(shù)基于COM(ComponentObjectModel,組件對象模型),具有COM組件的許多優(yōu)點(diǎn),可以用來構(gòu)造可復(fù)用應(yīng)用框架,被多種語言支持,能夠訪問包括關(guān)系數(shù)據(jù)庫、非關(guān)系數(shù)據(jù)庫及所有的文件系統(tǒng)。另外,ADO還支持各種B/S與基于Web的應(yīng)用程序,具有遠(yuǎn)程數(shù)據(jù)服務(wù)RDS(RemoteDataService)的特性,是遠(yuǎn)程數(shù)據(jù)存取的發(fā)展方向。表9.1學(xué)生課程成績表(score)及其表結(jié)構(gòu)

學(xué)號(studentno)

21010101

21010102

21010501

21010502課程號(course)成績(score)學(xué)分(credit)21121052112348212134421213318085707832.533序號字段名稱數(shù)據(jù)類型字段大小小數(shù)位字段含義

1234studentnocoursescorecredit文本文本數(shù)字?jǐn)?shù)字87單精度單精度11學(xué)號

課程號

成績

學(xué)分

9.1數(shù)據(jù)庫和ODBC操作

9.1.2MFCODBC向?qū)н^程用MFCAppWizard使用ODBC數(shù)據(jù)庫的一般過程是:①用Access或其他數(shù)據(jù)庫工具構(gòu)造一個數(shù)據(jù)庫;②在Windows中為剛才構(gòu)造的數(shù)據(jù)庫定義一個ODBC數(shù)據(jù)源;③在創(chuàng)建數(shù)據(jù)庫處理的文檔應(yīng)用程序向?qū)е羞x擇數(shù)據(jù)源;④設(shè)計界面,并使控件與數(shù)據(jù)表字段關(guān)聯(lián)。

1.構(gòu)造數(shù)據(jù)庫數(shù)據(jù)庫表與表之間的關(guān)系構(gòu)成了一個數(shù)據(jù)庫。作為示例,這里用MicrosoftAccess創(chuàng)建一個數(shù)據(jù)庫Student.mdb,其中暫包含一個數(shù)據(jù)表score,用來描述學(xué)生課程成績,如表9.1所示。在表中包括上、下兩部分,上部分是數(shù)據(jù)表的記錄內(nèi)容,下部分是數(shù)據(jù)表的結(jié)構(gòu)內(nèi)容。需要說明的是,數(shù)據(jù)表結(jié)構(gòu)可以看成是一個具有行和列的二維表格。表格中的一行稱為一個記錄,一列稱為一個字段,每列的標(biāo)題稱為字段名。

2.創(chuàng)建ODBC數(shù)據(jù)源Windows中的ODBC組件是出現(xiàn)在系統(tǒng)的“控制面板”中的“管理工具”中的“數(shù)據(jù)源(ODBC)”,如圖9.1所示。9.1數(shù)據(jù)庫和ODBC操作圖9.1WindowsXP的管理工具9.1數(shù)據(jù)庫和ODBC操作雙擊“數(shù)據(jù)源(ODBC)”,進(jìn)入ODBC數(shù)據(jù)源管理器。在這里,用戶可以設(shè)置ODBC數(shù)據(jù)源的一些信息。其中,“用戶DSN”頁面是用來定義用戶自己在本地計算機(jī)使用的數(shù)據(jù)源名(DSN),如圖9.2所示。圖9.2ODBC數(shù)據(jù)源管理器9.1數(shù)據(jù)庫和ODBC操作那么,創(chuàng)建一個用戶DSN可有如下的過程:(1)單擊[添加]按鈕,彈出有一驅(qū)動程序列表的“創(chuàng)建新數(shù)據(jù)源”對話框,在該對話框中選擇要添加用戶數(shù)據(jù)源的驅(qū)動程序,這里選擇“MicrosoftAccessDriver”,如圖9.3所示。(2)單擊[完成]按鈕,進(jìn)入指定驅(qū)動程序的安裝對話框,單擊[選擇]按鈕將前面創(chuàng)建的數(shù)據(jù)庫調(diào)入,然后在數(shù)據(jù)源名輸入“DatabaseExampleForVC++”,結(jié)果如圖9.4所示。(3)單擊[確定]按鈕,剛才創(chuàng)建的用戶數(shù)據(jù)源被添加在“ODBC數(shù)據(jù)源管理器”的“用戶數(shù)據(jù)源”列表中。圖9.3“創(chuàng)建新數(shù)據(jù)源”對話框圖9.4ODBCAccess安裝對話框9.1數(shù)據(jù)庫和ODBC操作3.在MFCAppWizard中選擇數(shù)據(jù)源用MFCAppWizard可以容易地創(chuàng)建一個支持?jǐn)?shù)據(jù)庫的文檔應(yīng)用程序,如下面的過程。(1)用MFCAppWizard創(chuàng)建一個單文檔應(yīng)用程序Ex_ODBC。(2)在向?qū)У牡?步對話框中加入數(shù)據(jù)庫的支持,如圖9.5所示。在該對話框中用戶可以選擇對數(shù)據(jù)庫支持程序,其中各選項的含義如表9.2所示。圖9.5向?qū)У牡诙綄υ捒?.1數(shù)據(jù)庫和ODBC操作表9.2MFC支持?jǐn)?shù)據(jù)庫的不同選項選項創(chuàng)建的視圖類創(chuàng)建的文檔類否(None)從CView派生支持文檔的常用操作,并在“文件”菜單中有“新建”、“打開”、“保存”、“另存為”等命令。標(biāo)題文件(Headerfilesonly)從CView派生除了在StdAfx.h文件中添加了“#include<afxdb.h>”語句外,其余與“None”選項相同查看數(shù)據(jù)庫不使用文件支持(Databaseviewwithoutfilesupport)從CRecordView派生不支持文檔的常用操作,也就是說,創(chuàng)建的文檔類不能進(jìn)行序列化,且在“文件”菜單中沒有“新建”等文檔操作命令。但用戶可在用戶視圖在中使用CRecordset類處理數(shù)據(jù)庫查看數(shù)據(jù)庫使用文件支持(Databaseviewwithfilesupport)從CRecordView派生全面支持文檔操作和數(shù)據(jù)庫操作9.1數(shù)據(jù)庫和ODBC操作(3)選中“數(shù)據(jù)庫查看使用文件支持”項,單擊[數(shù)據(jù)源](DataSource)按鈕,彈出“DatabaseOptions”對話框,從中選擇ODBC的數(shù)據(jù)源“DatabaseExampleForVC++”,如圖9.6所示。需要說明的是,Recordsettype(記錄集類型)有動態(tài)集(Dynaset)和快照集(Snapshot)之分。動態(tài)集能與其他應(yīng)用程序所做的更改保持同步,而快照集則是數(shù)據(jù)的一個靜態(tài)視圖。這兩種類型在記錄集被打開時都提供一組記錄,所不同的是:當(dāng)在一個動態(tài)集里滾動一條記錄時,由其他用戶或應(yīng)用程序中的其他記錄集對該記錄所做的更改會相應(yīng)地顯示出來,而快照集則不會。圖9.6“DatabaseOptions”對話框圖9.7“SelectDatabaseTables”對話框9.1數(shù)據(jù)庫和ODBC操作(4)保留其他默認(rèn)選項,單擊[OK]按鈕,彈出如圖9.7所示的“SelectDatabaseTables”對話框,從中選擇要使用的表score。(5)單擊[OK]按鈕,又回到了向?qū)У牡?步對話框。(6)單擊[完成]按鈕。開發(fā)環(huán)境自動打開表單視圖CEx_ODBCView的對話框資源模板IDD_EX_ODBC_FORM以及相應(yīng)的對話框編輯器。(7)編譯并運(yùn)行,結(jié)果如圖9.8所示。記錄瀏覽按鈕圖9.8Ex_ODBC運(yùn)行結(jié)果9.1數(shù)據(jù)庫和ODBC操作需要說明的是,MFCAppWizard創(chuàng)建的Ex_ODBC應(yīng)用程序與一般默認(rèn)的單文檔應(yīng)用程序相比較,在類框架方面,有如下幾點(diǎn)不同:

●添加了一個CEx_ODBCSet類,它與上述過程中所選擇的數(shù)據(jù)表score進(jìn)行數(shù)據(jù)綁定,也就是說,CEx_ODBCSet對象的操作實質(zhì)上對數(shù)據(jù)表進(jìn)行操作。

●將CEx_ODBCView類的基類設(shè)置成CRecordView。由于CRecordView的基類是CFormView,因此它需要與之相關(guān)聯(lián)的表單資源。

●在CEx_ODBCView類中添加了一個全局的CEx_ODBCSet對象指針變量m_pSet,目的是在表單視圖和記錄集之間建立聯(lián)系,使得記錄集中的查詢結(jié)果能夠很容易地在表單視圖上顯示出來。

4.設(shè)計瀏覽記錄界面在上面的Ex_ODBC中,MFC為用戶自動創(chuàng)建了用于瀏覽數(shù)據(jù)表記錄的工具按鈕和相應(yīng)的“記錄”菜單項。若用戶選擇這些瀏覽記錄命令,系統(tǒng)會自動調(diào)用相應(yīng)的函數(shù)來移動數(shù)據(jù)表的當(dāng)前位置。若在表單視圖CEx_ODBCView中添加控件并與表的字段相關(guān)聯(lián),就可以根據(jù)表的當(dāng)前記錄位置顯示相應(yīng)的數(shù)據(jù)。其步驟如下。9.1數(shù)據(jù)庫和ODBC操作(1)按照圖9.9所示的布局,為表單對話框資源模板添加表9.3所示的控件。圖9.9控件的設(shè)計9.1數(shù)據(jù)庫和ODBC操作表9.3表單對話框控件及屬性添加的控件ID號標(biāo)題其他屬性編輯框(學(xué)號)IDC_STUNO——默認(rèn)

編輯框(課程號)IDC_COURSENO——默認(rèn)

編輯框(成績)IDC_SCORE——默認(rèn)

編輯框(學(xué)分)IDC_CREDIT——默認(rèn)

(2)按快捷鍵Ctrl+W,彈出MFCClassWizard對話框,切換到MemberVariables頁面,在Classname框中選擇CEx_ODBCView,為上述控件添加相關(guān)聯(lián)的數(shù)據(jù)成員。與以往添加控件變量不同的是,這里添加的控件變量都是由系統(tǒng)自動定義的,并與數(shù)據(jù)庫表字段相關(guān)聯(lián)的。例如,雙擊IDC_STUNO,在彈出的“AddMemberVariable”對話框中的成員變量下拉列表中選擇要添加的成員變量名m_pSet->m_studentno,選擇后,控件變量的類型將自動設(shè)置,如圖9.10所示。圖9.10為控件添加數(shù)據(jù)成員9.1數(shù)據(jù)庫和ODBC操作(3)按照上一步驟的方法,為表9.4所示的其他控件依次添加相關(guān)聯(lián)的成員變量。需要說明的是,控件變量的范圍和大小應(yīng)與數(shù)據(jù)表中的字段一一對應(yīng)。結(jié)果如圖9.11所示。表9.4控件變量控件ID號變量名范圍和大小IDC_COURSENOm_pSet->m_course-7IDC_SCOREm_pSet->m_score0~100IDC_SREDITm_pSet->m_credit1~20圖9.11添加的控件變量圖9.12Ex_ODBC最后運(yùn)行結(jié)果(4)編譯運(yùn)行并測試,結(jié)果如圖9.12所示。9.1數(shù)據(jù)庫和ODBC操作

9.1.3ODBC數(shù)據(jù)表綁定更新上述MFCODBC應(yīng)用程序框架中,數(shù)據(jù)表score和CEx_ODBCSet類進(jìn)行數(shù)據(jù)綁定。但當(dāng)數(shù)據(jù)表的字段更新后,例如,若用Access將score數(shù)據(jù)表再添加一個“備注”字段名(文本類型,長度為50個字符),并關(guān)閉Access后,就需要為Ex_ODBC重新為數(shù)據(jù)表score和CEx_ODBCSet類進(jìn)行數(shù)據(jù)綁定的更新,其步驟如下:(1)按快捷鍵Ctrl+W,打開MFCClassWizard對話框,切換到“MemberVariables”頁面。(2)在“Classname”的下拉列表中選擇“CEx_ODBCSet”,此時MFCClassWizard對話框的[UpdateColumns]和[BindAll]按鈕被激活,如圖9.13所示。需要說明的是,[UpdateColumns]按鈕用來重新指定與CRecordSet類相關(guān)的表,而[BindAll]按鈕用來指定表的字段的綁定,即為字段重新指定默認(rèn)的關(guān)聯(lián)變量。圖9.13“MFCClassWizard”對話框9.1數(shù)據(jù)庫和ODBC操作(3)單擊[UpdateColumns]按鈕,又彈出前面的“DatabaseOptions”對話框,選擇ODBC數(shù)據(jù)源“DatabaseExampleForVC++”,如圖9.14所示。單擊[OK]按鈕,彈出如圖9.15所示的“SelectDatabaseTables”對話框,從中選擇要使用的表。單擊[OK]按鈕,又回到MFCClassWizard界面,如圖9.16所示。

圖9.14“DatabaseOptions”對話框圖9.15“SelectDatabaseTables”對話框9.1數(shù)據(jù)庫和ODBC操作圖9.16更新后的“MemberVariables”頁面(4)單擊[BindAll]按鈕,MFCWizard將自動為字段落添加相關(guān)聯(lián)的變量。需要說明的是,在按[BindAll]按鈕綁定前最好將已有的字段關(guān)聯(lián)變量刪除,以保證數(shù)據(jù)表字段名更改或刪除后與變量綁定的正確性。9.2MFCODBC應(yīng)用編程

9.2.1查詢記錄使用CRecordSet類的成員變量m_strFilter、m_strSort和成員函數(shù)Open可以對表進(jìn)行記錄的查詢和排序。先來看一個示例,該示例在前面的Ex_ODBC的表單中添加一個編輯框和一個[查詢]按鈕,單擊[查詢]按鈕,將按編輯框中的學(xué)號內(nèi)容對數(shù)據(jù)表進(jìn)行查詢,并將查找到的記錄顯示在前面添加的控件中。具體過程如下:(1)打開Ex_ODBC應(yīng)用程序的表單資源,按圖9.17所示的布局添加控件,其中添加的編輯框ID號設(shè)為IDC_EDIT_QUERY,“查詢”按鈕的ID號設(shè)為IDC_BUTTON_QUERY。圖9.17要添加的控件9.2MFCODBC應(yīng)用編程(2)用MFCClassWizard為控件IDC_EDIT_QUERY添加關(guān)聯(lián)變量m_strQuery。(3)在CEx_ODBCView類中添加按鈕控件IDC_BUTTON_QUERY的BN_CLICKED消息映射,并在映射函數(shù)中添加下列代碼:代碼中,m_strFilter和m_strSort是CRecordSet的成員變量,用來執(zhí)行條件查詢和結(jié)果排序。其中,m_strFilter稱為“過濾字符串”,相當(dāng)于SQL語句中WHERE后的條件串;而m_strSort稱為“排序字符串”,相當(dāng)于SQL語句中ORDERBY后的字符串。若字段的數(shù)據(jù)類型是文本,則需要在m_strFilter字符串中將單引號將查詢的內(nèi)容括起來,對于數(shù)字,則不需要用單引號。需要注意的是:只有在調(diào)用Open函數(shù)之前設(shè)置m_strFilter和m_strSort才能保證查詢和排序有效。如果有多個條件查詢,則可以使用AND、OR、NOT來組合,例如下面的代碼:

m_pSet->m_strFilter="studentno>='21010101'ANDstudentno<='21010105'";

(4)編譯運(yùn)行并測試,結(jié)果如圖9.18所示。9.2MFCODBC應(yīng)用編程圖9.18查詢記錄需要說明的是,如果查詢的結(jié)果有多條記錄,可以用CRecordSet類的MoveNext(下移一個記錄)、MovePrev(上移一個記錄)、MoveFirst(定位到第一個記錄)和MoveLast(定位到最后一個記錄)等成員函數(shù)來移動當(dāng)前記錄位置進(jìn)行操作。9.2MFCODBC應(yīng)用編程

9.2.2編輯記錄

CRecordSet類為用戶提供了許多對表記錄進(jìn)行操作的成員函數(shù)用來添加記錄、刪除記錄和修改記錄等。

1.增加記錄增加記錄是使用AddNew函數(shù),但要求數(shù)據(jù)庫必須是以“可增加”的方式打開的。下面的代碼是在表的末尾增加新記錄:

m_pSet->AddNew(); //在表的末尾增加新記錄

m_pSet->SetFieldNull(&(m_pSet->m_studentno),FALSE);//設(shè)定m_studentno值不為空(NULL)

m_pSet->m_studentno="21010503"; //輸入新的字段值

m_pSet->Update(); //將新記錄存入數(shù)據(jù)庫

m_pSet->Requery(); //刷新記錄集,這在快照集方式下是必須的9.2MFCODBC應(yīng)用編程2.刪除記錄可以直接使用CRecordSet::Delete函數(shù)來刪除記錄。需要說明的是,要使刪除操作有效,還需要移動記錄函數(shù)。例如下面的代碼:

CRecordsetStatusstatus;

m_pSet->GetStatus(status); //獲取當(dāng)前記錄集狀態(tài)

m_pSet->Delete(); //刪除當(dāng)前記錄

if(status.m_lCurrentRecord==0) //若當(dāng)前記錄索引號為0(0表示第一條記錄)則

m_pSet->MoveNext(); //下移一個記錄

else

m_pSet->MoveFirst(); //移動到第一個記錄處

UpdateData(FALSE);

3.修改記錄函數(shù)CRecordSet::Edit可以用來修改記錄,例如:

m_pSet->Edit(); //修改當(dāng)前記錄

m_pSet->m_name="劉向東"; //修改當(dāng)前記錄字段值

m_pSet->Update(); //將修改結(jié)果存入數(shù)據(jù)庫

m_pSet->Requery();9.2MFCODBC應(yīng)用編程3.撤消操作如果用戶在進(jìn)行增加或者修改記錄后,希望放棄當(dāng)前操作,則在調(diào)用CRecordSet::Update()函數(shù)之前調(diào)用CRecordSet::Move(AFX_MOVE_REFRESH)來撤消操作,便可恢復(fù)在增加或修改操作之前的當(dāng)前記錄。

4.操作界面需要說明的是,由于記錄的添加和修改往往在同一個界面中進(jìn)行,會造成一些誤操作。因此,在修改和添加記錄數(shù)據(jù)之前,往往設(shè)計一個對話框用以獲得所需要的數(shù)據(jù),然后用該數(shù)據(jù)進(jìn)行當(dāng)前記錄的編輯。這樣就能避免它們的相互影響,且保證代碼的相對獨(dú)立性。作為示例,下面的過程是在Ex_ODBC的表單視圖中增加三個按鈕:[添加]、[修改]和[刪除],如圖9.19所示。單擊[添加]或[修改]按鈕都將彈出一個如圖9.20所示的對話框,在對話框中對數(shù)據(jù)進(jìn)行編輯后,單擊[確定]按鈕使操作有效。9.2MFCODBC應(yīng)用編程

圖9.19Ex_ODBC的記錄編輯圖9.20“學(xué)生課程成績表”對話框9.2MFCODBC應(yīng)用編程(1)將Ex_ODBC的項目工作區(qū)窗口切換到ResourceView頁面,打開用于表單視圖CEx_ODBCView的對話框資源IDD_EX_ODBC_FORM。參看圖9.19,向表單中添加三個按鈕:[添加](IDC_REC_ADD)、[修改](IDC_REC_EDIT)和[刪除](IDC_REC_DEL)。(2)添加一個對話框資源,打開屬性對話框?qū)⑵渥煮w設(shè)置為“宋體9號”,標(biāo)題定為“學(xué)生課程成績表”,ID號設(shè)為IDD_SCORE_TABLE。(3)參看圖9.20,將表單中的控件復(fù)制到對話框中。復(fù)制時先選中IDD_EX_ODBC_FORM表單資源模板“學(xué)生課程成績表”組框中的所有控件,然后按Ctrl+C,打開對話框IDD_SCORE_TABLE資源,按Ctrl+V即可。(4)再將[OK]和[Cancel]按鈕的標(biāo)題分別改為“確定”和“取消”。圖中具有3D效果的豎直線是用靜態(tài)圖片控件(屬性為“框架”、“刻蝕”)構(gòu)成的。(5)雙擊對話框模板或按Ctrl+W快捷鍵,為對話框資源IDD_SCORE_TABLE創(chuàng)建一個對話框類CScoreDlg。(6)打開MFCClassWizard的MemberVariables標(biāo)簽,在Classname中選擇CScoreDlg,選中所需的控件ID號,雙擊鼠標(biāo)或單擊AddVariables按鈕。依次為控件添加控件變量,結(jié)果如圖9.21所示。9.2MFCODBC應(yīng)用編程圖9.21為CScoreDlg添加的控件變量9.2MFCODBC應(yīng)用編程(7)用MFCClassWizard為CScoreDlg添加IDOK按鈕的BN_CLICKED的消息映射,并添加下列代碼:

voidCScoreDlg::OnOK(){

UpdateData();

m_strStudentNO.TrimLeft();

m_strCourseNO.TrimLeft(); if(m_strStudentNO.IsEmpty())

MessageBox("學(xué)號不能為空!"); else if(m_strCourseNO.IsEmpty())

MessageBox("課程號不能為空!"); else

CDialog::OnOK();}

(8)用MFCClassWizard為CEx_ODBCView類中的三個按鈕:IDC_REC_ADD、IDC_REC_EDIT和IDC_REC_DEL添加BN_CLICKED的消息映射,并添加下列代碼:(9)在Ex_ODBCView.cpp文件的開始處添加下列CScoreDlg類的頭文件包含語句:

#include“ScoreDlg.h”

(10)編譯運(yùn)行并測試。9.2MFCODBC應(yīng)用編程

9.2.3字段操作在前面的示例中,雖然可以通過CRecordSet對象中的字段關(guān)聯(lián)變量可以直接訪問當(dāng)前記錄的相關(guān)字段值,但有時在處理多個字段時就不太方便了。CRecordSet類中的成員變量m_nFields(用于保存數(shù)據(jù)表的字段個數(shù))和成員函數(shù)GetODBCFieldInfo及GetFieldValue可以簡化多字段的訪問操作。

GetODBCFieldInfo函數(shù)用來數(shù)據(jù)表中的字段信息,其函數(shù)原型如下:

voidGetODBCFieldInfo(shortnIndex,CODBCFieldInfo&fieldinfo);

其中,nIndex用于指定字段索引號,0表示第一個字段,1表示第二個字段,以此類推。fieldinfo是CODBCFieldInfo結(jié)構(gòu)參數(shù),用來表示字段信息。

CODBCFieldInfo結(jié)構(gòu)體原型如下:

struct

CODBCFieldInfo{

CString

m_strName; //字段名

SWORDm_nSQLType; //字段的SQL數(shù)據(jù)類型

UDWORDm_nPrecision; //字段的文本大小或數(shù)據(jù)大小

SWORDm_nScale; //字段的小數(shù)點(diǎn)位數(shù)

SWORDm_nNullability; //字段接受空值(NULL)能力

};9.2MFCODBC應(yīng)用編程結(jié)構(gòu)體裁中,SWORD和UDWORD分別表示shortint和unsignedlongint數(shù)據(jù)類型。GetFieldValue函數(shù)用來獲取數(shù)據(jù)表當(dāng)前記錄中指定字段的值,其常用的函數(shù)原型如下:

voidGetFieldValue(shortnIndex,CString&strValue);

其中,nIndex用于指定字段索引號,strValue用來返回字段的內(nèi)容。除了上述字段操作外,CRecordSet類的成員函數(shù)GetRecordCount和GetStatus,還可分別用來獲得表中的記錄總數(shù)和當(dāng)前記錄的索引,其原型如下:

longGetRecordCount()const;voidGetStatus(CRecordsetStatus&rStatus)const;其中,參數(shù)rStatus是指向下列的CRecordsetStatus結(jié)構(gòu)的對象:

struct

CRecordsetStatus{longm_lCurrentRecord; //當(dāng)前記錄的索引,0表示第一個記錄,

//1表示第二個記錄,依次類推。但-1表示在第一個記錄之前,-2表示不確定。

BOOLm_bRecordCountFinal; //記錄總數(shù)是否是最終結(jié)果

};9.2MFCODBC應(yīng)用編程需要注意的是,GetRecordCount函數(shù)所返回的記錄總數(shù)在表打開時或調(diào)用Requery函數(shù)后是不確定的,因而必須經(jīng)過下列的代碼才能獲得最終有效的記錄總數(shù):

while(!m_pSet->IsEOF()){

m_pSet->MoveNext();

m_pSet->GetRecordCount();}

[例Ex_Field]字段的編程操作該示例是用列表視圖來顯示一個課程信息表(參見表9.5)的全部記錄內(nèi)容,并在狀態(tài)欄中顯示記錄總數(shù)。具體步驟按如下4部分進(jìn)行:

1)為數(shù)據(jù)庫Student.mdb添加一個數(shù)據(jù)表course

用MicrosoftAccess為數(shù)據(jù)庫Student.mdb添加一個數(shù)據(jù)表course,如表9.5所示。表中上部分是數(shù)據(jù)表的記錄內(nèi)容,下部分是數(shù)據(jù)表的結(jié)構(gòu)內(nèi)容。需要說明的是,上述字段名最好不要是中文,且一般不能為SQL的關(guān)鍵字no、class、open等,以避免運(yùn)行結(jié)果出現(xiàn)難以排除的錯誤。9.2MFCODBC應(yīng)用編程

2)為文檔應(yīng)用程序添加ODBC的支持(1)用MFCAppWizard創(chuàng)建一個單文檔應(yīng)用程序Ex_Field,但在向?qū)У牡?步將CEx_FieldView的基類由默認(rèn)的CView選擇為CListView類。(2)將項目工作區(qū)窗口切換到FileView頁面,展開HeaderFiles所有項,雙擊stdafx.h,打開該文件。(3)在stdafx.h中添加ODBC數(shù)據(jù)庫支持的頭文件包含#include<afxdb.h>:

#ifndef_AFX_NO_AFXCMN_SUPPORT#include<afxcmn.h> //MFCsupportforWindowsCommonControls#endif//_AFX_NO_AFXCMN_SUPPORT#include<afxdb.h>

3)創(chuàng)建數(shù)據(jù)表score的CRecordSet派生類(1)按快捷鍵Ctrl+W,打開MFCClassWizard對話框。單擊[AddClass]按鈕,從彈出的下拉菜單中選擇“New”。(2)在彈出的“AddClass”對話框中輸入類名(Name)為CCourseSet,指定其基類(Baseclass)為CRecordSet,結(jié)果如圖9.22所示。9.2MFCODBC應(yīng)用編程圖9.22定義新的CRecordSet派生類(3)單擊[OK]按鈕,彈出“DatabaseOptions”對話框。從中選擇ODBC的數(shù)據(jù)源“DatabaseExampleForVC++”,單擊[OK]按鈕,彈出“SelectDatabaseTables”對話框,從中選擇要使用的表course。(4)單擊[OK]按鈕回到MFCClassWizard界面,單擊[確定]按鈕后,系統(tǒng)自動為用戶生成CCourseSet類所需要的代碼。(5)在CEx_FieldView::PreCreateWindow函數(shù)中添加修改列表視圖風(fēng)格的代碼:

BOOLCEx_FieldView::PreCreateWindow(CREATESTRUCT&cs){

cs.style&=~LVS_TYPEMASK;

cs.style|=LVS_REPORT; //報表方式

returnCListView::PreCreateWindow(cs);}9.2MFCODBC應(yīng)用編程(6)在CEx_FieldView::OnInitialUpdate函數(shù)中添加下列代碼:需要說明的是,當(dāng)為數(shù)據(jù)源中的某個數(shù)據(jù)表映射一個CRecordSet類時,該類對象一定先要調(diào)用CRecordSet::Open成員函數(shù),才能訪問該數(shù)據(jù)表的記錄集,訪問后還須調(diào)用CRecordSet::Close成員函數(shù)關(guān)閉記錄集。(7)在Ex_FieldView.cpp文件的前面添加CCourseSet類的頭文件包含語句:

#include"Ex_FieldDoc.h"#include"Ex_FieldView.h"#include"CourseSet.h"

(8)編譯運(yùn)行,結(jié)果如圖9.23所示。圖9.23Ex_Field第一次運(yùn)行結(jié)果9.2MFCODBC應(yīng)用編程4)在狀態(tài)欄中顯示當(dāng)前記錄號和記錄總數(shù)(1)在MainFrm.cpp文件中,向原來的indicators數(shù)組添加一個元素,用來在狀態(tài)欄上增加一個窗格,修改的結(jié)果如下:

staticUINTindicators[]={ ID_SEPARATOR, //第一個信息行窗格

ID_SEPARATOR, //第二個信息行窗格

ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,};9.2MFCODBC應(yīng)用編程(2)為CEx_FieldView類添加一個成員函數(shù)DispRecNum成員函數(shù),其代碼如下:

voidCEx_FieldView::DispRecNum(CCourseSet*pSet){

CString

str;

CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; //獲得主框架窗口的指針

CStatusBar*pStatus=&pFrame->m_wndStatusBar; //獲得主框架窗口中的狀態(tài)欄指針

if(pStatus){

CRecordsetStatus

rStatus;

pSet->GetStatus(rStatus); //獲得當(dāng)前記錄信息

str.Format("當(dāng)前記錄:%d總記錄:%d",1+rStatus.m_lCurrentRecord,

pSet->GetRecordCount());

pStatus->SetPaneText(1,str); //更新第二個窗格的文本

}}9.2MFCODBC應(yīng)用編程該函數(shù)先獲得狀態(tài)欄對象的指針,然后調(diào)用SetPaneText函數(shù)更新第二個窗格的文本。(3)在CEx_FieldView類的OnInitialUpdate函數(shù)處添加下列代碼:

voidCEx_FieldView::OnInitialUpdate(){…

CString

str; while(!cSet.IsEOF()) {…}

DispRecNum(&cSet);

cSet.Close(); //關(guān)閉記錄集

}(4)在Ex_FieldView.cpp文件的開始處增加下列語句:

#include"Ex_FieldDoc.h"#include"Ex_FieldView.h"#include"CourseSet.h"#include"MainFrm.h"9.2MFCODBC應(yīng)用編程(5)將MainFrm.h文件中的保護(hù)型變量m_wndStatusBar變成公共變量。(6)編譯運(yùn)行并測試,結(jié)果如圖9.24所示。顯示的記錄信息圖9.24Ex_Field最后運(yùn)行結(jié)果9.2MFCODBC應(yīng)用編程

9.2.4多表處理數(shù)據(jù)庫中表與表之間往往存在著一定的關(guān)系,例如要顯示一個學(xué)生的課程成績信息,信息包括學(xué)號、姓名、課程號、課程所屬專業(yè)、課程名稱、課程類別、開課學(xué)期、課時數(shù)、學(xué)分、成績,則要涉及到前面的學(xué)生課程成績表(score)、課程表以及學(xué)生基本信息表。其中的學(xué)生基本信息表如表9.6所示。表中上部分是數(shù)據(jù)表的記錄內(nèi)容,下部分是數(shù)據(jù)表的結(jié)構(gòu)內(nèi)容。表9.6學(xué)生基本信息表(student)及其表結(jié)構(gòu)

姓名(studentname)學(xué)號(sudentno)性別(xb)出生年月(birthday)專業(yè)(special)李明王玲張芳陳濤21010101210101022101050121010502truefalsefalsetrue1985-1-11985-1-11985-1-11985-1-1電氣工程及其自動化電氣工程及其自動化機(jī)械工程及其自動化機(jī)械工程及其自動化序號字段名稱數(shù)據(jù)類型字段大小小數(shù)位字段含義12345studentnamestudentnoxbbirthdayspecial文本文本是/否日期/時間文本201050姓名學(xué)號性別出生年月專業(yè)9.2MFCODBC應(yīng)用編程下面的示例在一個對話框中用兩個控件來進(jìn)行學(xué)生課程成績信息的相關(guān)操作,如圖9.25所示,左邊是樹視圖,用來顯示學(xué)生成績、專業(yè)和班級號三個層次信息,單擊班級號,所有該班級的學(xué)生課程成績信息將在右邊的列表視圖中顯示出來。圖9.25Ex_Student運(yùn)行結(jié)果9.2MFCODBC應(yīng)用編程

[例Ex_Student]多表處理(按6部分來闡述)

1)為數(shù)據(jù)庫Student.mdb添加一個數(shù)據(jù)表student

用MicrosoftAccess為數(shù)據(jù)庫Student.mdb添加一個數(shù)據(jù)表student,如前表9.6所示。

2)創(chuàng)建并設(shè)計對話框應(yīng)用程序(1)用MFCAppWizard創(chuàng)建一個默認(rèn)的基于對話框應(yīng)用程序Ex_Student。(2)在打開的對話框資源模板中,刪除[取消]按鈕和默認(rèn)的靜態(tài)文本控件。調(diào)整對話框大小,將對話框的標(biāo)題文本改為“處理多表”,將[確定]按鈕的標(biāo)題文本改為“退出”。(3)參看圖8.26的控件布局,向?qū)υ捒蛑刑砑右粋€樹控件,在其屬性對話框中,選中“有按鈕”、“有線條”、“根部的線”和“總是顯示選定內(nèi)容”屬性。(4)向?qū)υ捒蛑刑砑右粋€列表控件,在其屬性對話框中,將“查看”屬性選為“報告”。(5)用MFCClassWizard在CEx_StudentDlg類中,添加樹控件的控件變量為m_treeCtrl,添加列表控件的控件變量為m_listCtrl。

3)添加對MFCODBC的支持及記錄集(1)在stdafx.h文件中添加ODBC數(shù)據(jù)庫支持的頭文件包含#include<afxdb.h>。(2)用MFCClassWizard為數(shù)據(jù)表student、course和score分別創(chuàng)建CRecordSet派生類CStudentSet、CCourseSet和CScoreSet。9.2MFCODBC應(yīng)用編程

4)完善左邊樹控件的代碼(1)為CEx_StudentDlg類添加一個成員函數(shù)FindTreeItem,用來查找指定節(jié)點(diǎn)下是否有指定節(jié)點(diǎn)文本的子節(jié)點(diǎn),該函數(shù)的代碼如下:

HTREEITEMCEx_StudentDlg::FindTreeItem(HTREEITEM

hParent,CString

str){ HTREEITEMhNext;

CString

strItem;

hNext=m_treeCtrl.GetChildItem(hParent); while(hNext!=NULL){

strItem=m_treeCtrl.GetItemText(hNext);if(strItem==str) returnhNext; else hNext=m_treeCtrl.GetNextItem(hNext,TVGN_NEXT); } returnNULL;}

(2)為CEx_StudentDlg類添加一個CImageList成員變量m_ImageList。(3)在CEx_StudentDlg::OnInitDialog中添加下列代碼:9.2MFCODBC應(yīng)用編程(4)在Ex_StudentDlg.cpp文件的前面添加記錄集類的包含文件,如下面的代碼:

#include"Ex_StudentDlg.h"#include"StudentSet.h"#include"ScoreSet.h"#include"CourseSet.h"(5)編譯運(yùn)行,結(jié)果如圖9.26所示。圖9.26Ex_Student第一次運(yùn)行結(jié)果9.2MFCODBC應(yīng)用編程

5)完善右邊列表控件的代碼(1)在CEx_StudentDlg::OnInitDialog函數(shù)中添加下列代碼,用來創(chuàng)建列表標(biāo)題頭:

BOOLCEx_StudentDlg::OnInitDialog(){…

sSet.Close(); //設(shè)置列表頭

CString

strHeader[]={"學(xué)號","姓名","課程號","課程所屬專業(yè)", "課程名稱","課程類別","開課學(xué)期","課時數(shù)","學(xué)分","成績"};

int

nLong[]={80,80,80,180,180,80,80,80,80,80}; for(int

nCol=0;nCol<sizeof(strHeader)/sizeof(CString);nCol++)

m_listCtrl.InsertColumn(nCol,strHeader[nCol],LVCFMT_LEFT,nLong[nCol]);returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}

(2)為CEx_StudentDlg類添加一個成員函數(shù)DispScoreAndCourseInfo,用來根據(jù)指定的條件在列表控件中用報表形式顯示學(xué)生成績的所有信息,該函數(shù)的代碼如下:9.2MFCODBC應(yīng)用編程(3)編譯并運(yùn)行,結(jié)果如圖9.27所示。圖9.27Ex_Student第二次運(yùn)行結(jié)果

6)完善兩控件的關(guān)聯(lián)代碼(1)從上圖中可以看出,學(xué)生成績還沒有顯示出來,下面將實現(xiàn)單擊左邊的班級號,在右邊視圖中顯示該班級的所有學(xué)生成績信息。(2)用MFCClassWizard為CEx_StudentDlg類添加TVN_SELCHANGED消息處理,并添加下列代碼:9.2MFCODBC應(yīng)用編程

voidCEx_StudentDlg::OnSelchangedTree1(NMHDR*pNMHDR,LRESULT*pResult){ NM_TREEVIEW*pNMTreeView=(NM_TREEVIEW*)pNMHDR; HTREEITEMhSelItem=pNMTreeView->itemNew.hItem; //獲取當(dāng)前選擇的節(jié)點(diǎn)

//如果當(dāng)前的節(jié)點(diǎn)沒有子節(jié)點(diǎn),那說明該節(jié)點(diǎn)是班級號節(jié)點(diǎn)

if(m_treeCtrl.GetChildItem(hSelItem)==NULL){

CString

strSelItem,str;

strSelItem=m_treeCtrl.GetItemText(hSelItem);

str.Format("studentnoLIKE'%s%%'",strSelItem.Left(6));

DispScoreAndCourseInfo(str); } *pResult=0;}

代碼中,調(diào)用DispScoreAndCourseInfo

函數(shù)是的參數(shù)是用來設(shè)置數(shù)據(jù)表(記錄集)打開的過濾條件。str是類似的這樣內(nèi)容“studentnoLIKE210101%”,它使得所有學(xué)號前面是210101的記錄被打開。%是SQL使用的通配符,由于%也是VisaulC++格式前導(dǎo)符,因為在代碼中需要兩個%。(3)編譯運(yùn)行并測試。9.3ADO數(shù)據(jù)庫編程9.3.1ADO編程的一般過程在MFC應(yīng)用程序中使用ADO數(shù)據(jù)庫的一般過程是:①添加對ADO的支持;②創(chuàng)建一個數(shù)據(jù)源連接;③對數(shù)據(jù)源中的數(shù)據(jù)庫進(jìn)行操作;④關(guān)閉數(shù)據(jù)源。這里先來介紹添加對ADO的支持以及數(shù)據(jù)源連接和關(guān)閉。

1.添加對ADO的支持

ADO編程有三種方式:使用預(yù)處理指令#import、使用MFC中的CIDispatchDriver和直接使用COM提供的API。這三種方式中,第一種最為簡便,故這里采有用這種方法。下面以一個示例過程來說明在MFC應(yīng)用程序中添加對ADO的支持。

[例Ex_ADO]添加對ADO的支持(1)用MFCAppWizard創(chuàng)建一個默認(rèn)的單文檔應(yīng)用程序Ex_ADO,但在向?qū)У牡?步將CEx_ADOView的基類由默認(rèn)的CView選擇為CListView類,以便更好地顯示和操作數(shù)據(jù)表中的記錄。(2)在CEx_ADOView::PreCreateWindow函數(shù)添加下列代碼,用來設(shè)置列表視圖內(nèi)嵌列表控件的風(fēng)格:9.3ADO數(shù)據(jù)庫編程

BOOLCEx_ADOView::PreCreateWindow(CREATESTRUCT&cs){

cs.style|=LVS_REPORT; //報表風(fēng)格

returnCListView::PreCreateWindow(cs);}

(3)在stdafx.h文件中添加對ADO支持的代碼:

#endif//_AFX_NO_AFXCMN_SUPPORT#include<afxcmn.h> //MFCsupportforWindowsCommonControls#import"C:\ProgramFiles\CommonFiles\System\ADO\msado15.dll"\

no_namespace

rename("EOF","adoEOF")#include<icrsint.h>//{{AFX_INSERT_LOCATION}}

代碼中,預(yù)編譯命令#import是編譯器將此命令中所指定的動態(tài)鏈接庫文件引入到程序中,并從動態(tài)鏈接庫文件中抽取出其中的對象和類的信息。

icrsint.h文件包含了VisualC++擴(kuò)展的一些預(yù)處理指令、宏等的定義,用于與數(shù)據(jù)庫數(shù)據(jù)綁定。9.3ADO數(shù)據(jù)庫編程(4)在CEx_ADOApp::InitInstance函數(shù)中添加下列代碼,用來對ADO的COM環(huán)境進(jìn)行初始化:

BOOLCEx_ADOApp::InitInstance(){ ::CoInitialize(NULL);

AfxEnableControlContainer(); …}

(5)在Ex_ADOView.h文件中為CEx_ADOView定義三個ADO對象指針變量:

public: _ConnectionPtr

m_pConnection;_RecordsetPtr

m_pRecordset; _CommandPtr

m_pCommand;

代碼中,_ConnectionPtr、_RecordsetPtr和_CommandPtr分別是ADO對象Connection、Recordset和Command的智能指針類型。

2.連接數(shù)據(jù)源只有建立了與數(shù)據(jù)庫服務(wù)器的連接后,才能進(jìn)行其他有關(guān)數(shù)據(jù)庫的訪問和操作。ADO使用Connection對象來建立與數(shù)據(jù)庫服務(wù)器的連接,它相當(dāng)于MFC中的CDatabase類。和CDatabase類一樣,調(diào)用Connection對象的Open即可建立與服務(wù)器的連接。9.3ADO數(shù)據(jù)庫編程

HRESULTConnection::Open(_bstr_t

ConnectionString,_bstr_t

UserID,_bstr_t

Password,longOptions)

其中,ConnectionString為連接字串,UserID是用戶名,Password是登錄密碼,Options是選項,通常用于設(shè)置同步和異步等方式。_bstr_t是一個COM類,用于字符串BSTR(用于Automation的寬字符)操作。需要說明的是,正確設(shè)置ConnectionString是連接數(shù)據(jù)源的關(guān)鍵。不同的數(shù)據(jù),其連接字串有所不同,見表9.7所示。表9.7Connection對象的連接字串格式數(shù)據(jù)源格式ODBC"[Provider=MSDASQL;]{DSN=name|FileDSN=filename};[DATABASE=database;]UID=user;PWD=password"Access數(shù)據(jù)庫"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=databaseName;UserID=userName;Password=userPassWord"Oracle數(shù)據(jù)庫"Provider=MSDAORA;DataSourse=serverName;UserID=userName;Password=userPassword;"MSSQL數(shù)據(jù)庫"Provider=SQLOLEDB;DataSource=serverName;InitialCatalog=databaseName;UserID=user;Password=userPassword;"注:格式字串中,“[]”為可選項,“{}”為必選項,,且等于符號“=”兩邊不應(yīng)有空格符。9.3ADO數(shù)據(jù)庫編程例如:若連接本地當(dāng)前目錄中的Access數(shù)據(jù)庫文件student.mdb,則有:

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=student.mdb;","","",0);或者,先設(shè)置Connection對象的ConnectionString屬性,然后調(diào)用Open:

m_pConnection->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=student.mdb;";

m_pConnection->Open("","","",0);再如,若連接ODBC數(shù)據(jù)源為"DatabaseExampleForVC++"的數(shù)據(jù)庫,則有:

m_pConnection->ConnectionString="DSN=DatabaseExampleForVC++";

m_pConnection->Open("","","",0);3.關(guān)閉連接用MFCClassWizard為CEx_ADOView映射WM_DESTROY消息,并添加下列代碼:

voidCEx_ADOView::OnDestroy(){

CListView::OnDestroy(); if(m_pConnection)

m_pConnection->Close();//關(guān)閉連接

}9.3ADO數(shù)據(jù)庫編程4.獲取數(shù)據(jù)源信息

Connection對象除了建立與數(shù)據(jù)庫服務(wù)器的連接外,還可以通過OpenSchema來獲取數(shù)據(jù)源的自有信息,如:數(shù)據(jù)表信息、表字段信息以及所支持的數(shù)據(jù)類型等。下面的代碼用來獲取student.mdb的數(shù)據(jù)表名和字段名,并將信息內(nèi)容顯示在列表視圖中:代碼中,__uuidof用來獲取對象的的全局唯一標(biāo)識(GUID)。ConnectionTimeout是連接超時屬性,單位為秒。OpenSchema方法中的adSc

溫馨提示

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

評論

0/150

提交評論