Visual C++程序設(shè)計教程(第二版)課件:訪問數(shù)據(jù)庫和文件讀寫_第1頁
Visual C++程序設(shè)計教程(第二版)課件:訪問數(shù)據(jù)庫和文件讀寫_第2頁
Visual C++程序設(shè)計教程(第二版)課件:訪問數(shù)據(jù)庫和文件讀寫_第3頁
Visual C++程序設(shè)計教程(第二版)課件:訪問數(shù)據(jù)庫和文件讀寫_第4頁
Visual C++程序設(shè)計教程(第二版)課件:訪問數(shù)據(jù)庫和文件讀寫_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

訪問數(shù)據(jù)庫和文件讀寫

10.1MFC提供的數(shù)據(jù)庫訪問類 VisualC++的MFC類庫中集成了許多ODBC類。當(dāng)使用AppWizard創(chuàng)建一個數(shù)據(jù)庫應(yīng)用程序時,在該程序中就已經(jīng)加入了許多不同的ODBC類,例如CDatabase、CRecordset、CRecordView、CDBException和CFieldExchange,其中最重要的是CDatabase、CRecordset、CRecordView這三個類。這些類封裝了ODBCSDK函數(shù),從而使用戶可以無需了解SDK函數(shù)就可以很方便地操作支持ODBC的數(shù)據(jù)庫。10.1.1CDatabase類MFCCDatabase類封裝了應(yīng)用程序與需要訪問的數(shù)據(jù)庫之間的連接,控制事務(wù)的提交和執(zhí)行SQL語句的方法。主要用來與一個數(shù)據(jù)源相連。OpenEx()函數(shù)

為了創(chuàng)建一個新的CDatabase,并與一個數(shù)據(jù)庫連接,可以建立一個新的CDatabase對象,且調(diào)用它的OpenEx()成員:

virtualBOOLOpenEx(LPCTSTRlpszConnectString,DWORDdwOptions=0);Open()函數(shù)除了OpenEx()函數(shù),CDatabase提供了Open(),它用同樣的方式打開數(shù)據(jù)庫,但使用不同的參數(shù)形式,調(diào)用方法如下:virtualBOOLOpen(LPCTSTRlpszDSN,BOOLbExclusive=FALSE,BOOLbReadOnly=FALSE,LPCTSTRlpszConnect=”O(jiān)DBC”,BOOLbUseCursorLib=TRUE);Close()函數(shù)Close()函數(shù)用來關(guān)閉數(shù)據(jù)源的連接。不管是用OpenEx()函數(shù),還是用Open()函數(shù)打開了數(shù)據(jù)庫,結(jié)束時都應(yīng)該調(diào)用CDatabase::Close(),關(guān)閉對數(shù)據(jù)源的連接。

用CDatabase執(zhí)行SQL語句

通過調(diào)用CDatabase::ExecuteSQL()函數(shù),可以執(zhí)行SQL語句,函數(shù)的調(diào)用格式如下:

voidExecuteSQL(LPCSTRlpszSQL);函數(shù)只帶有一個參數(shù),就是傳給lpszSQL的SQL字符串,并對數(shù)據(jù)源執(zhí)行該函數(shù)。這里要注意的是ExecuteSQL()函數(shù)沒有返回值。如果SQL語句失敗,就會出現(xiàn)CDBException類型的異常。

用CDatabase進(jìn)行事務(wù)處理CDatabase類可以處理數(shù)據(jù)庫連接中的事務(wù)。事務(wù)允許用戶把一些SQL語句作為一個單獨操作執(zhí)行,如果在事務(wù)中一個語句出錯,那么其他語句也會停止執(zhí)行。調(diào)用CDatabase::BeginTrans()函數(shù)可以開始使用一個MFCODBC類的事務(wù)。然后就可以調(diào)用CDatabase::ExecuteSQL()函數(shù)來執(zhí)行組成這個事務(wù)的操作,或者使用從這個CDatabase中派生出的CRecordset對象執(zhí)行這些操作。10.1.2CRecordset類CRecordset類封裝了大部分操縱數(shù)據(jù)庫的方法,包括瀏覽、修改記錄,控制游標(biāo)移動,排序等操作。在開始處理一個記錄集之前,需要構(gòu)建一個新的CRecordset對象,然后調(diào)用該對象的Open()成員以打開記錄集。10.1.2CRecordset類(續(xù))CRecordset類封裝了大部分操縱數(shù)據(jù)庫的方法,包括瀏覽、修改記錄,控制游標(biāo)移動,排序等操作。在開始處理一個記錄集之前,需要構(gòu)建一個新的CRecordset對象,然后調(diào)用該對象的Open()成員以打開記錄集。調(diào)用的格式如下:

virtualBOOLOpen(UNITnOpenType=AFX_DB_USE_DEFAULT_TYPE,

LPCTSTRlpszSQL=NULL,

DWORDdwOptions=none);

記錄集類型 CRecordset類對象提供了從數(shù)據(jù)源中提取出的記錄集。CRecordset對象通常用于兩種形式:動態(tài)行集(dynasets)和快照集(snapshots)。動態(tài)行集能保持與其他用戶所做的更改保持同步,快照集則是數(shù)據(jù)的一個靜態(tài)視圖。每一種形式在記錄集被打開時都提供一組記錄,所不同的是,當(dāng)在一個動態(tài)行集里滾動到一條記錄時,由其他用戶或是應(yīng)用程序中的其他記錄集對該記錄所做的更改會相應(yīng)地顯示出來。

記錄集內(nèi)容 CRecordset::Open()中l(wèi)pszSQL參數(shù)定義了為記錄集而取回數(shù)據(jù)的類型。

記錄集選項

最后一個CRecordset::Open()的參數(shù)允許用戶指定幾個不同的記錄集選項。dwOption是一個可能包含許多不同常量聯(lián)合的位圖。

關(guān)閉記錄集

當(dāng)完成了對一個記錄集的操作以后,應(yīng)該調(diào)用CRecordset::Close()進(jìn)行關(guān)閉。調(diào)用Close()后,如果想再次打開記錄集,可以重新調(diào)用Open()。10.1.3CRecordView類CRecordView類提供了與recordset對象相連接的視,可以建立視中的控件與數(shù)據(jù)庫數(shù)據(jù)的對應(yīng),同時支持移動游標(biāo),修改記錄等操作。正如其他對話類型一樣,CRecordView類使用一個對話模板以定義視窗的布局。在實際操作中,可以用手工操作來為CRecordView類派生出一個新的類,但使用ClassWizard更加容易。10.1.4CDBException類 CDBException類提供了對數(shù)據(jù)庫操作的異常處理,可以獲得操作異常的相關(guān)返回代碼。10.1.5CFieldExchange類CFieldExchange類提供了用戶變量與數(shù)據(jù)庫字段之間的數(shù)據(jù)交換,如果不需要使用自定義類型,將不用直接調(diào)用該類的函數(shù),MFCWizard將自動為程序員建立連接。10.2建立、連接數(shù)據(jù)源

數(shù)據(jù)源是應(yīng)用程序與數(shù)據(jù)庫系統(tǒng)連接的橋梁,它為ODBC應(yīng)用程序制定運行數(shù)據(jù)庫系統(tǒng)的服務(wù)器名稱,以及用戶的缺省連接參數(shù)等,所以在開發(fā)ODBC應(yīng)用程序時應(yīng)首先建立數(shù)據(jù)源。ODBC驅(qū)動程序可以建立、配置或刪除數(shù)據(jù)源,并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)驅(qū)動程序。10.2.1啟動ODBC驅(qū)動程序

數(shù)據(jù)源是應(yīng)用程序與數(shù)據(jù)庫系統(tǒng)連接的橋梁,它為ODBC應(yīng)用程序制定運行數(shù)據(jù)庫系統(tǒng)的服務(wù)器名稱,以及用戶的缺省連接參數(shù)等,所以在開發(fā)ODBC應(yīng)用程序時應(yīng)首先建立數(shù)據(jù)源。

ODBC驅(qū)動程序可以建立、配置或刪除數(shù)據(jù)源,并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)驅(qū)動程序。10.2.1啟動ODBC驅(qū)動程序

從控制面板的管理工具中雙擊“數(shù)據(jù)源(ODBC)”圖標(biāo),啟動ODBC驅(qū)動程序,其管理器的界面如圖10.1所示:10.2.2建立數(shù)據(jù)源

