版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第12章数据库编程2现行的数据库模型主要有4种:层次模型、网状模型、关系模型和面向对象模型。现在最流行的数据库软件都是关系模型,最有希望的模型就是面向对象模型。现有的数据库软件有很多,如大型数据库Oracle、SQLServer,小型数据库Access等,都支持关系模型,至于数据库系统的选择完全根据用户的需求。VisualC++从4.0版本开始就引进了对数据库的支持,而且在随后的版本中逐步丰富了多种方法,如ODBC、ADO和DAO等,本章将针对ODBC在数据库中的编程进行介绍。312.1ODBC简介
微软推出了开放数据库互连技术OpenDatabaseConnectivity,简称ODBC。它包含访问不同数据库所要求的ODBC驱动程序。ODBC提供了应用程序接口(API),使得任何一个数据库都可以通过ODBC驱动器与指定的DBMS相联。用户的程序可通过调用ODBC驱动管理器中相应的驱动程序达到管理数据库的目的。一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是Oracle、SQLServer还是Access数据库,都可以使用ODBCAPI进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。412.1.1ODBC的基本构成ODBC是Microsoft的Windows系统下的数据库服务的一部分,ODBC的基本构成如图12-1所示。51.ODBCAPI包含在一个动态库中的函数集合、一个错误代码的集合、一个标准的SQL语句集合,用来调用DBMS中的数据。2.ODBC管理器这是一个ODBC控制台,用来管理不同的数据源。应用程序要访问数据库,首先必须在ODBC管理器中创建一个数据源。ODBC管理器根据数据源提供的数据库存储位置、类型及ODBC驱动程序信息,建立起ODBC与一个特定数据库之间的联系,以后程序中只需要提供数据源名称,ODBC就可以直接连接相关的数据库。ODBC管理器在系统控制面板中。63.驱动程序管理器驱动程序管理器位于动态库文件ODBC32.DLL,应用程序通过驱动程序管理器调用特定的数据库的驱动程序,驱动程序在执行完相应操作后,再将结果通过驱动程序管理器返回。驱动程序管理器支持一个应用程序同时访问多个DBMS中的数据。4.ODBC驱动程序由一个或是多个DLL构成,提供ODBC与数据库之间的接口。DLL是一个作为共享函数库的可执行文件,它使进程可以调用不属于本身可执行代码中的函数。函数的可执行代码位于一个独立的动态链接库文件中,这样可以节省内存和磁盘的存储空间,同时使程序更易于升级。DLL是一个包含可由多个程序同时使用的代码和数据的库。712.1.2配置ODBC数据源配置ODBC数据源的步骤如下:(1)在Windows控制面板中双击“管理工具”图标,在弹出的窗口中能找到“数据源ODBC”图标,并双击,弹出数据源管理器对话框,如图12-2所示。8(2)在ODBC数据源管理器对话框中选系统DSN或用户DSN,用户DSN表示用户数据源只对当前用户可见,而且只能用于当前机器上。系统DSN表示系统数据源对当前机器上的所有用户可见。击添加,出现创建新数据源对话框,如图12-3所示。9(3)在创建新数据源对话框中,选择MicrosoftAccessDriver(*.mdb),击完成。此时弹出数据库安装对话框,如图12-4所示。输入数据源名My_Access,击选择按钮后弹出选择数据库对话框,如图12-5所示。My_Access以后会出现在CStringCEx12_1Set::GetDefaultConnect(){ return_T(“ODBC;DSN=My_Access”);}函数之中10图12-5选择数据库对话框(4)在选择数据库对话框,选择已创建好的数据库Student_Access.mdb,击确定。回到图12-2的ODBC数据源管理器对话框,可以看见已经添加了新数据源。1112.1.3MFC提供的有关ODBC的常用类1.CRecordView类一个CRecordView对象就是用一个视图中的控件来显示数据库中的记录。CRecordView类使用了动态数据交换(DDX)和数据库交换(RFX),在视图上的控件和数据源中的数据库之间进行数据交换。一个CRecordView类对象包括菜单、工具条及对话框(称为FORM表单),负责记录集的用户界面。控件连接的变量要加到CRecordView类的子类CODBCView中,菜单消息的消息映射要放到CODBCView中。122.CRecordset类
CRecordset类表示从数据源读取出来的数据库。创建数据库应用程序框架后,系统已经生成了CRecordView的子类CODBCView和CRecordset类的子类CODBCSet,并和相应的数据源关联,还生成了一个对话框资源IDD_ODBC_FORM。还定义了一个指向记录集的指针m_pSet,可以通过该指针访问记录集类的数据成员以及调用记录集类的成员函数。表12-1是记录集类的数据成员,表12-2是记录集类的成员函数。13表12-1记录集类的数据成员
成员变量
说明m_hstmt包含描述ODBC数据源的句柄,在调用Open函数之前,该句柄无效m_nFields数据库的属性变量,它指示了从数据源读取的记录个数m_nParams用来指示CRecordset的派生类中的参数个数,默认值为0m_pDatabase指向CDatabase的指针,是指向当前数据库打开的数据源m_strFilter在构造CRecordset类后,在调用Open函数之前,使用这个Cstring型的变量来指明过滤的条件m_strSort在构造CRecordset类后,在调用Open函数之前,使用这个Cstring型的变量来指明排序的字段
14表12-2记录集类的成员函数成员函数说明Open打开一个数据源,成功返回非零值,否则返回零值Close关闭一个CRecordset数据库CanScroll判断数据源是否支持翻阅的功能,要是支持就返回非零值,否则返回零值CanUpdate判断是否数据源能够更新。要是能够更新,就返回非零值,否则返回零值GetRecordCount用来得到数据库中的记录的个数,返回值就是记录的个数GetStatus用来得到数据源的状态,它是通过一个CRecordsetStatus类型的指针来返回的IsOpen判断数据源是否打开了,要是打开了,就返回非零值,否则返回为零值15IsBOF判断数据库是否还有记录,若数据库为空,则返回非零值,否则为零值IsEOF判断是否到了最后一条记录,若到了最后一个记录,则返回非零值,否则为零值IsDeleted判断当前记录是否是一个被删除的记录,如果是,返回真,否则为假AddNew加入一个新的记录,要调用Update函数才能将新加入的记录加到数据源中去Delete删除当前所指向的记录,当将游标移走后,被删除的记录无法恢复Move在数据库中移动记录指针,一般和MoveNext、MovePrev、MoveFirst函数合用GetDefaultConnect指向了一个默认连接的数据源GetDefaultSQL得到相应的默认的SQL语句Requery刷新数据库,在显示记录之前,要调用Requery函数,使得对数据库的修改可见,在调用Requery函数之前要调用Open函数
16例如要实现定位功能,可以使用如下语句:m_pSet->MoveFirst(); m_pSet->MoveNext();m_pSet->MoveLast();要实现当前记录的编辑、删除、更新或添加记录功能,可以使用如下语句:m_pSet->Edit();m_pSet->Delete(); m_pSet->Update();m_pSet->AddNew();//添加一个记录m_pSet->SetFieldNull(NULL);//清空屏幕m_pSet->GetRecordCount();//获得当前记录数17要判断当前更新、滚动状态,可以使用如下语句:m_pSet->CanUpdate()m_pSet->CanScroll()m_pSet->IsEOF()m_pSet->IsBOF()m_pSet->IsDeleted() 要判断当前表是否为空,可以使用如下语句:CRecordsetStatusm_cStatus;m_pSet->GetStatus(m_cStatus);if(m_cStatus.m_lCurrentRecord==0)18要实现排序功能,可以使用如下语句:m_pSet->Close(); //关闭数据库m_pSet->m_strSort=“年龄”;//指定排序字段m_pSet->Open(); //再次打开数据库UpdateData(FALSE); //更新已经排序过的记录或m_pSet->m_strSort=“年龄”;//指定排序字段 m_pSet->Requery(); //重新查询数据源UpdateData(FALSE);要实现过滤功能,可以使用如下语句:m_pSet->Close(); //关闭原来的表单m_pSet->m_strFilter=“姓名=‘张三’”;//将查询条件给过滤器m_pSet->Open(); //打开经过过滤的表单193.CDatabase类CDatabase类在afxdb.h中定义。其对象是用来连接一个数据源的。为了可以使用CDatabase对象,需要调用构造函数,并调用OpenEx()或是Open()函数来打开一个连接。当构造一个CDatabase类对象后,可以向该对象传递这个CDatabase类的指针。连接数据源结束时,必须用Close()函数关闭这个数据库对象。
204.CDBException类CDBException类是用来处理从其它ODBC类传过来的异常情况的。这个类一般是和关键字CATCH连用的。CDBException类的数据成员有如下几个:m_nRetCode:它包含了一个结构体RETCODE,里面包含了ODBC的错误信息的描述。m_strError:包含一个描叙异常情况的字符串。m_strStateNativeOrigin:包含描述异常情况的字符串m_strStateNativeOrigin;如果变量包含多个错误的描述,错误会分行显示。2112.2简单的MFCODBC数据库应用编程用MFC应用程序向导使用ODBC数据库的一般过程是:(1)用Access或其它数据库工具构造一个数据库;(2)在Windows中为刚才构造的数据库定义一个ODBC数据源;(3)在创建数据库处理的文档应用程序向导中选择数据源;(4)设计界面,并使控件与数据表字段关联。22【例12-1】编写一个数据库应用程序,用它可以浏览数据库表中的记录。程序运行时的界面如图12-6所示。23实现步骤如下:
(1)创建一个名为Student_Access的Access数据库,数据库中包含一个student表。表结构见表12-3。将其注册为ODBC数据源Student_Access。
表12-3student表结构列名数据类型其它Number文本主键Name文本Sex文本Age数值Special文本24(2)用MFC应用程序向导来生成一个单文档的应用程序MyODBC。(3)在MFC应用程序向导的步骤2中选择数据支持的时候选择“查看数据库不使用文件支持”,如图12-7所示。表12-4中是这4个选项的说明。图12-7MFC应用程序向导的步骤225表12-44个选项的说明选项创建的视图类创建的文档类否从Cview派生支持文档的常用操作,并在“文件”菜单中有“新建”、“打开”、“保存”、“另存为”等命令。标题文件从Cview派生除了在StdAfx.h文件中添加了“#include<afxdb.h>”语句外,其余与“None”选项相同
查看数据库不使用文件支持从CrecordView派生不支持文档的常用操作,也就是说,创建的文档类不能进行序列化,且在“文件”菜单中没有“新建”等文档操作命令。但用户可在用户视图在中使用Crecordset类处理数据库查看数据库使用文件支持从CrecordView派生全面支持文档操作和数据库操作
26(4)然后选择数据源,按下数据源按钮,弹出如图12-8所示的DatasouceOptions对话框,选择已经注册好的数据源Student_Access。在Recordsettype中,Snapshots是一个静态数据库,每一个表都是一个从打开的数据源读取出来的。而当用户在一个Dynasets中翻阅记录时,会随时显示其它人或自己对某个数据的修改,不论对这个数据的修改是在应用程序中还是其它地方。这里选Dynasets,击OK按钮。27(5)出现SelectDatabaseTables对话框。在弹出的对话框选择student表,击OK。(6)在MFC应用程序向导的步骤2中看到选择的表名,击完成。(7)打开资源管理器的Dialog文件夹,选择IDD_ODBC_FORM,在对话框中按图12-6所示添加静态文本控件和编辑框控件,设置各控件的属性。(8)在表单视图CODBCView中添加的控件要与表的字段相关联,这样就可以根据表的当前记录位置显示相应的数据。右击控件,打开类向导,选择MemberVariables标签页,类名选择CODBCView(添加CODBCView类的成员变量),击AddVariable按钮,弹出AddMemberVariable对话框,如图12-9所示,选择要连接的表的字段即可。28图12-9AddMemberVariable对话框(9)编译运行程序。29需要说明的是,MFC应用程序向导创建的ODBC应用程序与一般默认的单文档应用程序相比较,在类框架方面有如下几点不同:(1)添加了一个CODBCSet类,它与上述过程中所选择的数据表student进行数据绑定,也就是说,CODBCSet对象的操作实质上对数据表进行操作。(2)将CODBCView类的基类设置成CrecordView。由于CrecordView的基类是CformView,因此它需要与之相关联的表单资源。(3)MFC为用户自动创建了用于浏览数据表记录的工具按钮和相应的“记录”菜单项。若用户选择这些浏览记录命令,系统会自动调用相应的函数来移动数据表的当前位置。30(4)RFXRFX(RecordFieldExchange)是支持应用程序的一个交换机制,当CODBCSet类与Cdatabase类在交换数据的时候没有选择大容量交换的方式(BulkRFX)时,RFX机制将在数据交换中起作用。RFX在视图和数据源之间自动交换数据,由于一次交换的数据可能不止一个,为此可能要多次调用DoFieldExchange函数,同时它也是应用程序框架和ODBC交流的媒介。RFX机制能够安全的通过函数调用来保存用户的工作。31下面代码就是例12-1工程文件中应用程序向导自动加入的RFX代码,见粗斜体部分:voidCMyODBCSet::DoFieldExchange(CfieldExchange*pFX){ //{{AFX_FIELD_MAP(CMyODBCSet) pFX->SetFieldType(CfieldExchange::outputColumn); RFX_Text(pFX,_T(“[Number]”),m_Number); RFX_Text(pFX,_T(“[Name]”),m_Name); RFX_Text(pFX,_T(“[Sex]”),m_Sex); RFX_Long(pFX,_T(“[Age]”),m_Age); RFX_Text(pFX,_T(“[Special]”),m_Special); //}}AFX_FIELD_MAP}32下面是Crecordset派生类的头文件,其中关于RFX机制的部分已经用粗斜体显示:classCMyODBCSet:publicCrecordset{public: CMyODBCSet(Cdatabase*pDatabase=NULL); DECLARE_DYNAMIC(CMyODBCSet)//Field/ParamData //{{AFX_FIELD(CMyODBCSet,Crecordset) Cstring m_Number; Cstring m_Name; Cstring m_Sex; long m_Age; Cstring m_Special; //}}AFX_FIELD33//Overrides //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CMyODBCSet) public: virtualCstringGetDefaultConnect(); //Defaultconnectionstring virtualCstringGetDefaultSQL(); //defaultSQLforRecordset virtualvoidDoFieldExchange(CfieldExchange*pFX); //RFXsupport //}}AFX_VIRTUAL//Implementation#ifdef_DEBUG virtualvoidAssertValid()const; virtualvoidDump(CdumpContext&dc)const;#endif};34【例12-2】在例12-1基础上增加查询功能,程序运行界面如图12-10所示。图12-10例12-2程序运行界面35具体步骤如下:
(1)添加一个组合框和一个编辑框控件,用于设置查询条件,添加一个查询按钮。控件相关的属性及连接的变量如表12-3。
表12-3控件属性及连接的变量控件控件ID连接的变量类型字段组合框BO_FIELDm_strFieldm_ctrlFieldCstringboBox编辑框IDC_EDIT_VALUEm_strRowCstring查询按钮IDC_BUTTON_QUERY36(2)在初始化函数voidCMyODBCView::OnInitialUpdate()中,加入组合框的选择内容,代码如下:voidCMyODBCView::OnInitialUpdate(){ m_pSet=&GetDocument()->m_oDBCSet; CrecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit();m_ctrlField.AddString(“Number”);m_ctrlField.AddString(“Name”);m_ctrlField.AddString(“Sex”);m_ctrlField.AddString(“Age”);m_ctrlField.AddString(“Special”);}37(3)为查询按钮添加消息处理函数OnButtonQuery(),添加代码:voidCMyODBCView::OnButtonQuery(){ //TODO:AddyourcontrolnotificationhandlercodehereUpdateData();if(m_strField.IsEmpty()&&m_strRow.IsEmpty()) { MessageBox(“查询条件不足”);}m_pSet->Close();m_pSet->m_strFilter.Format(“%s=’%s’”,m_strField,m_strRow);m_pSet->Open();if(!m_pSet->IsBOF()) UpdateData(FALSE);else MessageBox(“没有查到”);}上面代码中,先通过Close()函数关闭数据库,然后设置变量m_strFilter,实现按给定的查询条件查询,然后再次打开数据库,最后调用UpdateData(FALSE);在视图中显示查询的结果集。38【例12-3】在例12-2的基础上增加添加、修改、删除一个记录的功能,程序运行界面如图12-11所示。当单击“添加”“修改”按钮时弹出一个对话框来显示要添加或修改的内容,如图12-12所示。单击“删除”则直接删除当前记录。图12-11例12-3程序运行界面39具体步骤如下:(1)在界面上添加三个命令按钮“添加记录”、“修改记录”和“删除记录”,设置它们的ID号分别为IDC_BUTTON_ADD、IDC_BUTTON_EDIT和IDC_BUTTON_DEL。(2)为程序添加一个对话框资源,按照如图12-12布局。图12-12弹出的对话框40
(3)双击对话框模板或按Ctr+W快捷键,为对话框资源创建一个对话框类CstudentDlg。
(4)为新对话框类的各个控件连接变量,见表12-4。
控件ID连接的变量名类型姓名编辑框IDC_NAMEm_dlgNameCstring学号编辑框IDC_NUMBERm_dlgNumberCstring年龄编辑框IDC_AGEm_dlgAgeCstring专业编辑框IDC_SPECIALm_dlgSpecialCstring性别编辑框IDC_Sexm_dlgSexCstring41(5)为“添加记录”按钮添加消息处理函数并添加代码如下:voidCMyODBCView::OnBttonAdd(){ //TODO:AddyourcontrolnotificationhandlercodehereCstudentDlgdlg;if(dlg.DoModal()==IDOK){ m_pSet->AddNew(); m_pSet->m_Number=dlg.m_dlgNumber; m_pSet->m_Name=dlg.m_dlgName; m_pSet->m_Age=dlg.m_dlgAge; m_pSet->m_Special=dlg.m_dlgSpecial; m_pSet->m_Sex=dlg.m_dlgSex; m_pSet->Update(); m_pSet->Requery();}}42(6)为“修改记录”按钮添加消息处理函数并添加代码如下:voidCMyODBCView::OnButtonEdit(){ //TODO:AddyourcontrolnotificationhandlercodehereCstudentDlgdlg;dlg.m_dlgNumber=m_pSet->m_Number;dlg.m_dlgName=m_pSet->m_Name;dlg.m_dlgSex=m_pSet->m_Sex;dlg.m_dlgAge=m_pSet->m_Age;dlg.m_dlgSpecial=m_pSet->m_Special;UpdateData();43if(dlg.DoModal()==IDOK){ m_pSet->Edit(); m_pSet->m_Number=dlg.m_dlgNumber; m_pSet->m_Name=dlg.m_dlgName; m_pSet->m_Sex=dlg.m_dlgSex; m_pSet->m_Age=dlg.m_dlgAge; m_pSet->m_Special=dlg.m_dlgSpecial; m_pSet->Update(); UpdateData(FALSE);}}44(7)为“删除记录”按钮添加消息处理函数并添加代码如下:voidCMyODBCView::OnButtonDel(){ //TODO:AddyourcontrolnotificationhandlercodehereCrecordsetStatusstatus;m_pSet->GetStatus(status);m_pSet->Delete();if(status.m_lCurrentRecord==0) m_pSet->MoveNext();else UpdateData(FALSE);}45(8)为新对话框的“确定”按钮添加消息处理函数并添加代码如下:voidCstudentDlg::OnOK(){ //TODO:AddextravalidationhereUpdateData();if(m_dlgNumber.IsEmpty()) MessageBox(“学号不能为空”);elseCdialog::OnOK();}(9)由于在视图中响应了对话框的操作,因此还需要再在CMyODBCView.cpp中加入对话框类的头文件,代码如下:#include”CstudentDlg.h”(10)编译运行。46【例12-4】在例12-3基础上增加排序功能,程序运行界面如图12-13所示。选择排序的条件后按下“排序”按钮,可以按指定的条件排列顺序。47具体步骤如下:
(1)在界面上添加一个组合框和一个“排序”按钮,它们的属性及连接的变量见表12-5。
表12-5控件属性及连接的变量
控件ID连接的变量名变量类型组合框BO_SORTm_Sortm_ctrlSortCstringboBox排序按钮IDC_BUTTON_SORT48(2)在初始化函数voidCMyODBCView::OnInitialUpdate()中,加入组合框的选择内容,代码如下:voidCMyODBCView::OnInitialUpdate(){m_ctrlSort.AddString(“Number”);m_ctrlSort.AddString(“Name”);m_ctrlSort.AddString(“Sex”);m_ctrlSort.AddString(“Age”);m_ctrlSort.AddString(“Special”);}49(3)为“排序”按钮添加消息处理函数并添加代码如下:voidCMyODBCView::OnButtonSort(){ //TODO:AddyourcontrolnotificationhandlercodehereUpdateData();m_pSet->Close();m_pSet->m_strSort=m_Sort;m_pSet->Open();UpdateData(FALSE);}50上述代码中,先通过Close()函数关闭数据库,然后设置变量m_strSort,实现按指定字段进行从小到大的顺序排序,然后再通过Open()函数再次打开数据库,最后调用UpdateData(FALSE);在视图中显示的排序结果。(4)编译运行。51【例12-5】在例12-4基础上增加定位功能,程序运行界面如图12-14所示。单击“移动到记录”按钮,弹出移动到记录对话框如图12-15所示,在对话框中可以指定记录序号。图12-14例12-5程序运行界面52具体步骤如下:(1)添加一个“移动到记录”按钮,ID为IDC_BUTTON_MOVETO。(2)为程序添加一个对话框资源,如图12-15。(3)为对话框资源创建一个对话框类CmoveToDlg。(4)为对话框的编辑框连接一个long类型变量m_Record。53(5)为“移动到记录”按钮添加消息处理函数OnButtonMoveTo(),添加代码如下:voidCMyODBCView::OnButtonMoveTo(){ //TODO:AddyourcontrolnotificationhandlercodehereCmoveToDlgdlg;if(dlg.DoModal()==IDOK){ m_pSet->SetAbsolutePosition(dlg.m_Record); UpdateData(FALSE);}}(6)在CMyODBCView.cpp中加入CmoveToDlg头文件#include“CmoveToDlg.h”(7)编译运行。5412.3ActiveX控件ActiveX控件是一种可以与应用程序分离的可编程组件,它实质上相当于一种可以嵌入到应用程序中运行的微型应用程序。用户可以使用ActiveX控件更好地操作数据库,下面介绍常用的MSFlexGrid、RemoteData和DBGrid控件。
12.3.1使用MSFlexGrid控件【例12-6】编写一个应用程序,利用ActiveX控件MSFlexGrid来显示表单的内容,程序运行时界面如图12-16所示。55图12-16例12-6程序运行时界面具体步骤如下:(1)用MFC应用程序向导创建一个单文档应用程序MyGrid。在向导第二步对话框中选中“查看数据库使用文件支持”,选择数据源Student_Access,在“SlecetDatabaseTables”对话框中,选择表student。56(2)在打开的表单资源模板中右击鼠标,从弹出的快捷菜单中选择“插入Active控件”命令,出现如图12-17所示“插入ActiveX控件”对话框。选择“MicrosoftFlexGridControl,Version6.0”,单击确定,把该控件添加到表单资源中。图12-17插入ActiveX控件对话框57(3)修改FlexGridControl控件属性,右击控件从弹出的菜单中选择“属性”打开控件的属性对话框,将控件ID改为IDC_MSFLEXGRID,其余默认。(4)用MFC类向导为FlexGrid控件连接一个控件变量m_FlexGrid。在此步骤会出现一些对话框,用于询问是否要添加相关控件的类代码等,选择“是”。58(5)在CMyGridView类的OnInitialUpdate()函数中添加代码如下:voidCMyGridView::OnInitialUpdate(){m_pSet=&GetDocument()->m_bbSet; CRecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit();while(!m_pSet->IsEOF()) m_pSet->MoveNext();m_pSet->MoveFirst(); m_MSFGrid.SetCols(m_pSet->m_nFields+1); //根据字段数设置单元格最大列数m_MSFGrid.SetRows(m_pSet->GetRecordCount()+1); //根据记录数设置单元格最大行数59m_MSFGrid.SetColWidth(-1,1440); //将所有的单元格都设为相同的列宽。-1表示所有的列,列宽单位为一个点的
//1/20(一个点是1/72英寸),也就是说,1440刚好为1英寸。
//定义单元格的表头m_MSFGrid.SetRow(0); m_MSFGrid.SetCol(0); //定位到(0,0)单元格m_MSFGrid.SetText("记录号"); //设置其显示内容m_MSFGrid.SetCellAlignment(4); //设置单元格对齐方式,4表示水平和垂直居中CODBCFieldInfofield;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); }60intiRow=1;while(!m_pSet->IsEOF()) { //将表的记录内容显示在单元格中
CStringstr; str.Format("记录%d",iRow); m_MSFGrid.SetRow(iRow); m_MSFGrid.SetCol(0); m_MSFGrid.SetText(str); m_MSFGrid.SetCellAlignment(4); for(UINTi=0;i<m_pSet->m_nFields;i++) { m_MSFGrid.SetRow(iRow); m_MSFGrid.SetCol(i+1); m_pSet->GetFieldValue(i,str); //获取指定字段值,并自动转换成字符串
m_MSFGrid.SetText(str); m_MSFGrid.SetCellAlignment(4); }61
iRow++; m_pSet->MoveNext();}m_MSFGrid.SetRow(1); m_MSFGrid.SetCol(1);m_pSet->MoveFirst();}(6)编译运行。6212.3.2使用RemoteData和DBGrid控件【例12-7】编写一个应用程序,利用RemoteData和DBGrid控件显示表单内容。程序运行时界面如图12-18所示。图12-18例12-7程序运行时界面63具体步骤如下:(1)用MFC应用程序向导创建一个单文档应用程序MyDBCtrl,在向导的第六步将CMyDBCtrlView的基类选择为CFormView类。(2)在打开的表单资源模板中右击鼠标,从弹出的快捷菜单中选择“插入Active控件”命令,在弹出的“插入ActiveX控件”对话框中选择“MicrosoftRemoteDataControl”,单击确定,把该控件添加到表单资源中。(3)修改控件属性。64右击RemoteData控件,打开控件的属性对话框,如图12-19所示,在“General”页面中,从“DataSourse”下拉列表框中选择数据源Student_Access。在SQL编辑框中输入操作语句“SELECT*FROMstudentORDERBYNumber”,含义是检索学生表的记录并按学号排序。将属性对话框切换到全部页面,如图12-20所示,设置CursorDriver属性为“1-ODBCcursor”。65图12-19RemoteData控件的General属性66图12-20RemoteData控件的全部属性
(4)用同样的方法插入DBGrid控件,并设置属性,将数据源(DataSource)属性设置为RemoteData控件的ID号IDC_REMOTEDATACTL,如图12-21所示。
67为了使DBGrid控件看起来是一个独立的界面,把控件的“显示(Visible)”属性设为不选中。图12-21DBGrid控件属性(5)编译运行。6812.4多表连接【例12-8】先为数据库Student_Access.mdb添加两个表,学生课程成绩表score,表结构见表12-6,课程信息表course,表结构见表12-7。编写一个应用程序,要显示一个学生的课程成绩信息,信息包括学号、姓名、课程号、课程名、课程所属专业、课程类别、成绩、学分。则要涉及前面的学生课程成绩表score,课程信息表course,学生信息表student。程序运行界面如图12-22所示,单击左边列表框的班级,该班级所有学生的课程信息将在右边的列表视图中显示出来。69
表12-6学生课程成绩表score结构表12-7课程信息表course结构列名数据类型其它Number(学号)文本主键CourseNO(课程号)文本Score(成绩)单精度Credit(学分)单精度列名数据类型其它CourseNO文本主键Special文本CourseName文本Type文本70图12-22例12-8程序运行界面
实现步骤如下:(1)用MFC应用程序向导创建一个基于对话框的应用程序MyTableLink。71控件ID属性列表框控件IDC_LISTBOX连接CListBox类型的变量m_listBox列表控件IDC_LISTCTRL将查看属性选为报告连接ClistCtrl类型变量m_listCtrl(2)添加两个控件,设置件控件的属性见表12-8。表12-8控件的属性(3)添加对MFCODBC的支持记录集。用MFCClassWizard为数据表studentcoursescore分别创建CRecordset派生类CStudentSet和CScoreSet。在stdafx.h文件中添加ODBC数据库支持的头文件包含#include<afxdb.h>72(4)完善左边列表框控件的代码,在CMyTableLinkDlg::OnInitDialog()函数中添加代码如下:BOOLCMyTableLinkDlg::OnInitDialog(){... //TODO:Addextrainitializationherem_listBox.AddString("0701");//设置列表框m_listBox.AddString("0702"); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}73(5)在CMyTableLinkDlg.cpp文件的前面添加记录集的包含文件,添加代码如下:#include”StudentSet.h”#include”ScoreSet.h”#include”CourseSet.h”74(6)完善右边列表控件的代码在CMyTableLinkDlg::OnInitDialog()函数中添加代码如下:BOOLCMyTableLinkDlg::OnInitDialog(){...//设置列表头CStringstrHeader[]={"学号","姓名","课程号","课程名","课程所属专业","课程类别","学分","成绩"};intnLong[]={80,80,80,180,180,80,80,80};for(intnCol=0;nCol<sizeof(strHeader)/sizeof(CString);nCol++) m_listCtrl.InsertColumn(nCol,strHeader[nCol],LVCFMT_LEFT,nLong[nCol]); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}75(7)为CMyTableLinkDlg类添加一个成员函数Display(),用来根据指定的条件在列表控件中显示学生成绩的所有信息,函数代码如下:voidCMyTableLinkDlg::Display(CStringstrFilter){ //TODO:Addyourcontrolnotificationhandlercodeherem_listCtrl.DeleteAllItem
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届山东省潍坊市辖县中考物理考试模拟冲刺卷含解析
- 湖南省株洲市醴陵市2026届中考联考物理试题含解析
- 企业管理-差旅费报销制度
- 产科护理产褥期感染预防与处理
- 江西省赣州市兴国县2026届中考物理全真模拟试题含解析
- 常德市安乡县2025届三下数学期末教学质量检测试题(含解析)
- 常州市天宁区2025年三下数学期中监测试题含答案
- 产前诊断的影像学技术
- 2026年中考生物一轮复习:人教版(2024)七八年级4册必背知识点提纲
- 湖南省株洲市2025-2026学年高二下学期期末自编模拟C卷(株洲市专用)物理(含答案)
- 二次供水安全培训课件
- 四川省成都市成华区2024-2025学年八年级(下)期末物理试卷(含解析)
- 人教版2024版历史八年级上册第四单元第12课《中国共产党诞生》创新教学设计
- 硬笔书法全册教案共20课时
- 中华人民共和国治安管理处罚法培训宣贯
- 江苏省南通市海安市2024-2025学年六年级下学期期末数学考试卷
- 生物制剂在哮喘治疗中的应用
- 2025陕西氢能产业发展有限公司所属单位招聘(101人)笔试参考题库附带答案详解析集合
- 动漫速写基础-课件 第4章动态人物速写
- 农光互补光伏样板工程方案
- GB/T 44399-2024移动式金属氢化物可逆储放氢系统
评论
0/150
提交评论