第9章數(shù)據(jù)庫編程_第1頁
第9章數(shù)據(jù)庫編程_第2頁
第9章數(shù)據(jù)庫編程_第3頁
第9章數(shù)據(jù)庫編程_第4頁
第9章數(shù)據(jù)庫編程_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第9章數(shù)據(jù)庫編程

9.1數(shù)據(jù)庫概述

9.2ODBC數(shù)據(jù)庫編程

9.3數(shù)據(jù)庫編程常用技巧

9.4數(shù)據(jù)庫相關(guān)的ActiveX控件

9.1數(shù)據(jù)庫概述

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

數(shù)據(jù)庫是指以一定的組織形式存放在計算機存儲介質(zhì)上的相互關(guān)聯(lián)的數(shù)據(jù)的集合。例如,把一個學校的教師、學生和課程等數(shù)據(jù)有序地組織起來,存儲在計算機磁盤上,就構(gòu)成了一個數(shù)據(jù)庫。 為了有效地管理數(shù)據(jù)庫,常常需要一些數(shù)據(jù)庫管理系統(tǒng)(DBMS)為用戶提供對數(shù)據(jù)庫操作的各種命令、工具及方法,包括數(shù)據(jù)庫的建立和記錄的輸入、修改、檢索、顯示、刪除和統(tǒng)計等。流行的DBMS都提供了一個SQL接口。

SQL

作為用來在DBMS中訪問和操作的語言,SQL(結(jié)構(gòu)化查詢語言)語句分為兩類:一是DDL(DataDefinitionLanguage,數(shù)據(jù)定義語言)語句,它是用來創(chuàng)建表、索引等,另一是DML(DataManipulationLanguage,數(shù)據(jù)操作語言)語句,這些語句是用來讀取數(shù)據(jù)、更新數(shù)據(jù)和執(zhí)行其他類似操作的語句。

9.1數(shù)據(jù)庫概述ODBC、DAO和OLEDB

ODBC(開放數(shù)據(jù)庫連接)、DAO(數(shù)據(jù)訪問對象)及OLEDB(OLE數(shù)據(jù)庫)三種數(shù)據(jù)庫方式,使應(yīng)用程序從特定的數(shù)據(jù)管理系統(tǒng)(DBMS)脫離出來。

ODBC提供應(yīng)用程序接口(API),使任何一個數(shù)據(jù)庫都可以通過ODBC驅(qū)動器與指定的DBMS相聯(lián)。程序就可通過調(diào)用ODBC驅(qū)動管理器中相應(yīng)的驅(qū)動程序達到管理數(shù)據(jù)庫的目的。

DAO使用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ù)訪問接口,并能處理除了標準關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)之外,還能處理包括郵件數(shù)據(jù)、Web上的文本或圖形、目錄服務(wù)以及主機系統(tǒng)中的IMS和VSAM數(shù)據(jù)。

OLEDB提供一個數(shù)據(jù)庫編程COM接口,使得數(shù)據(jù)的使用者可以使用同樣的方法訪問各種數(shù)據(jù),而不用考慮數(shù)據(jù)的具體存儲地點、格式或類型。這個COM接口與ODBC相比,其健壯性和靈活性要高得多。

9.2ODBC數(shù)據(jù)庫編程

9.2.1MFCAppWizard使用ODBC一般過程

構(gòu)造數(shù)據(jù)庫 數(shù)據(jù)庫表與表之間的關(guān)系構(gòu)成了一個數(shù)據(jù)庫。用MicrosoftAccess創(chuàng)建一個數(shù)據(jù)庫Student.mdb,暫包含一個數(shù)據(jù)表score,如表。在表中包括上、下兩部分內(nèi)容,上部分是數(shù)據(jù)表的記錄內(nèi)容,下部分是數(shù)據(jù)表的結(jié)構(gòu)內(nèi)容。

9.2ODBC數(shù)據(jù)庫編程創(chuàng)建ODBC數(shù)據(jù)源

如果沒有ODBC組件,當安裝VisualC++的同時也會裝上ODBC程序。它不是出現(xiàn)在程序組中,出現(xiàn)在系統(tǒng)的“控制面板”管理工具中,如圖。

