《Visual C++ 6.0程序設(shè)計》課件第9章_第1頁
《Visual C++ 6.0程序設(shè)計》課件第9章_第2頁
《Visual C++ 6.0程序設(shè)計》課件第9章_第3頁
《Visual C++ 6.0程序設(shè)計》課件第9章_第4頁
《Visual C++ 6.0程序設(shè)計》課件第9章_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第9章數(shù)據(jù)庫編程9.1綜述9.2數(shù)據(jù)庫應(yīng)用實例思考題

9.1綜述

數(shù)據(jù)庫技術(shù)是信息技術(shù)的基礎(chǔ)。作為計算機應(yīng)用領(lǐng)域的一個重要組成部分,管理數(shù)據(jù)庫是計算機的主要用途之一,尤其是商業(yè)應(yīng)用軟件基本上都有數(shù)據(jù)庫交互功能。使用數(shù)據(jù)庫管理數(shù)據(jù)有很明顯的優(yōu)點,如減小數(shù)據(jù)冗余,可以對數(shù)據(jù)的一致性和完整性統(tǒng)一控制,實現(xiàn)數(shù)據(jù)共享和快速查找等。因此數(shù)據(jù)庫在不同的領(lǐng)域,不同的部門得到了廣泛的應(yīng)用。

在VC++6.0中,用戶可以選擇使用開放數(shù)據(jù)鏈接(ODBC)、數(shù)據(jù)訪問對象(DAO)、OLEDB或ActiveX數(shù)據(jù)對象(ADO)方式來訪問數(shù)據(jù)庫,MFC中也提供了數(shù)據(jù)庫類,使用戶可以方便地進行數(shù)據(jù)庫操作。9.1.1常見數(shù)據(jù)庫訪問技術(shù)簡介

1.VisualC++開發(fā)數(shù)據(jù)庫技術(shù)的特點

1)簡單性

Visual

C++中提供了MFC類庫、ATL模板類以及AppWizard、ClassWizard等一系列的Wizard工具用于幫助用戶快速地建立自己的應(yīng)用程序,大大簡化了應(yīng)用程序的設(shè)計。開發(fā)者使用這些技術(shù)只需編寫很少的代碼或不需編寫代碼就可以開發(fā)一個數(shù)據(jù)庫應(yīng)用程序。

2)靈活性

Visual

C++提供的開發(fā)環(huán)境使開發(fā)者可以根據(jù)自己的需要設(shè)計應(yīng)用程序的界面和功能,而且Visual

C++提供了豐富的類庫和方法,使開發(fā)者可以根據(jù)自己的應(yīng)用特點進行選擇。

3)訪問速度快

為了解決ODBC開發(fā)的數(shù)據(jù)庫應(yīng)用程序訪問數(shù)據(jù)庫速度慢的問題,Visual

C++提供了新的訪問技術(shù)——OLE

DB和ADO。OLE

DB和ADO都是基于COM接口的技術(shù),使用這種技術(shù)可以直接對數(shù)據(jù)庫的驅(qū)動程序進行訪問,這大大提高了訪問速度。

4)可擴展性

Visual

C++提供了OLE技術(shù)和ActiveX技術(shù),這種技術(shù)可以增強應(yīng)用程序的能力。使用OLE技術(shù)和ActiveX技術(shù)可以使開發(fā)者利用Visual

C++中提供的各種組件、控件以及第三方開發(fā)者提供的組件來創(chuàng)建自己的程序,從而實現(xiàn)應(yīng)用程序的組件化。使用這種技術(shù)使應(yīng)用程序具有良好的可擴展性。

5)可訪問不同種類數(shù)據(jù)源

傳統(tǒng)的ODBC技術(shù)只能訪問關(guān)系型數(shù)據(jù)庫,在Visual

C++中,提供了OLE

DB訪問技術(shù),用戶不僅可以訪問關(guān)系型數(shù)據(jù)庫,還可以訪問非關(guān)系型數(shù)據(jù)庫。

2.VisualC++常用開發(fā)數(shù)據(jù)庫技術(shù)

VisualC++提供了多種訪問數(shù)據(jù)庫的技術(shù),主要有如下幾種。

1)?SQL(結(jié)構(gòu)化查詢語言)

SQL語句分為兩類:一類是DDL(DataDefinitionLanguage,數(shù)據(jù)定義語言)語句,它用來創(chuàng)建表、索引等,另一類是DML(DataManipulationLanguage,數(shù)據(jù)操作語言)語句,這些語句用來讀取數(shù)據(jù)、更新數(shù)據(jù)和執(zhí)行其他類似操作。

2)?ODBC(OpenDataBaseConnectivity)

ODBC是客戶應(yīng)用程序訪問關(guān)系數(shù)據(jù)庫時提供的一個統(tǒng)一的接口。對于不同的數(shù)據(jù)庫,ODBC提供了一套統(tǒng)一的API,使應(yīng)用程序可以應(yīng)用所提供的API來訪問任何提供了ODBC驅(qū)動程序的數(shù)據(jù)庫。而且ODBC已經(jīng)成為一種標準,所以目前所有的關(guān)系數(shù)據(jù)庫都提供了ODBC驅(qū)動程序,這使ODBC的應(yīng)用非常廣泛,基本上可用于所有的關(guān)系數(shù)據(jù)庫。