建立數(shù)據(jù)源,首先要了解系統(tǒng)是否已經(jīng)安裝了所要操作的數(shù)據(jù)庫的驅(qū)動程序,從ODBC驅(qū)動程序管理器中選擇“驅(qū)動程序”選項卡,如圖10.2所示:它顯示了系統(tǒng)目前所安裝的所有數(shù)據(jù)庫驅(qū)動程序??梢园慈缦虏襟E使用驅(qū)動程序管理器建立數(shù)據(jù)源:

10.2.2建立數(shù)據(jù)源(續(xù))在圖10.1所示的驅(qū)動程序管理器窗口中選擇“添加”按鈕,打開“創(chuàng)建新數(shù)據(jù)源”對話框,如圖10.3在所列出的驅(qū)動程序中選擇正確的驅(qū)動程序以后,單擊“完成”按鈕,進(jìn)入下一步,如圖10.4輸入數(shù)據(jù)源的名字以及說明文字,單擊“選擇(S)”按鈕,彈出如圖10.5所示的對話框,在系統(tǒng)中找到所要訪問的數(shù)據(jù)庫。單擊“確定”按鈕,返回到圖10.4中配置數(shù)據(jù)源的對話框,再單擊“確定”按鈕,在“用戶DSN”選項卡中可以看到相應(yīng)的數(shù)據(jù)源。關(guān)閉數(shù)據(jù)源對話框。這樣便建立一個新的數(shù)據(jù)源,ODBC應(yīng)用程序可使用它來訪問數(shù)據(jù)庫系統(tǒng)。10.3建立訪問數(shù)據(jù)庫的應(yīng)用程序

在創(chuàng)建一個數(shù)據(jù)庫應(yīng)用程序之前,必須先注冊被作為數(shù)據(jù)源并能通過ODBC驅(qū)動程序進(jìn)行訪問的數(shù)據(jù)庫。10.3.1建立并連接數(shù)據(jù)庫

在開始本實例之前,運用MicrosoftAccess2000建立了數(shù)據(jù)庫student.mdb,文件存放在C:\EXAMPLES目錄下。按照在10.2節(jié)中介紹的步驟建立和連接數(shù)據(jù)庫源。配置圖如10.6所示。10.3.2創(chuàng)建訪問數(shù)據(jù)庫的應(yīng)用程序下面開始創(chuàng)建訪問數(shù)據(jù)庫的應(yīng)用程序。運行AppWizard創(chuàng)建單文檔工程Eg10_1。在DatabaseOptions對話框中,確定使用的數(shù)據(jù)源類型為ODBC。在對話框中單擊OK按鈕,彈出SelectDatabaseTables對話框,選擇數(shù)據(jù)庫中的表。在MFCAppWizardStep2of6的“DataSource”按鈕下面顯示了已經(jīng)選擇的數(shù)據(jù)源。由于AppWizard后面的步驟都接受缺省設(shè)置,所以在這一步可以單擊“finish”按鈕創(chuàng)建應(yīng)用程序框架Eg10_2。編譯、鏈接和運行程序,會出現(xiàn)圖10.11所示的窗口。在屏幕上看不到任何內(nèi)容,因為還沒有任何顯示數(shù)據(jù)庫表中記錄的控件。10.4實現(xiàn)數(shù)據(jù)訪問在創(chuàng)建完應(yīng)用程序的外觀后,可以發(fā)現(xiàn)其實現(xiàn)功能是相當(dāng)有限的,還不能對數(shù)據(jù)庫表中的內(nèi)容進(jìn)行訪問。10.4.1設(shè)計主窗體下面來設(shè)計程序的主窗體,實現(xiàn)數(shù)據(jù)訪問。在工作區(qū)中選擇ResourceView選項卡來顯示應(yīng)用程序的資源。單擊Eg10_1resources文件夾旁“+”號打開資源目錄,再按同樣的方法打開Dialog資源文件夾,雙擊IDD_EG10_1_FORM對話框ID,在資源編輯器中打開對話框。刪除對話框中央的靜態(tài)字符串“TODO:在這個對話框里設(shè)置表格控制?!薄S脤υ捒蚓庉嬈鞯木庉嫻ぞ邉?chuàng)建如圖10.12所示的主窗體對話框。其中各控件的屬性見表10.1。10.4.2添加變量選擇View|ClassWizard,運行ClassWizard,單擊MemberVariable選項卡。在Classname下拉列表中選擇CEg10_1Set。會看到在下面的列表中AppWizard已經(jīng)自動將數(shù)據(jù)庫表中的各個字段綁定到了一個特定的變量中??梢孕薷母髯侄螌?yīng)的變量名:單擊“Deletevariable”按鈕刪除現(xiàn)有變量,然后按照圖10.13所示的對應(yīng)關(guān)系使用“AddVariable”按鈕增加變量。10.4.3運行應(yīng)用程序