雙擊ODBC圖標,進入ODBC數(shù)據(jù)源管理器??梢栽O(shè)置ODBC數(shù)據(jù)源的一些信息?!坝脩鬌SN”頁面是定義自己在本地計算機使用的數(shù)據(jù)源名,如圖。

9.2ODBC數(shù)據(jù)庫編程創(chuàng)建用戶DSN的過程如下。(1)

單擊[添加],在對話框中選擇要添加用戶數(shù)據(jù)源的驅(qū)動程序,這里選擇“MicrosoftAccessDriver”,如圖。(2)單擊[完成],單擊[選擇]按鈕將前面創(chuàng)建的數(shù)據(jù)庫調(diào)入,如圖。

9.2ODBC數(shù)據(jù)庫編程

(3)單擊[確定],剛才創(chuàng)建的用戶數(shù)據(jù)源被添加在“ODBC數(shù)據(jù)源管理器”的“用戶數(shù)據(jù)源”列表中。如圖。

9.2ODBC數(shù)據(jù)庫編程在MFCAppWizard中選擇數(shù)據(jù)源

用MFCAppWizard創(chuàng)建一個支持數(shù)據(jù)庫的文檔應(yīng)用程序,如下面的過程。(1)

用MFCAppWizard創(chuàng)建一個單文檔應(yīng)用程序Ex_ODBC。(2)

在向?qū)У牡?步對話框中加入數(shù)據(jù)庫的支持,如圖。

9.2ODBC數(shù)據(jù)庫編程 在對話框中可以選擇對數(shù)據(jù)庫的不同支持,其中各選項的含義如表。

9.2ODBC數(shù)據(jù)庫編程

(3)選中“數(shù)據(jù)庫查看使用文件支持”項,單擊[DataSource],從中選擇ODBC的數(shù)據(jù)源“DatabaseExampleForVC++”,如圖。

(4)單擊[OK],如圖,從中選擇要使用的表score。

9.2ODBC數(shù)據(jù)庫編程(5)

單擊[OK],又回到了向?qū)У牡?步對話框。(6)

單擊[完成]。開發(fā)環(huán)境自動打開表單視圖CEx_ODBCView的對話框資源模板IDD_EX_ODBC_FORM以及相應(yīng)的對話框編輯器。(7)

編譯并運行,如圖。

記錄瀏覽按鈕9.2ODBC數(shù)據(jù)庫編程設(shè)計瀏覽記錄界面

按照圖所示的布局,為表單對話框資源模板添加所表所示的控件。

9.2ODBC數(shù)據(jù)庫編程 (2)按快捷鍵Ctrl+W,切換到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.2ODBC數(shù)據(jù)庫編程

(3)按照上一步驟的方法,為下表的其他控件依次添加相關(guān)聯(lián)的成員變量??丶兞康姆秶痛笮?yīng)與數(shù)據(jù)表中的字段一一對應(yīng)。如圖。

9.2ODBC數(shù)據(jù)庫編程 (4)編譯運行并測試,如圖。

9.2ODBC數(shù)據(jù)庫編程9.2.2ODBC數(shù)據(jù)表更新

在生成的CEx_ODBCView類中,包含一個指向CEx_ODBCSet對象的指針m_pSet。該指針與用戶的表相關(guān)聯(lián),是由MFCAppWizard建立的,當數(shù)據(jù)表的字段更新后,例如,若Access將score數(shù)據(jù)表添加一個“備注”字段名,并關(guān)閉Access后,就需要為Ex_ODBC重新來指定數(shù)據(jù)表,其步驟如下:(1)按快捷鍵Ctrl+W,切換到“MemberVariables”頁面。(2)在“Classname”的下拉列表中選擇“CEx_ODBCSet”,如圖。[UpdateColumns]重新指定與CRecordSet類相關(guān)的表,[BindAll]指定表的字段的綁定,即為字段重新指定默認的關(guān)聯(lián)變量。

9.2ODBC數(shù)據(jù)庫編程