但由于ODBC只能用于關(guān)系數(shù)據(jù)庫,因此利用ODBC很難訪問對象數(shù)據(jù)庫及其他非關(guān)系數(shù)據(jù)庫。

由于ODBC是一種底層的訪問技術(shù),因此,ODBC

API可以使客戶應(yīng)用程序從底層設(shè)置和控制數(shù)據(jù)庫,完成一些高層數(shù)據(jù)庫技術(shù)無法完成的功能。

3)?MFCODBC(MicrosoftFoundationClassesODBC)

由于直接使用ODBC

API編寫應(yīng)用程序要編制大量代碼,因此在Visual

C++中提供了MFC

ODBC類,封裝了ODBC

API,這使得利用MFC來創(chuàng)建ODBC的應(yīng)用程序非常簡便。

4)?DAO(DataAccessObject)

DAO提供了一種通過程序代碼創(chuàng)建和操縱數(shù)據(jù)庫的機制。多個DAO構(gòu)成一個體系結(jié)構(gòu),在這個結(jié)構(gòu)中,各個DAO對象協(xié)同工作。MFC

DAO是微軟提供的用于訪問Microsoft

Jet數(shù)據(jù)庫文件(*.mdb)的強有力的數(shù)據(jù)庫開發(fā)工具。它通過DAO的封裝,向程序員提供了DAO豐富的操作數(shù)據(jù)庫手段。

5)?OLEDB(ObjectLinkandEmbeddingDataBase)

OLE

DB是Visual

C++開發(fā)數(shù)據(jù)庫應(yīng)用中提供的新技術(shù),它基于COM接口。因此,OLE

DB對所有的文件系統(tǒng)包括關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫都提供了統(tǒng)一的接口。這些特性使得OLE

DB技術(shù)比傳統(tǒng)的數(shù)據(jù)庫訪問技術(shù)更加優(yōu)越。

與ODBC技術(shù)相似,OLE

DB屬于數(shù)據(jù)庫訪問技術(shù)中的底層接口。直接使用OLE

DB來設(shè)計數(shù)據(jù)庫應(yīng)用程序需要大量的代碼。在VC中提供了ATL模板,用于設(shè)計OLE

DB數(shù)據(jù)應(yīng)用程序和數(shù)據(jù)提供程序。

6)?ADO(ActiveXDataObject)

ADO技術(shù)是基于OLE

DB的訪問接口,它繼承了OLE

DB技術(shù)的優(yōu)點,并且,ADO對OLE

DB的接口作了封裝,定義了ADO對象,使程序開發(fā)得到簡化。ADO技術(shù)屬于數(shù)據(jù)庫訪問的高層接口。

本書中,對MFCODBC做重點介紹。9.1.2ODBC介紹

1.ODBC概述

Microsoft于1991年1月發(fā)布了ODBC,并迅速得到了廣大用戶的認可,各主要數(shù)據(jù)庫廠商也紛紛推出支持ODBC的驅(qū)動程序。ODBC作為

Microsoft的重大成果,已經(jīng)成功地為Windows操作系統(tǒng)建立了一個開放的接口。

ODBC是OpenDatabaseConnectivity的縮寫,意思為“開放數(shù)據(jù)庫鏈接”。ODBC是使用最廣泛的Windows應(yīng)用程序數(shù)據(jù)庫接口。ODBC為不同的數(shù)據(jù)庫資源提供一個標準的接口,可以使用與數(shù)據(jù)庫管理系統(tǒng)(DBMS)的類型無關(guān)的方式訪問數(shù)據(jù)庫。一個基于ODBC的應(yīng)用程序?qū)?shù)據(jù)庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的數(shù)據(jù)庫操作由對應(yīng)的DBMS的ODBC驅(qū)動程序完成。也就是說,不論是FoxPro、Access還是Oracle數(shù)據(jù)庫,均可用ODBCAPI進行訪問。由此可見,ODBC的最大優(yōu)點就是能以統(tǒng)一的方式處理所有的數(shù)據(jù)庫。作為一個一致的數(shù)據(jù)庫操作接口,ODBC提供了一個允許單一應(yīng)用程序訪問許多不同數(shù)據(jù)庫管理系統(tǒng)的機制,這種機制允許應(yīng)用程序開發(fā)者不把一個特定的數(shù)據(jù)庫管理系統(tǒng)(DBMS)作為目標去創(chuàng)建應(yīng)用程序,隨后用戶能夠增加數(shù)據(jù)庫驅(qū)動程序模塊,該數(shù)據(jù)庫驅(qū)動程序把應(yīng)用程序連接到用戶選擇的DBMS上。