編輯、鏈接及運行應(yīng)用程序,現(xiàn)在生成了一個用于顯示表student數(shù)據(jù)的窗口,可以顯示所有的記錄。如圖10.15所示。使用工具欄上的控件或者“記錄”菜單中的命令,可以從表中的一條記錄轉(zhuǎn)移到另一條記錄。在瀏覽過程中,如果要修改某一條記錄,只需簡單地改變記錄中的內(nèi)容即可。將記錄指針移到另一條記錄時,系統(tǒng)自動地更新修改過的記錄。10.5增加和刪除記錄

在這一節(jié)中,為應(yīng)用程序Eg10_1添加一些對記錄進(jìn)行的基本操作:增加新記錄、刪除記錄。這兩個功能的實現(xiàn)可以借助CRecordset類提供的不同的成員函數(shù),表10.2列出了一些與實現(xiàn)上述功能相關(guān)的函數(shù)。10.5.1增加新記錄

如果要在數(shù)據(jù)庫中增加一條新記錄,可以調(diào)用AddNew函數(shù)。通常要使用以下的代碼序列://增加新記錄m_pSet.AddNew();//把記錄保存到數(shù)據(jù)庫中m_pSet.Update();//更新記錄集,可以對新記錄進(jìn)行瀏覽并允許用戶對它進(jìn)行編輯m_pSet.Requery();10.5.2刪除記錄

而要實現(xiàn)刪除當(dāng)前記錄時,通常要使用以下的代碼序列://刪除當(dāng)前記錄m_pSet.Delete();//移動到下一條記錄m_pSet.MoveNext();在調(diào)用Delete函數(shù)刪除了當(dāng)前記錄后,就需要瀏覽到另外一條記錄,使它變成新的當(dāng)前記錄。10.5.3編輯記錄

為了允許用戶對當(dāng)前記錄進(jìn)行編輯,需要調(diào)用Edit函數(shù)。對當(dāng)前記錄編輯完畢,就需要調(diào)用Update函數(shù)來保存所做的修改。代碼序列如下://允許用戶編輯當(dāng)前記錄m_pSet.Edit();//執(zhí)行所有的數(shù)據(jù)交換,以更新記錄集中的字段…//保存用戶對當(dāng)前記錄所做的修改m_pSet.Update();10.5.4添加處理記錄的功能下面是具體的操作步驟:編輯菜單欄設(shè)計工具欄按鈕添加成員變量m_bAddMode和虛成員函數(shù)OnMove()為菜單項添加消息處理函數(shù)添加兩個消息成員函數(shù)及OnMove函數(shù)編譯、鏈接和運行10.6程序分析OnRecordAdd()函數(shù)分析

該函數(shù)先調(diào)用CEg10_1Set類的成員函數(shù)AddNew()。成員函數(shù)AddNew()建立一個可以填充字段內(nèi)容的新記錄,但這個新記錄并不直接顯示在屏幕上,直至視窗的UpdateData()函數(shù)被調(diào)用以后,新的空記錄才顯示在屏幕上。所以,還要解決一些其它問題。在創(chuàng)建一條新記錄之后,需要對數(shù)據(jù)庫進(jìn)行更新,通過在應(yīng)用程序中設(shè)置一個標(biāo)志m_bAddMode,用來確定是從數(shù)據(jù)庫中刪除一條記錄還是向數(shù)據(jù)庫增加一條新記錄。當(dāng)用戶輸入一條新記錄時,要改變“學(xué)號”字段的內(nèi)容,但由于該字段被設(shè)置為只讀狀態(tài),為了改變控件的只讀狀態(tài),程序首先通過GetDlgItem()函數(shù)取得控件的指針,然后調(diào)用控件的SetReadOnly()成員函數(shù)把只讀狀態(tài)改為FALSE,最后調(diào)用UpdateData()函數(shù)顯示新的空白記錄。OnRecordDelete()函數(shù)分析