(3)單擊[UpdateColumns],選擇ODBC數(shù)據(jù)源“DatabaseExampleForVC++”,如圖。

(4)單擊[OK],如圖,從中選擇要使用的表。

9.2ODBC數(shù)據(jù)庫編程 (5)單擊[OK],如圖。

(6)單擊[BindAll],MFCWizard將自動為字段落添加相關(guān)聯(lián)的變量。需要說明的是,在按[BindAll]按鈕綁定前最好將已有的字段關(guān)聯(lián)變量刪除,以保證數(shù)據(jù)表字段名更改或刪除后與變量綁定的正確性。

9.2ODBC數(shù)據(jù)庫編程9.2.3CRecordSet類基本操作

查詢記錄

先看一個示例,該示例在前面的Ex_ODBC的表單中添加一個編輯框和一個[查詢]按鈕,單擊[查詢],將按編輯框中的學號內(nèi)容對數(shù)據(jù)表進行查詢,并將查找到的記錄顯示在前面添加的控件中。示例的過程如下:

(1)打開Ex_ODBC應(yīng)用程序的表單資源,按圖8所示的布局添加控件,其中添加的編輯框ID號設(shè)為IDC_EDIT_QUERY,“查詢”按鈕的ID號設(shè)為IDC_BUTTON_QUERY。

9.2ODBC數(shù)據(jù)庫編程(2)打開MFCClassWizard,為控件IDC_EDIT_QUERY添加關(guān)聯(lián)變量m_strQuery。(3)

在CEx_ODBCView類中添加按鈕控件IDC_BUTTON_QUERY的BN_CLICKED消息映射,在映射函數(shù)中添加代碼:

voidCEx_ODBCView::OnButtonQuery() { UpdateData(); m_strQuery.TrimLeft(); if(m_strQuery.IsEmpty()) { MessageBox("要查詢的學號不能為空!");

return; } if(m_pSet->IsOpen()) m_pSet->Close(); //如果記錄集打開,則先關(guān)閉

m_pSet->m_strFilter.Format("studentno='%s'",m_strQuery); //studentno是score表的字段名,用來指定查詢條件

m_pSet->m_strSort="course"; //course是score表的字段名,用來按course字段從小到大排序

m_pSet->Open(); if(!m_pSet->IsEOF()) //如果打開記錄集有記錄

UpdateData(FALSE); //自動更新表單中控件顯示的內(nèi)容

else MessageBox("沒有查到你要找的學號記錄!"); }9.2ODBC數(shù)據(jù)庫編程 (4)編譯運行并測試,如圖。

9.2ODBC數(shù)據(jù)庫編程增加記錄

增加記錄是使用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(); //刷新記錄集,這在快照集方式下是必須的

刪除記錄

可以直接使用CRecordSet::Delete函數(shù)來刪除記錄。要使刪除操作有效,還需要移動記錄函數(shù)。例如下面的代碼:

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

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

if(status.m_lCurrentRecord==0) //當前記錄索引號,0表示第一條記錄

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

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

UpdateData(FALSE);

9.2ODBC數(shù)據(jù)庫編程修改記錄

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

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

m_pSet->m_name="劉向東"; //修改當前記錄字段值 ......

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

m_pSet->Requery();撤消操作

如果用戶在進行增加或者修改記錄后,希望放棄當前操作,則在調(diào)用CRecordSet::Update()函數(shù)之前調(diào)用CRecordSet::Move(AFX_MOVE_REFRESH)來撤消操作,便可恢復在增加或修改操作之前的當前記錄。

9.3數(shù)據(jù)庫編程常用技巧

9.3.1顯示記錄總數(shù)和當前記錄號

Ex_ODBC的記錄瀏覽過程中,不能知道表中的記錄總數(shù)及當前的記錄位置,必須將這些信息顯示出來。這時就需要使用CRecordset類的成員函數(shù)GetRecordCount和GetStatus用來獲得表中的記錄總數(shù)和當前記錄的索引,原型:

longGetRecordCount()const; voidGetStatus(CRecordsetStatus&

rStatus)const;下面的示例過程將實現(xiàn)顯示記錄信息的功能:(1)