ODBC通過使用數(shù)據(jù)庫驅(qū)動程序(Driver)來提供數(shù)據(jù)庫的獨立性。驅(qū)動程序是用以支持ODBC函數(shù)調(diào)用的模塊,ODBC通過調(diào)用驅(qū)動程序所支持的函數(shù)來對數(shù)據(jù)庫進行操作。驅(qū)動程序與具體的數(shù)據(jù)庫有關(guān),如果要訪問不同類型的數(shù)據(jù)庫,ODBC就需要動態(tài)地連接到不同的驅(qū)動程序上。

ODBC的另一個重要組成部分是驅(qū)動程序管理器(DriverManager)。ODBC驅(qū)動程序管理器位于Windows控制面板中的32位ODBC程序項中。驅(qū)動程序管理器包含在ODBC32.DLL中,能夠連接到所有的ODBC應(yīng)用程序中,它負責安裝驅(qū)動程序、管理數(shù)據(jù)源、ODBC函數(shù)與DLL中函數(shù)的綁定,并幫助程序員跟蹤ODBC的函數(shù)調(diào)用。在ODBC中,應(yīng)用程序不能直接存取數(shù)據(jù)庫,必須通過管理器和數(shù)據(jù)庫交換信息。

MFC提供的ODBC類對較復(fù)雜的ODBCAPI進行了封裝,提供了簡化的調(diào)用接口,從而大大方便了數(shù)據(jù)庫應(yīng)用程序的開發(fā)。程序員不必了解ODBCAPI和SQL的具體細節(jié),利用ODBC類即可完成對數(shù)據(jù)庫的大部分操作。VisualC++6.0中已經(jīng)提供了對ODBC3.51的支持,用戶可以用其API函數(shù)進行操作。

2.ODBC組成

一個完整的ODBC由下列幾個部件組成:

(1)應(yīng)用程序(Application)。

(2)ODBC管理器(Administrator)。該程序位于Windows95控制面板(ControlPanel)的32位ODBC內(nèi),其主要任務(wù)是管理安裝的ODBC驅(qū)動程序和管理數(shù)據(jù)源。

(3)驅(qū)動程序管理器(DriverManager)。驅(qū)動程序管理器包含在ODBC32.DLL中,對用戶是透明的。其任務(wù)是管理ODBC驅(qū)動程序,是ODBC中最重要的部件。

(4)?ODBCAPI。

(5)?ODBC驅(qū)動程序。ODBC驅(qū)動程序是一些DLL,提供了ODBC和數(shù)據(jù)庫之間的接口。

(6)數(shù)據(jù)源。數(shù)據(jù)源包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等信息,實際上是一種數(shù)據(jù)連接的抽象。各部件之間的關(guān)系如圖9-1所示。圖9-1ODBC組成結(jié)構(gòu)圖應(yīng)用程序要訪問一個數(shù)據(jù)庫,首先必須用ODBC管理器注冊一個數(shù)據(jù)源(或動態(tài)注冊一個數(shù)據(jù)源),管理器根據(jù)數(shù)據(jù)源提供的數(shù)據(jù)庫位置、數(shù)據(jù)庫類型及ODBC驅(qū)動程序等信息,建立起ODBC與具體數(shù)據(jù)庫的聯(lián)系。這樣,只要應(yīng)用程序?qū)?shù)據(jù)源名提供給ODBC,ODBC就能建立起與相應(yīng)數(shù)據(jù)庫的連接。

在ODBC中,ODBCAPI不能直接訪問數(shù)據(jù)庫,必須通過驅(qū)動程序管理器與數(shù)據(jù)庫交換信息。驅(qū)動程序管理器負責將應(yīng)用程序?qū)DBCAPI的調(diào)用傳遞給正確的驅(qū)動程序,而驅(qū)動程序在執(zhí)行完相應(yīng)的操作后,將結(jié)果通過驅(qū)動程序管理器返回給應(yīng)用程序。

在VC的數(shù)據(jù)庫類中,最主要的有CDatabase類和CRecordset類。

3.CDatabase類

CDatabase類主要用于對數(shù)據(jù)庫的連接,應(yīng)用程序通過此連接訪問數(shù)據(jù)源。

使用CDatabase的操作步驟如下:

(1)構(gòu)造一個CDatabase對象。

(2)調(diào)用CDatabase類的成員函數(shù)OpenEx()打開一個鏈接。

(3)當用戶在程序中構(gòu)造CRecordset對象來處理連接的數(shù)據(jù)源時,將一個指向CDatabase對象的指針傳遞給CRecordset對象。

(4)使用連接完后,調(diào)用CDatabase::Close成員函數(shù)來關(guān)閉連接,并刪除CDatabaset。

常用的成員函數(shù)如下:

1)構(gòu)造函數(shù)

通過CDatabase函數(shù)可以創(chuàng)建一個CDatabase對象,它的原型如下:

CDatabase();

構(gòu)造對象后,必須調(diào)用成員函數(shù)Open或OpenEx建立到指定數(shù)據(jù)源的連接。

2)?Open()函數(shù)