刪除一條記錄比較簡單,OnRecordDelete函數(shù)只需調(diào)用記錄集的Delete函數(shù)。一個記錄被刪除以后,調(diào)用記錄集的MoveNext函數(shù)能移到要顯示的下一條記錄。有兩種特殊的情況要考慮:第一,當(dāng)被刪除記錄為數(shù)據(jù)庫中的最后一條記錄時,調(diào)用記錄集的IsEOF函數(shù)來確定該記錄是否在數(shù)據(jù)庫的末尾,如果調(diào)用IsEOF返回TRUE,則記錄集需要重新定位于數(shù)據(jù)庫中的最后一條記錄。而記錄集的MoveLast函數(shù)可完成這一任務(wù)。第二,當(dāng)記錄集中所有的記錄都被刪除了以后,記錄的指針移到記錄集的IsBOF函數(shù)測試記錄指針是否在記錄集的開頭。如果該函數(shù)返回TRUE,則程序設(shè)置記錄的字段為NULL。OnMove()函數(shù)分析CRecordView類實現(xiàn)了默認(rèn)的移動數(shù)據(jù)操作。在Eg10_1應(yīng)用程序中,已經(jīng)提供了四個移動操作:移動到第一個記錄、移到前一個記錄、移到下一個記錄和移到最后一個記錄。這四個移動操作在菜單和工具欄中都有體現(xiàn)。CRecordView類中實現(xiàn)了OnMove()函數(shù),用戶可以在需要時自行實現(xiàn)移動操作。其函數(shù)原形為:virtualBOOLOnMove(UINTnIDMoveCommand);

throw(CDBException);CRecordView類

在ClassWizard創(chuàng)建的CRecordView類派生類中帶有一個CRecordset類的成員變量(在Eg10_1View.h頭文件中可以找到下面的代碼):public:CEg10_1Set*m_pSet;m_pSet變量用于指向與CRecordView類相關(guān)聯(lián)的記錄集。在構(gòu)造函數(shù)中將變量的初始值設(shè)置為NULL,下面是在Eg10_1View.cpp文件中的代碼:CEg10_1View::CEg10_1View() :CRecordView(CEg10_1View::IDD){ //{{AFX_DATA_INIT(CEg10_1View) m_pSet=NULL; //}}AFX_DATA_INIT

m_bAddMode=FALSE;}CRecordView類(續(xù))voidCEg10_1View::OnInitialUpdate(){ m_pSet=&GetDocument()->m_eg10_1Set; CRecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit();}CRecordset*CEg10_1View::OnGetRecordset(){ returnm_pSet;}

對話框數(shù)據(jù)交換DDXvoidCEg10_1View::DoDataExchange(CDataExchange*pDX){ CRecordView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CEg10_1View) DDX_FieldText(pDX,IDC_ENGLISH,m_pSet->m_English,m_pSet); DDX_FieldText(pDX,IDC_MATHS,m_pSet->m_Maths,m_pSet); DDX_FieldText(pDX,IDC_NAME,m_pSet->m_Name,m_pSet); DDX_FieldText(pDX,IDC_STUNO,m_pSet->m_Stuno,m_pSet); //}}AFX_DATA_MAP}CRecordset類MFC使用記錄字段交換(RecordFieldeXchange,RFX)機(jī)制進(jìn)行CRecordset類的派生類中的成員變量與數(shù)據(jù)源記錄的交互。在AppWizard生成的CEg10_1Set類的定義中包含了如下語句(在Eg10_1Set.h頭文件中):

//Field/ParamData //{{AFX_FIELD(CEg10_1Set,CRecordset) long m_Maths; CString m_Name; long m_Stuno; long m_English; //}}AFX_FIELDCRecordset類(續(xù))