打開應(yīng)用程序Ex_ODBC。(2)

在MainFrm.cpp文件中,向原來的indicators數(shù)組添加一個元素,用來在狀態(tài)欄上增加一個窗格,修改的結(jié)果如下:

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

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

ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, };

9.3數(shù)據(jù)庫編程常用技巧(3)

用ClassWizard為CEx_ODBCView類添加OnCommand消息處理函數(shù),添加代碼:

BOOLCEx_ODBCView::OnCommand(WPARAMwParam,LPARAMlParam) { CStringstr; CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; //獲得主框架窗口的指針

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

if(pStatus) { CRecordsetStatusrStatus; m_pSet->GetStatus(rStatus);//獲得當前記錄信息

str.Format("當前記錄:%d/總記錄:%d",1+rStatus.m_lCurrentRecord,m_pSet->GetRecordCount()); pStatus->SetPaneText(1,str);//更新第二個窗格的文本 }

returnCRecordView::OnCommand(wParam,lParam);}9.3數(shù)據(jù)庫編程常用技巧(4)

在CEx_ODBCView的OnInitialUpdate函數(shù)處添加下列代碼:

voidCEx_ODBCView::OnInitialUpdate() { m_pSet=&GetDocument()->m_ex_ODBCSet; //獲得在文檔類定義的記錄集指針

CRecordView::OnInitialUpdate(); //視圖更新并初始化

GetParentFrame()->RecalcLayout();//視圖所在的父窗口重新調(diào)整外觀

ResizeParentToFit();//根據(jù)視圖的尺寸重新調(diào)整父窗口的大小

while(!m_pSet->IsEOF()) { m_pSet->MoveNext(); m_pSet->GetRecordCount(); } m_pSet->MoveFirst(); }(5)

在Ex_ODBCView.cpp文件的開始處增加下列語句:#include“MainFrm.h”(6)

將MainFrm.h文件中的保護型變量m_wndStatusBar變成公共變量。(7)編譯運行并測試。

9.3數(shù)據(jù)庫編程常用技巧9.3.2編輯記錄

下面的過程是在Ex_ODBC的表單視圖中增加三個按鈕:[添加]、[修改]和[刪除],如圖。單擊[添加]或[修改]按鈕都將彈出一個如圖的對話框,在對話框中對數(shù)據(jù)進行編輯后,單擊[確定]按鈕使操作有效。

9.3數(shù)據(jù)庫編程常用技巧(1)切換到ResourceView頁面,打開用于表單視圖CEx_ODBCView的對話框資源IDD_EX_ODBC_FORM。向表單中添加三個按鈕:[添加]、[修改]和[刪除]。(2)

添加一個對話框資源,打開屬性對話框?qū)⑵渥煮w設(shè)置為“宋體9號”,標題定為“學生課程成績表”,ID號設(shè)為IDD_SCORE_TABLE。(3)將表單中的控件復制到對話框中。(4)

將[OK]和[Cancel]的標題改為“確定”和“取消”。圖中具有3D效果的豎直線是用靜態(tài)圖片控件(屬性為Frame,Etched)構(gòu)造的。(5)

雙擊對話框模板或按Ctrl+W快捷鍵,為對話框資源IDD_SCORE_TABLE創(chuàng)建一個對話框類CScoreDlg。(6)打開MemberVariables標簽,在Classname中選擇CScoreDlg,選中所需的控件ID號,雙擊鼠標或單擊AddVariables按鈕。為控件添加控件變量,如圖。

9.3數(shù)據(jù)庫編程常用技巧(7)

用MFCClassWizard為CScoreDlg添加IDOK按鈕的BN_CLICKED的消息映射,代碼:

voidCScoreDlg::OnOK() { UpdateData(); m_strStudentNO.TrimLeft(); m_strCourseNO.TrimLeft(); if(m_strStudentNO.IsEmpty()) MessageBox("學號不能為空!");

else if(m_strCourseNO.IsEmpty()) MessageBox("課程號不能為空!");

else CDialog::OnOK(); }(8)