通過Open函數(shù)建立數(shù)據(jù)庫對象與ODBC數(shù)據(jù)源之間的連接,其函數(shù)原型如下:

virtualBOOLOpenEx(LPCTSTRlpszDSN,

BOOLbExclusive=FALSE,

BOOLbReadOnly=FALSE,

LPCTSTRlpszConnect="ODBC",

BOOLbUseCursorLib=TRUE);

Open函數(shù)參數(shù)說明如表9-1所示。

3)?OpenEx()函數(shù)

通過OpenEx函數(shù)建立數(shù)據(jù)庫對象與ODBC數(shù)據(jù)源之間的連接,其函數(shù)原型如下:

virtualBOOLOpenEx(LPCTSTRlpszConnectString,DWORDdwOptions=0);

throw(CDBException,CMemoryException);

OpenEX函數(shù)參數(shù)說明如表9-2所示。

4)?Close()函數(shù)

該函數(shù)斷開數(shù)據(jù)庫對象與ODBC數(shù)據(jù)源之間的連接,其函數(shù)原型如下:

virtualvoidClose();

5)?GetConnect()函數(shù)

通過這個函數(shù)可以獲得與ODBC數(shù)據(jù)源連接的字符串,其函數(shù)原型如下:

constString&GetConnect();

6)?IsOpen()函數(shù)

通過IsOpen函數(shù)可以確定當前的CDatabase對象是否與數(shù)據(jù)源連接,其函數(shù)原型如下:

BOOLIsOpen();

如當前的CDatabase對象已經(jīng)與數(shù)據(jù)源連接,返回非0值,否則返回0值。

7)?GetDatabaseName()函數(shù)

通過GetDatabaseName函數(shù)可以得到與CDatabase對象連接的數(shù)據(jù)庫名稱,其函數(shù)原型如下:

CStringGetDatabaseName();

8)?CanUpdate()函數(shù)

通過CanUpdate函數(shù)可以檢測CDatabase對象是否允許更新,其函數(shù)原型如下:

BOOLCanUpdate();

如果CDatabase對象允許更新,則返回非0值,否則返回0值。

9)?CanTransact()函數(shù)

通過CanTransact函數(shù)可以確定數(shù)據(jù)源是否支持事務(wù),其函數(shù)原型如下:

BOOLCanTransact()const;

如果數(shù)據(jù)源支持事務(wù),則返回非0值,否則返回0值。

10)?SetLoginTimeout()函數(shù)

通過SetLoginTimeout函數(shù)可以設(shè)置登錄超時時間,其函數(shù)原型如下:

voidSetLoginTimeout(DWORDdwSeconds);

11)?SetQueryTimeout()函數(shù)

SetQueryTimeout函數(shù)可以設(shè)置查詢超時時間,其函數(shù)原型如下:

voidSetQueryTimeout(DWORDdwSeconds);

4.CRecordset類

CRecordset類主要用來與數(shù)據(jù)庫進行交互。類中封裝了對一個數(shù)據(jù)記錄的處理,如添加、修改、刪除、更新等操作。

常見的成員函數(shù)如下。

1)構(gòu)造函數(shù)

在處理數(shù)據(jù)庫的記錄集之前,需要為CRecordset對象打開記錄集。CRecordset類的Open函數(shù)用于打開記錄集,但在打開之前,首先要構(gòu)造CRecordset對象,這時需用到CRecordset的構(gòu)造函數(shù),函數(shù)原型為:

CRecordset(CDatabase*pDatabase=NULL);參數(shù)為指向CDatabase的指針。默認值為NULL。如果有了CDatabase對象,則可以直接傳遞給CRecordset構(gòu)造函數(shù)。如果參數(shù)CDatabase對象沒有進行連接,即使用默認參數(shù)NULL,則在CRecordset對象的Open函數(shù)中進行連接。

2)?Open()函數(shù)

Open函數(shù)用于為CRecordset對象打開記錄集,函數(shù)原型為:

virtualBOOLOpen(UINTnOpenType=AFX_DB_USE_DEFAULT_TYPE,

LPCTSTRlpszSQL=NULL,DWORDdwOptions=none);

throw(CDBException,CMemoryException);

Open函數(shù)參數(shù)說明如表9-3所示。0

3)?Close()函數(shù)

Close函數(shù)用于關(guān)閉記錄集,其函數(shù)原型如下:

virtualvoidClose();

4)?AddNew()函數(shù)

AddNew用于向記錄集中添加一條新的空白記錄,插入數(shù)據(jù)庫的末尾。用戶可以通過修改成員變量的值在空白記錄中寫入數(shù)據(jù),然后調(diào)用Update函數(shù)更新數(shù)據(jù)庫。其函數(shù)原型如下:

virtualvoidAddNew();

throw(CDBException);

如果選擇dynasets方式打開記錄集,新增加的記錄會立刻出現(xiàn)在記錄集的末尾;而對于snapshots方式,只有調(diào)用Requery函數(shù)后記錄集中才會體現(xiàn)這種增加。