使用AFX_FIELD宏標(biāo)識了CEg10_1Set類的成員變量。在CEg10_1Set類的構(gòu)造函數(shù)中為這些參數(shù)進(jìn)行了初始化,函數(shù)中用AFX_FIELD_INIT宏標(biāo)識了對數(shù)據(jù)進(jìn)行初始化的語句:CEg10_1Set::CEg10_1Set(CDatabase*pdb) :CRecordset(pdb) { //{{AFX_FIELD_INIT(CEg10_1Set) m_Maths=0; m_Name=_T(""); m_Stuno=0; m_English=0; m_nFields=4; //}}AFX_FIELD_INIT m_nDefaultType=snapshot; }CRecordset類(續(xù))

在處理數(shù)據(jù)庫中的記錄集之前,需要為CRecordset對象打開記錄集。在Eg10_1程序中,AppWizard重載了GetDefaultSQL()函數(shù):CStringCEg10_1Set::GetDefaultSQL(){ return_T("[student]");}此外,ClassWizard還重載了DoFieldExchange()函數(shù)用于數(shù)據(jù)的交換:voidCEg10_1Set::DoFieldExchange(CFieldExchange*pFX){ //{{AFX_FIELD_MAP(CEg10_1Set) pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Long(pFX,_T("[數(shù)學(xué)]"),m_Maths); RFX_Text(pFX,_T("[姓名]"),m_Name); RFX_Long(pFX,_T("[學(xué)號]"),m_Stuno); RFX_Long(pFX,_T("[英語]"),m_English); //}}AFX_FIELD_MAP}

記錄字段交換(RFX)

通過使用RFX,MFC框架可以在數(shù)據(jù)庫和CRecordset變量之間來回移動數(shù)據(jù)。對于CRecordset類,交換是通過執(zhí)行DoFieldExchange()函數(shù)來建立的,大量的執(zhí)行將使用一組由MFC提供用來定義RFX的宏。MFC為不同的數(shù)據(jù)類型提供了不同的RFX_宏。表10.4列出了可用的RFX_宏和它們用到的成員變量的數(shù)據(jù)類型。10.7文件的讀寫

在編寫應(yīng)用程序時,可以使用標(biāo)準(zhǔn)的C或C++語言中的文件操作函數(shù)。對于簡單的數(shù)據(jù)格式一般采用文件的讀寫形式。這主要是簡單、直觀、易維護(hù)等特點。10.7.1intfopen(stringfilename,stringmode)函數(shù)

用來打開本地或者遠(yuǎn)端的文件。若參數(shù)filename為“http://......”,則函數(shù)利用HTTP1.0協(xié)議與服務(wù)器連接,文件指針則指到服務(wù)器返回文件的起始處。此外,函數(shù)可以用來打開本地的文件,文件的指針則指向打開的文件。若打開文件失敗,則返回false值。10.7.2intfseek(intfp,intoffset,[,intwhence])函數(shù)

移動文件指針。函數(shù)將文件fp的指針移到新位置,新位置是從文件頭開始以字節(jié)數(shù)度量,以whence指定的位置加上offset。成功則返回0,失敗則返回-1值。10.7.3intrewind(intfp)函數(shù)

重置文檔的讀寫位置指針。函數(shù)重置文件的讀寫位置指針到文件的開頭處,發(fā)生錯誤則返回0。文件fp必須是有效且用fopen()打開的文件。10.7.4fread函數(shù)和fwrite函數(shù)用來讀寫一個數(shù)據(jù)塊,一般用于二進(jìn)制文件的輸入和輸出。fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);buffer:是一個指針,對fread來說,它是讀入數(shù)據(jù)的存放地址。對fwrite來說,是要輸出數(shù)據(jù)的地址;size:要讀寫的字節(jié)數(shù);count:要進(jìn)行讀寫多少個size字節(jié)的數(shù)據(jù)項;fp:文件型指針。10.7.5序列化

序列化(Serialize)是指對象可以被持續(xù),即當(dāng)應(yīng)用程序退出時它們可以被存盤,而當(dāng)應(yīng)用程序啟動時它們又可以被恢復(fù),對象的這種存盤和恢復(fù)處理過程就稱為“序列化”。在MFC庫中,不能利用序列化來代替數(shù)據(jù)庫管理系統(tǒng),與文檔相關(guān)的所有對象只能在某個單獨的磁盤文件中進(jìn)行順序讀和寫,并不支持對象在磁盤中的隨機(jī)存取。

MFC使用CArchive類對象作為執(zhí)行序列化對象和存儲介質(zhì)之間的中繼。在MFCAppWizard自動生成的程序框架時,如果在MFCAppWizard-Step1對話框中選擇了Document/Viewarchitecturesupport,將會在自動生成的程序中支持Cdocument派生類的成員函數(shù)Serialize的操作,文件的序列化操作都是在Cdocument派生類的成員函數(shù)Serialize中完成的。10.7.5序列化(續(xù))其結(jié)構(gòu)如下:voidCEg2_1Doc::Serialize(CArchive&ar){ if(ar.IsStoring()) { //TODO:addstoringcodehere }

溫馨提示

  • 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

提交評論