為CEx_ODBCView類中的三個按鈕,添加代碼:

voidCEx_ODBCView::OnRecAdd() { CScoreDlgdlg; if(dlg.DoModal()==IDOK){ m_pSet->AddNew(); m_pSet->m_course=dlg.m_strCourseNO; m_pSet->m_studentno=dlg.m_strStudentNO; m_pSet->m_score=dlg.m_fScore; m_pSet->m_credit=dlg.m_fCredit; m_pSet->Update(); m_pSet->Requery();} }9.3數(shù)據(jù)庫編程常用技巧voidCEx_ODBCView::OnRecEdit(){ CScoreDlgdlg; dlg.m_strCourseNO=m_pSet->m_course;

dlg.m_strStudentNO=m_pSet->m_studentno;

dlg.m_fScore=m_pSet->m_score;

dlg.m_fCredit=m_pSet->m_credit; if(dlg.DoModal()==IDOK){ m_pSet->Edit(); m_pSet->m_course=dlg.m_strCourseNO; m_pSet->m_studentno=dlg.m_strStudentNO; m_pSet->m_score=dlg.m_fScore; m_pSet->m_credit=dlg.m_fCredit; m_pSet->Update(); UpdateData(FALSE); }}9.3數(shù)據(jù)庫編程常用技巧voidCEx_ODBCView::OnRecDel(){ CRecordsetStatusstatus; m_pSet->GetStatus(status); m_pSet->Delete(); if(status.m_lCurrentRecord==0) m_pSet->MoveNext(); else m_pSet->MoveFirst();

UpdateData(FALSE); }(9)

在Ex_ODBCView.cpp文件的開始處增加下列語句:

#include“ScoreDlg.h”(10)編譯運行并測試。

9.3數(shù)據(jù)庫編程常用技巧9.3.3處理多個表

用MicrosoftAccess為數(shù)據(jù)庫Student.mdb添加一個數(shù)據(jù)表course,如表所示。表中上部分是數(shù)據(jù)表的記錄內(nèi)容,下部分是數(shù)據(jù)表的結(jié)構(gòu)內(nèi)容。

9.3數(shù)據(jù)庫編程常用技巧示例的具體步驟如下:(1)

打開前面的單文檔應(yīng)用程序Ex_ODBC。(2)

按快捷鍵Ctrl+W。單擊[AddClass],選擇“New”。(3)指定CRecordSet的派生類CCourseSet,如圖。

9.3數(shù)據(jù)庫編程常用技巧(4)

單擊[OK],彈出“DatabaseOptions”對話框,圖9.7所示。(5)

選擇ODBC的數(shù)據(jù)源“DatabaseExampleForVC++”,單擊[OK],選擇要使用的表course。(6)

單擊[OK],單擊[確定],系統(tǒng)自動為生成CCodeSet類所需要的代碼。(7)將工作區(qū)切換到ResourceView頁面,打開對話框資源IDD_STU_TABLE。按圖所示的控件布局,向?qū)υ捒蛱砑右粋€組合框控件和三個用于顯示課程名稱、課時數(shù)和開課學期數(shù)據(jù)的靜態(tài)文本控件。

9.3數(shù)據(jù)庫編程常用技巧 (8)打開MemberVariables頁面,在Classname中選擇CStuDlg,選中所需的控件ID號,雙擊鼠標或單擊AddVariables按鈕。再為控件添加控件變量。

9.3數(shù)據(jù)庫編程常用技巧(9)

切換到MesssageMaps頁面,為CScoreDlg中增加WM_INITDIALOG的消息映射,并添加下列代碼:

BOOLCScoreDlg::OnInitDialog() { CDialog::OnInitDialog(); //將課程信息表的課程號添加到組合框中

CCourseSet

cSet;

cSet.Open(); while(!cSet.IsEOF()) { m_comboNO.AddString(cSet.m_courseno);

cSet.MoveNext(); } if(cSet.IsOpen())cSet.Close(); //確定組合框的當前選擇項

m_strCourseNO.TrimLeft(); if(!m_strCourseNO.IsEmpty()) { m_strNO=m_strCourseNO;

UpdateData(FALSE);

OnSelchangeComboNo(); } returnTRUE;//returnTRUEunlessyousetthefocustoacontrol }9.3數(shù)據(jù)庫編程常用技巧(10)

為控件IDC_COMBO_NO增加CBN_SELCHANGE的消息映射,添加代碼:

voidCScoreDlg::OnSelchangeComboNo() { int

nIndex=m_comboNO.GetCurSel(); if(nIndex==CB_ERR)return;

CString

str; m_comboNO.GetLBText(nIndex,str); //根據(jù)課程號查找course表中的記錄

CCourseSet

cSet;

cSet.m_strFilter.Format("courseno='%s'",str);

cSet.Open(); if(!cSet.IsEOF())//如果打開記錄集有記錄

{ m_strNO=m_strCourseNO=str; m_strName=cSet.m_cname; m_strHours.Format("%d",cSet.m_hours); m_strOpen.Format("%d",cSet.m_copen); m_fScore=cSet.m_credit;

UpdateData(FALSE); } if(cSet.IsOpen())cSet.Close(); }9.3數(shù)據(jù)庫編程常用技巧(11)

在ScoreDlg.cpp文件的開始處增加下列語句:

#include"ScoreDlg.h" #include"CourseSet.h“(12)編譯運行并測試。當單擊[修改]按鈕時,彈出如圖所示的對話框。

9.3數(shù)據(jù)庫編程常用技巧9.3.4字段操作

CRecordSet類中的成員變量m_nFields(用于保存數(shù)據(jù)表的字段個數(shù))和成員函數(shù)GetODBCFieldInfo及GetFieldValue可以簡化多字段的訪問操作。

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

nIndex指定字段索引號。fieldinfo是CODBCFieldInfo結(jié)構(gòu)參數(shù),表示字段信息。CODBCFieldInfo結(jié)構(gòu)如下:

struct

CODBCFieldInfo

{ CStringm_strName; //字段名

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

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

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

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

};

SWORD和UDWORD分別表示shortint和unsignedlongint數(shù)據(jù)類型。

GetFieldValue函數(shù)用來獲取數(shù)據(jù)表當前記錄中指定字段的值,最常用的函數(shù)原型如下:

voidGetFieldValue(shortnIndex,CString&strValue);9.3數(shù)據(jù)庫編程常用技巧[例Ex_Field]多個字段的編程操作。(1)

創(chuàng)建一個基于CScrollView類的單文檔應(yīng)用程序Ex_Field。(2)

為數(shù)據(jù)表course創(chuàng)建一個CRecordSet的派生類CCourseSet,

(3)在CEx_FieldView::OnDraw函數(shù)中添加下列代碼:

voidCEx_FieldView::OnDraw(CDC*pDC) { CEx_FieldDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); TEXTMETRICtm;

pDC->GetTextMetrics(&tm);

int

nLineHeight=(int)((tm.tmHeight+tm.tmExternalLeading)*1.5); intx=0,y=0,nWidth;

CCourseSet

cSet;

cSet.Open();

CODBCFieldInfofield;

//創(chuàng)建表頭

for(UINTi=0;i<cSet.m_nFields;i++) { cSet.GetODBCFieldInfo(i,field);

nWidth=tm.tmAveCharWidth*field.m_nPrecision; if(nWidth<100)nWidth=100;

pDC->TextOut(x,y,field.m_strName); x+=nWidth; }9.3數(shù)據(jù)庫編程常用技巧//顯示記錄CString

str;while(!cSet.IsEOF()){ x=0; y+=nLineHeight; for(UINTi=0;i<cSet.m_nFields;i++) { cSet.GetODBCFieldInfo(i,field);

cSet.GetFieldValue(i,str); //計算每一個字段所需的長度

nWidth=tm.tmAveCharWidth*field.m_nPrecision; if(nWidth<100)nWidth=100;

pDC->TextOut(x,y,str); x+=nWidth; }

cSet.MoveNext();}

cSet.Close(); //設(shè)置視圖滾動大小

CSize

sizeTotal;

sizeTotal.cx=x+nWidth; sizeTotal.cy=y+nLineHeight;

SetScrollSizes(MM_TEXT,sizeTotal);}9.3數(shù)據(jù)庫編程常用技巧(4)