5)?Delete()函數(shù)

Delete函數(shù)用于刪除當前記錄,記錄集指針移動到下一條記錄,其函數(shù)原型如下:

virtualvoidDelete();

throw(CDBException);

注意,執(zhí)行此命令后,不需要使用Update函數(shù)進行更新;刪除記錄前,需要確認是否可以修改數(shù)據(jù)源,可以使用CanUpdate函數(shù)進行判斷。

6)?Edit()函數(shù)

Edit函數(shù)用于編輯記錄集中的當前記錄,調(diào)用此函數(shù)后,可對成員變量進行修改,其函數(shù)原型如下:

virtualvoidEdit();

throw(CDBException,CMemoryException);

執(zhí)行此命令后,需要使用Update函數(shù)進行更新。

7)?Update()函數(shù)

Update函數(shù)用于將AddNew和Edit函數(shù)執(zhí)行后對記錄集的修改進行更新,保存到數(shù)據(jù)源中,其函數(shù)原型為:

virtualvoidUpdate();

throw(CDBException);

8)?CancelUpdate()函數(shù)

與Update函數(shù)功能相反,CancelUpdate函數(shù)用于取消Edit和AddNew函數(shù)進行的更新操作,其函數(shù)原型為:

virtualvoidCancelUpdate();

9)?Requery()函數(shù)

Requery函數(shù)用于重新刷新記錄集。調(diào)用該函數(shù)后,記錄集將獲得從數(shù)據(jù)源中重新獲取的數(shù)據(jù)而重建記錄集,所有相關(guān)的應(yīng)用程序進行的修改將反應(yīng)在新的記錄集上,其函數(shù)原型為:

virtualvoidRequery();

throw(CDBException);

如果用戶進行了查詢過濾操作,可以在修改了m_strFilter和m_strSort成員變量后調(diào)用Requery函數(shù)。

10)?MoveFirst()函數(shù)

MoveFirst函數(shù)可將當前位置移動到開始位置,函數(shù)原型為:

voidMoveFirst();

throw(CDBException,CMemoryException);

11)?MoveLast()函數(shù)

MoveLast函數(shù)可將當前位置移動到末尾位置,函數(shù)原型為:

voidMoveLast();

throw(CDBException,CMemoryException);

12)?MoveNext()函數(shù)

MoveNext函數(shù)可將當前位置向前移動一個記錄位置,函數(shù)原型為:

voidMoveNext();

throw(CDBException,CMemoryException);

13)?MovePrev()函數(shù)

MovePrev函數(shù)可將當前位置向后移動一個記錄位置,函數(shù)原型為:

voidMovePrev();

throw(CDBException,CMemoryException);

14)?Move()函數(shù)

Move函數(shù)用于移動記錄集指針到指定位置,函數(shù)原型為:

voidMove(longnRows,WORDwFetchType=SQL_FETCH_RELATIVE);

throw(CDBException,CMemoryException);

Move函數(shù)參數(shù)說明如表9-4所示。

15)?GetRecordCount()函數(shù)

GetRecordCount函數(shù)用于獲得記錄集中記錄的條目數(shù),其函數(shù)原型為:

LongGetRecordCount();

16)?GetTableName()函數(shù)

GetTableName函數(shù)用于獲得記錄集對應(yīng)的數(shù)據(jù)庫表名稱,其函數(shù)原型為:

ConstCString&GetTableName();

17)?GetSQL()函數(shù)

GetSQL函數(shù)用于獲得記錄集所使用的SQL語句,函數(shù)原型為:

ConstCString&GetSQL();

18)?IsBOF()函數(shù)

IsBOF函數(shù)用于判斷當前記錄集指針的位置是否已到達記錄集的起始位置,函數(shù)原型為:

BOOLIsBOF();

19)?IsEOF()函數(shù)

IsEOF函數(shù)用于判斷當前記錄集指針的位置是否已到達記錄集的最后一條位置,函數(shù)原型為:

BOOLIsEOF();

20)?IsDelete()函數(shù)

IsDelete函數(shù)用于判斷當前記錄集指針的位置是否指向一個已經(jīng)被刪除的記錄位置,函數(shù)原型為:

BOOLIsDelete();

9.2數(shù)據(jù)庫應(yīng)用實例

下面通過一個數(shù)據(jù)庫應(yīng)用實例來學(xué)習(xí)如何創(chuàng)建一個數(shù)據(jù)庫、連接一個數(shù)據(jù)庫并且操作一個數(shù)據(jù)庫的方法。

9.2.1利用Access創(chuàng)建一個數(shù)據(jù)庫

下面將為后面的ODBC應(yīng)用建立一個名為“studentinfo”的Access數(shù)據(jù)庫,操作步驟如下:

(1)進入“MicrosoftAccess”操作界面。

(2)選擇“文件/新建”命令,彈出“新建文件”對話框,單擊“空數(shù)據(jù)庫”,如圖9-2所示。