在Ex_FieldView.cpp文件的前面添加CCourseSet類的包含語句:

#include"Ex_FieldDoc.h" #include"Ex_FieldView.h" #include"CourseSet.h“(5)編譯運行,結(jié)果如圖所示。

9.4數(shù)據(jù)庫相關(guān)的ActiveX控件

9.4.1使用MSFlexGrid控件

將控件的類添加到項目中

(1)選擇“工程”

“添加工程”

“ComponentsandControls...”,如圖。(2)雙擊“RegisteredActiveXControls”項。在列表中找到Micorsoft

FlexGridControl,如圖。單擊[更多信息]可以獲得該控件的幫助內(nèi)容。

9.4數(shù)據(jù)庫相關(guān)的ActiveX控件(3)

在該控件雙擊鼠標。單擊[確定]

,如圖。單擊[OK]

接受所有的類。(4)單擊[結(jié)束]按鈕關(guān)閉“ComponentsandControlsGallery”對話框。

9.4數(shù)據(jù)庫相關(guān)的ActiveX控件向?qū)υ捒蛱砑覯SFlexGrid控件

打開表單IDD_EX_ODBC_FORM,看到上述控件已添加到對話框編輯器的控件工具欄中,如圖。通過對話框編輯器可以方便地添加MSFlexGrid控件。

修改MSFlexGrid控件屬性

在IDD_EX_ODBC_FORM表單資源添加MSFlexGrid控件,右擊該控件,選擇“屬性”或“PropertiesMSFlexGridObject”命令均可打開該控件的屬性對話框,如圖。

添加的控件9.4數(shù)據(jù)庫相關(guān)的ActiveX控件編程控制

(1)

保留默認的屬性及其控件標識IDC_MSFLEXGRID1。(2)

在CEx_ODBCView類中為剛才添加的MSFlexGrid控件增加一個CMSFlexGrid類成員變量m_MSFGrid,并在CEx_ODBCView類的OnInitialUpdate函數(shù)中添加代碼:

voidCEx_ODBCView::OnInitialUpdate() { … m_pSet->MoveFirst(); m_MSFGrid.SetCols(m_pSet->m_nFields+1); //根據(jù)字段個數(shù),設(shè)置單 元格的最大列數(shù)

m_MSFGrid.SetRows(m_pSet->GetRecordCount()+1);//根據(jù)記錄數(shù),設(shè)置單元 格的最大行數(shù)

m_MSFGrid.SetColWidth(-1,1440); //將所有的單元格都設(shè)為相同的列寬。-1表示所有的列,列寬單位為一個點的

//1/20(一個點是1/72英寸),也就是說,1440剛好為1英寸。

//定義單元格的表頭

m_MSFGrid.SetRow(0); m_MSFGrid.SetCol(0); //定位到(0,0)單元格

m_MSFGrid.SetText("記錄號"); //設(shè)置其顯示內(nèi)容

m_MSFGrid.SetCellAlignment(4); //設(shè)置單元格對齊方式,4表示水 平和垂直居中

CODBCFieldInfofield;9.4數(shù)據(jù)庫相關(guān)的ActiveX控件for(UINTi=0;i<m_pSet->m_nFields;i++) { m_MSFGrid.SetRow(0); m_MSFGrid.SetCol(i+1); m_pSet->GetODBCFieldInfo(i,field); //獲取指定字段信息

m_MSFGrid.SetText(field.m_strName); m_MSFGrid.SetCellAlignment(4); }int

iRow=1;while(!m_pSet->IsEOF()) //將表的記錄內(nèi)容顯示在單元格中{ CString

str;

str.Format("記錄%d",iRow); m_MSFGrid.SetRow(iRow);m_MSFGrid.SetCol(0); m_MSFGrid.SetText(str);m_MSFGrid.SetCellAlign

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論