(3)彈出“文件新建數(shù)據(jù)庫”對話框,在“保存位置”右邊的下拉列表中選擇數(shù)據(jù)庫的保存路徑,這里選擇“d:\visualc++程序教程\第9章”,在“文件名”右邊的編輯框中輸入“sutdentinfo.mdb”為新建數(shù)據(jù)庫命名,單擊“創(chuàng)建”按鈕。

(4)回到“MicrosoftAccess”操作界面,出現(xiàn)了數(shù)據(jù)庫設(shè)計工作區(qū),單擊“設(shè)計”按鈕,如圖9-2所示。

(5)彈出“表1:表”對話框,等待定義數(shù)據(jù)庫表各字段名稱。定義如表9-5所示。圖9-2數(shù)據(jù)庫設(shè)計工作區(qū)

(6)彈出“是否保存對表1的設(shè)計的更改?”提示框,單擊“是”按鈕,如圖9-3所示。

(7)彈出“另存為”對話框,在“表名稱”下的編輯框中輸入“student”,為表命名,單擊“確定”按鈕。

(8)回到數(shù)據(jù)庫設(shè)計工作區(qū),單擊“打開”按鈕,按照各字段,輸入初始客戶學(xué)生信息,如圖9-4所示。圖9-3提示框圖9-4輸入初始學(xué)生信息9.2.2為ODBC數(shù)據(jù)源管理器添加ODBC數(shù)據(jù)庫源

ODBC應(yīng)用程序是連接在ODBC數(shù)據(jù)源上的。本機的數(shù)據(jù)源可以使用控制面板中ODBC數(shù)據(jù)源管理器進行配置。

下面將剛建立的“studentinfo”數(shù)據(jù)庫添加到ODBC數(shù)據(jù)源管理器中。

操作步驟如下:

(1)?Windows桌面上單擊“開始”按鈕。

(2)彈出開始菜單,選擇“設(shè)置/控制面板/管理工具/數(shù)據(jù)源(ODBC)”命令。

(3)彈出“ODBC數(shù)據(jù)源管理器”對話框,選擇“用戶DSN”選項卡,單擊“添加”按鈕,如圖9-5所示。圖9-5“ODBC數(shù)據(jù)源管理器”對話框這里,用戶DSN中給出的是在本地機上的數(shù)據(jù)源;系統(tǒng)DSN中給出的是可以為任何用戶使用的本地數(shù)據(jù)源;文件DSN中給出了數(shù)據(jù)源文件。

(4)彈出“創(chuàng)建新數(shù)據(jù)源”對話框,驅(qū)動程序選擇“MicrosoftAccessDrive(*.mdb)選項,單擊“完成”按鈕,如圖9-6所示。

(5)彈出“ODBCMicrosoftAccess安裝”對話框,在“數(shù)據(jù)源名”右邊的編輯框中輸入“studentinfo”;在“數(shù)據(jù)庫”分組框中單擊“選擇”按鈕,如圖9-7所示。圖9-6“創(chuàng)建新數(shù)據(jù)源”對話框圖9-7“ODBCMicrosoftAccess安裝”對話框

(6)彈出“選擇數(shù)據(jù)庫”對話框,在“驅(qū)動器”下的組合框中選擇創(chuàng)建的“addressbook.mdb”數(shù)據(jù)庫所在的驅(qū)動器符號,在“目錄”下的樹形列表框中選擇數(shù)據(jù)庫所在位置的路徑,這里的路徑為“d:\vc++程序設(shè)計\第9章”,在左邊的列表框中出現(xiàn)該路徑下的所有后綴名為“.mdb”的文件,雙擊“studentinfo.mdb”,單擊“確定”按鈕,如圖9-8所示。

(7)回到“ODBC數(shù)據(jù)源管理器”對話框,選擇“用戶DSN”選項卡,可以在“用戶數(shù)據(jù)源”下的列表框中看到新增加的用戶ODBC數(shù)據(jù)源“studentinfo”,單擊“確定”按鈕,如圖9-9所示。

這樣,就建立了一個名為“addressbook”的用戶ODBC數(shù)據(jù)源。圖9-8“選擇數(shù)據(jù)庫”對話框圖9-9“ODBC數(shù)據(jù)源管理器”對話框9.2.3建立一個帶有ODBC數(shù)據(jù)庫支持功能的單文檔界面工程文件

操作步驟如下:

(1)打開VisualC++6.0,選擇“文件/新建”命令,即彈出“新建”對話框。

(2)在彈出的對話框中,選擇“工程”選項卡,在列表中選擇

,在“位置”中輸入工程建立路徑,在“工程”文本框中輸入工程名“chap9_1”,然后單擊“確定”按鈕。

(3)彈出“MFCAppWizard-Step1”對話框,選擇“單個文檔”,然后選擇“下一個”。

(4)彈出“MFCAppWizard-Step2of6”對話框,選擇“查看數(shù)據(jù)庫不使用文件支持”單選框,單擊“DataSource…”按鈕,如圖9-10所示。圖9-10“MFCAppWizard-Step2of6”對話框

(5)彈出“DatabaseOptions”對話框,在“Datasource”中選中“ODBC”選項,在旁邊的下拉菜單中選中“studentinfo”,如圖9-11所示。

(6)彈出“SelectDatabaseTables”對話框,在列表框中選擇“student”,單擊“OK”按鈕,如圖9-12所示。

(7)彈出“MFCAppWizard-Step2of6”對話框,單擊“完成”按鈕,如圖9-13所示。

這樣就建立了一個ODBC支持的工程文件。圖9-11“DatabaseOptions”對話框圖9-12“SelectDatabaseTables”對話框圖9-13“MFCAppWizard-Step2of6”對話框9.2.4設(shè)計用戶操作主界面

現(xiàn)在已經(jīng)生成了一個帶有數(shù)據(jù)庫支持功能的單文檔界面工程文件,系統(tǒng)自動生成了一個名為“IDD_CHAP9_1_FORM”的對話框,運行時自動顯示。下面就利用該對話框作為用戶操作主界面。

●用戶操作主界面下包含:

●學(xué)生信息瀏覽;

●學(xué)生信息刪除;

●學(xué)生信息添加;

●學(xué)生信息修改。操作步驟如下:

(1)在選項卡中,雙擊文件夾,在展開菜單中選擇對話框。

(2)雙擊對話框,在右邊的對話框編輯區(qū)中利用編輯框、靜態(tài)文本和按鈕設(shè)計主界面,如圖9-14所示。

各功能區(qū)使用控件列表說明如表9-6所示。圖9-14用戶操作主界面設(shè)計表9-6控件列表說明9.2.5實現(xiàn)學(xué)生信息瀏覽功能

建立工程文件時,系統(tǒng)菜單中已經(jīng)自動生成“記錄”菜單,其中包含“第一個記錄”、“前一個記錄”、“下一個記錄”、“最后一個記錄”4個選項,其ID分別對應(yīng)為“ID_RECORD_FIRST”、“ID_RECORD_PREV”、“ID_RECORD_NEXT”、“ID_RECORD_LAST”。

下面就利用這4個選項完成對學(xué)生信息的瀏覽功能,并將結(jié)果在主操作界面的“學(xué)生信息管理系統(tǒng)”功能區(qū)中顯示出來。操作步驟如下:

(1)在主菜單中選擇“查看/建立類向?qū)А薄?/p>

(2)彈出“MFCClassWizard”對話框,選擇“MessageVariables”選項卡;在“Classname”下的組合框中,選擇“CChap9_1View”選項;在“ControlIDs”下的列表框中選擇“IDC_NAME”,單擊“AddVariable...”按鈕,如圖9-15所示。

(3)彈出“AddMemberVariable”對話框,在“Membervariablename”下的組合框中輸入“m_name”,單擊“OK”按鈕,如圖9-16所示。

(4)回到“MFCClassWizard”對話框,可以看到增加了ContrlIDs為IDC_ADDRESS,類型為CString,變量名為m_address的成員變量。

(5)使用同樣的方法添加成員變量,如表9-7所示。圖9-15“MFCClassWizard”對話框圖9-16“AddMemberVariable”對話框

(6)選擇“MFCClassWizard”選項卡,在“Classname”下的組合框中,選擇“CChap9_1View”選項;在“ObjectIDs”下的列表框中選擇“ID_RECORD_FIRST”;在“Messages”下的列表框中選擇“COMMAND”,單擊“AddFunction…”按鈕,如圖9-17所示。

(7)彈出“AddMemberFunction”對話框,單擊“OK”按鈕,如圖9-18所示。

(8)回到“MFCClassWizard”對話框,在“Memberfunctions”下的列表框中已經(jīng)增加了名為“OnRecordFirst”的成員函數(shù),如圖9-19所示。圖9-17“MFCClassWizard”對話框圖9-18“AddMemberFunction”對話框圖9-19添加“OnRecordFirst”成員函數(shù)

(9)用同樣的方法,如表9-8所示添加成員函數(shù)。(10)選擇,修改函數(shù)體內(nèi)容:

voidCChap9_1View::OnRecordFirst()

{

//TODO:Addyourcommandhandlercodehere

m_pSet->MoveFirst();//數(shù)據(jù)庫表記錄集指針移動到數(shù)據(jù)庫起始位置

m_name=m_pSet->m_name;

m_ID=m_pSet->m_ID;

m_grade=m_pSet->m_grade;

m_major=m_pSet->m_major;

m_tel=m_pSet->m_telephone;

UpdateData(FALSE);//將數(shù)據(jù)顯示在編輯框中

}這里,m_pSet為系統(tǒng)自動生成的CRecordset派生類Chap9_1Set的對象指針,使用該指針可以對數(shù)據(jù)庫表中的內(nèi)容進行操作。其中m_pSet->name、m_pSet->m_ID、m_pSet->m_major、m_pSet->m_telephone分別對應(yīng)“studentinfo”數(shù)據(jù)庫表“student”中的name、ID、major、telephone四個字段當前數(shù)據(jù)庫表記錄集指針位置的數(shù)據(jù)。(11)選擇,修改函數(shù)體內(nèi)容:

voidCChap9_1View::OnRecordLast()

{

//TODO:Addyourcommandhandlercodehere

m_pSet->MoveLast();//數(shù)據(jù)庫表記錄集指針移動到數(shù)據(jù)庫起始位置

m_name=m_pSet->m_name;

m_ID=m_pSet->m_ID;

m_grade=m_pSet->m_grade;

m_major=m_pSet->m_major;

m_tel=m_pSet->m_telephone;

UpdateData(FALSE);

}(12)選擇,修改函數(shù)體內(nèi)容:

voidCChap9_1View::OnRecordNext()

{

//TODO:Addyourcommandhandlercodehere

m_pSet->MoveNext();//數(shù)據(jù)庫表記錄集指針當前位置向后移動一條記錄

m_name=m_pSet->m_name;

m_ID=m_pSet->m_ID;

m_grade=m_pSet->m_grade;

m_major=m_pSet->m_major;

m_tel=m_pSet->m_telephone;

UpdateData(FALSE);

}(13)選擇,修改函數(shù)體內(nèi)容:

voidCChap9_1View::OnRecordPrev()

{

//TODO:Addyourcommandhandlercodehere

m_pSet->MovePrev();//數(shù)據(jù)庫表記錄集指針當前位置向前移動一條記錄

m_name=m_pSet->m_name;

m_ID=m_pSet->m_ID;

m_grade=m_pSet->m_grade;

m_major=m_pSet->m_major;

m_tel=m_pSet->m_telephone;

UpdateData(FALSE);

}

(14)選擇菜單“編譯/編譯chap9_1View.cpp”編譯程序,無誤;選擇菜單“編譯/構(gòu)件chap9a.exe”,無誤;選擇菜單“編譯/執(zhí)行chap9_1.exe”,選擇“記錄/下一個記錄”,“學(xué)生信息管理系統(tǒng)”功能區(qū)即出現(xiàn)記錄結(jié)果,如圖9-20所示。圖9-20學(xué)生信息瀏覽運行結(jié)果9.2.6實現(xiàn)學(xué)生信息添加功能

添加記錄操作通過單擊按鈕來完成,下面為按鈕添加BN_CLICKED成員函數(shù)。

(1)在主菜單中選擇“查看/建立類向?qū)А薄?/p>

(2)彈出“MFCClassWizard”對話框,選擇“MessageMaps”選項卡;在“Classname”下的組合框中,選擇“CChap9_1View”選項;在“ObjectIDs”下的列表框中選擇“IDC_ADD”;在“Messages”下的列表框中選擇“BN_CLICKED”,單擊“AddFunction…”按鈕,如圖9-21所示。圖9-21添加BN_CLICKED成員函數(shù)

(3)彈出“AddMemberFuction”對話框,單擊“OK”按鈕,如圖9-22所示。

(4)回到“MFCClassWizard”對話框,在“Memberfunctions”下的列表框中已經(jīng)增加了名為“OnAdd”的成員函數(shù)。

(5)修改函數(shù)體內(nèi)容:

voidCChap9_1View::OnAdd()

{

//TODO:Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE); //將編輯框中的輸入保存到對應(yīng)變量中

m_pSet->AddNew(); //記錄集當前指針位置添加一空白記錄

m_pSet->m_name=m_name; m_pSet->m_ID=m_ID;

m_pSet->m_grade=m_grade;

m_pSet->m_major=m_major;

m_pSet->m_telephone=m_tel;

m_pSet->Update(); //更新記錄

m_pSet->MoveLast(); //數(shù)據(jù)庫記錄集指針移動到最后一條記錄

m_pSet->Requery(); //重新排序

}

(6)選擇菜單“編譯/編譯chap9_1View.cpp”編譯程序,無誤;選擇菜單“編譯/構(gòu)件chap9_1.exe”,無誤;選擇菜單“編譯/執(zhí)行chap9_1.exe”,在對應(yīng)的編輯框中輸入對應(yīng)信息,單擊

按鈕,如圖9-23所示。圖9-23增加學(xué)生成績信息操作

(7)選擇菜單“記錄/最后一個記錄”,在“成績?yōu)g覽”功能區(qū)顯示增加的新記錄,如圖9-24所示。圖9-24瀏覽最后一個記錄9.2.7實現(xiàn)學(xué)生信息刪除功能

對學(xué)生信息的刪除操作是通過單擊按鈕,對當前顯示的記錄進行刪除。

操作步驟如下:

(1)選擇菜單“查看/建立類向?qū)А薄?/p>

(2)彈出“MFCClassWizard”對話框,選擇“MessageMaps”選項卡;在“Classname”下的組合框中,選擇“CChap9aView”選項;在“ObjectIDs”下的列表框中選擇“IDC_DELETE”;在“Messages”下的列表框中選擇“BN_CLICKED”,單擊“AddFunction…”按鈕,彈出“AddMemberFu

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論