第9章数据库应用

上传人:da****ge 文档编号:243063149 上传时间:2024-09-14 格式:PPT 页数:82 大小:928.50KB
返回 下载 相关 举报
第9章数据库应用_第1页
第1页 / 共82页
第9章数据库应用_第2页
第2页 / 共82页
第9章数据库应用_第3页
第3页 / 共82页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第,9,章数据库应用,9.1,数据库和,ODBC,操作,9.2MFC ODBC,应用编程,9.3ADO,数据库编程,9.4,数据库相关的,ActiveX,控件,9.5,综合应用,9.1,数据库和,ODBC,操作,9.1.1,数据库基本概念,1.,数据库和,DBMS,数据库是指以一定的组织形式存放在计算机存储介质上的相互关联的数据的集合。例如,把一个学校的教师、学生和课程等数据有序地组织起来,存储在计算机磁盘上,就构成了一个数据库。,为了能有效地管理数据库,常常需要数据库管理系统(,DBMS,)为用户提供对数据库的操作,包括数据库的建立和记录的输入、修改、检索、显示、删除和统计等。,DBMS,为用户提供的对数据库操作的方法包括交互界面和,SQL,语句接口。,Visual C+,就是通过,SQL,语句接口操作数据库。,目前,使用最多的是关系数据库,有许多关系数据库管理系统(,DBMS,),如,Access,、,SQL Server,、,Oracle,、,Sybase,和,Visual,Foxpro,等,,2. SQL,语句,SQL,(结构化查询语言)语句是用来在,DBMS,中访问和操作数据库的标准语言,,SQL,语言主要包括三个方面:,9.1,数据库和,ODBC,操作,(,1,)数据操纵语言,DML(Data,Manipulation Language),:主要包括查询、插入、删除和修改数据库中的数据的操作。,(,2,)数据定义语言,DDL(Data,Definition Language),:定义数据库结构,包括定义表、视图和索引等。,(,3,) 数据控制语言,DCL(Data,Control Language),:包括对数据库的安全性控制、完整性控制以及对事务的定义、并发控制和恢复等。,3. ODBC,、,DAO,和,OLE DB,Visual C+,为用户提供了,ODBC,(,Open Database Connectivity,,开放数据库连接)、,DAO,(,Data Access Objects,,数据访问对象)及,OLE DB,(,OLE Data Base,,,OLE,数据库)三种数据库方式,使用户的应用程序从特定的数据管理系统脱离出来。,ODBC,提供了应用程序接口(,API,),使得任何一个数据库都可以通过,ODBC,驱动器与指定的,DBMS,相联。用户的程序可通过调用,ODBC,驱动管理器中相应的驱动程序达到管理数据库的目的。作为,Microsoft Windows Open Standards Architecture,(,WOSA,,,Windows,开放式服务体系结构)的主要组成部分,,ODBC,一直沿用至今。,9.1,数据库和,ODBC,操作,DAO,类似于用,Microsoft Access,或,Microsoft Visual Basic,编写的数据库应用程序,它使用,Jet,数据库引擎形成一系列的数据访问对象:数据库对象、表和查询对象、记录集对象等。它可以打开一个,Access,数据库文件(,MDB,文件),也可直接打开一个,ODBC,数据源以及使用,Jet,引擎打开一个,ISAM,(被索引的顺序访问方法)类型的数据源(,dBASE,、,FoxPro,、,Paradox,、,Excel,或文本文件)。,OLE DB,试图提供一种统一的数据访问接口,并能处理除了标准关系型数据库中的数据之外,还能处理包括邮件数据、,Web,上的文本或图形、目录服务(,Directory Services,)以及主机系统中的,IMS,和,VSAM,数据。,OLE DB,提供一个数据库编程,COM,(组件对象模型)接口,使得数据的使用者(应用程序)可以使用同样的方法访问各种数据,而不用考虑数据的具体存储地点、格式或类型。这个,COM,接口与,ODBC,相比,其健壮性和灵活性要高得多。但是,由于,OLE DB,的程序比较复杂,因而对于一般用户来说使用,ODBC,和,DAO,方式已能满足一般数据库处理的需要。,4. ADO,ADO,是目前在,Windows,环境中比较流行的客户端数据库编程技术。它是,Microsoft,为最新和最强大的数据访问范例,OLE DB,而设计的,是一个便于使用的应用程序层接口。,ADO,使用户应用程序能够通过“,OLE DB,提供者”访问和操作数据库服务器中的数据。由于它兼具有强大的数据处理功能,(,处理各种不同类型的数据源、分布式的数据处理等等,),和极其简单、易用的编程接口,因而得到了广泛的应用。,9.1,数据库和,ODBC,操作,ADO,技术基于,COM,(,Component Object Model,,组件对象模型),具有,COM,组件的许多优点,可以用来构造可复用应用框架,被多种语言支持,能够访问包括关系数据库、非关系数据库及所有的文件系统。另外,,ADO,还支持各种,B/S,与基于,Web,的应用程序,具有远程数据服务,RDS(Remote,Data Service),的特性,是远程数据存取的发展方向。,表,9.1,学生课程成绩表,(score),及其表结构,学号,(,studentno,),21010101,21010102,21010501,21010502,课程号,(course),成绩,(score),学分,(credit),2112105,2112348,2121344,2121331,80,85,70,78,3,2.5,3,3,序 号,字段名称,数据类型,字段大小,小数位,字段含义,1,2,3,4,studentno,course,score,credit,文本,文本,数字,数字,8,7,单精度,单精度,1,1,学号,课程号,成绩,学分,9.1,数据库和,ODBC,操作,9.1.2 MFC ODBC,向导过程,用,MFC AppWizard,使用,ODBC,数据库的一般过程是:用,Access,或其他数据库工具构造一个数据库;在,Windows,中为刚才构造的数据库定义一个,ODBC,数据源;在创建数据库处理的文档应用程序向导中选择数据源;设计界面,并使控件与数据表字段关联。,1.,构造数据库,数据库表与表之间的关系构成了一个数据库。作为示例,这里用,Microsoft Access,创建一个数据库,Student.mdb,,其中暂包含一个数据表,score,,用来描述学生课程成绩,如表,9.1,所示。在表中包括上、下两部分,上部分是数据表的记录内容,下部分是数据表的结构内容。,需要说明的是,数据表结构可以看成是一个具有行和列的二维表格。表格中的一行称为一个,记录,,一列称为一个,字段,,每列的标题称为字段名。,2.,创建,ODBC,数据源,Windows,中的,ODBC,组件是出现在系统的“控制面板”中的“管理工具”中的“数据源(,ODBC,)”,如图,9.1,所示。,9.1,数据库和,ODBC,操作,图,9.1 Windows XP,的管理工具,9.1,数据库和,ODBC,操作,双击“数据源(,ODBC,)”,进入,ODBC,数据源管理器。在这里,用户可以设置,ODBC,数据源的一些信息。其中,“用户,DSN”,页面是用来定义用户自己在本地计算机使用的数据源名(,DSN,),如图,9.2,所示。,图,9.2 ODBC,数据源管理器,9.1,数据库和,ODBC,操作,那么,创建一个用户,DSN,可有如下的过程:,(,1,)单击,添加,按钮,弹出有一驱动程序列表的“创建新数据源”对话框,在该对话框中选择要添加用户数据源的驱动程序,这里选择“,Microsoft Access Driver”,,如图,9.3,所示。,(,2,)单击,完成,按钮,进入指定驱动程序的安装对话框,单击,选择,按钮将前面创建的数据库调入,然后在数据源名输入“,Database Example For VC+”,,结果如图,9.4,所示。,(,3,)单击,确定,按钮,刚才创建的用户数据源被添加在“,ODBC,数据源管理器”的“用户数据源”列表中。,图,9.3 “,创建新数据源”对话框 图,9.4 ODBC Access,安装对话框,9.1,数据库和,ODBC,操作,3.,在,MFC AppWizard,中选择数据源,用,MFC AppWizard,可以容易地创建一个支持数据库的文档应用程序,如下面的过程。,(,1,)用,MFC AppWizard,创建一个单文档应用程序,Ex_ODBC,。,(,2,)在向导的第,2,步对话框中加入数据库的支持,如图,9.5,所示。在该对话框中用户可以选择对数据库支持程序,其中各选项的含义如表,9.2,所示。,图,9.5,向导的第二步对话框,9.1,数据库和,ODBC,操作,表,9.2 MFC,支持数据库的不同选项,选项,创建的视图类,创建的文档类,否,(None),从,CView,派生,支持文档的常用操作,并在“文件”菜单中有“新建”、“打开”、“保存”、“另存为”等命令。,标题文件,(Header files only),从,CView,派生,除了在,StdAfx.h,文件中添加了“,#include ,”,语句外,其余与“,None,”,选项相同,查看数据库不使用文件支持,(Database view without file support),从,CRecordView,派生,不支持文档的常用操作,也就是说,创建的文档类不能进行序列化,且在“文件”菜单中没有“新建”等文档操作命令。但用户可在用户视图在中使用,CRecordset,类处理数据库,查看数据库使用文件支持,(Database view with file support),从,CRecordView,派生,全面支持文档操作和数据库操作,9.1,数据库和,ODBC,操作,(,3,)选中“数据库查看使用文件支持”项,单击,数据源,(,Data Source,)按钮,弹出“,Database Options”,对话框,从中选择,ODBC,的数据源“,Database Example For VC+”,,如图,9.6,所示。,需要说明的是,,Recordset,type,(记录集类型)有动态集(,Dynaset,)和快照集(,Snapshot,)之分。动态集能与其他应用程序所做的更改保持同步,而快照集则是数据的一个静态视图。这两种类型在记录集被打开时都提供一组记录,所不同的是:当在一个动态集里滚动一条记录时,由其他用户或应用程序中的其他记录集对该记录所做的更改会相应地显示出来,而快照集则不会。,图,9.6 “Database Options”,对话框,图,9.7 “Select Database Tables”,对话框,9.1,数据库和,ODBC,操作,(,4,)保留其他默认选项,单击,OK,按钮,弹出如图,9.7,所示的“,Select Database Tables”,对话框,从中选择要使用的表,score,。,(,5,)单击,OK,按钮,又回到了向导的第,2,步对话框。,(,6,)单击,完成,按钮。开发环境自动打开表单视图,CEx_ODBCView,的对话框资源模板,IDD_EX_ODBC_FORM,以及相应的对话框编辑器。,(,7,)编译并运行,结果如图,9.8,所示。,记录浏览按钮,图,9.8,Ex_ODBC,运行结果,9.1,数据库和,ODBC,操作,需要说明的是,,MFC AppWizard,创建的,Ex_ODBC,应用程序与一般默认的单文档应 用程序相比较,在类框架方面,有如下几点不同:,添加了一个,CEx_ODBCSet,类,它与上述过程中所选择的数据表,score,进行数据绑定,也就是说,,CEx_ODBCSet,对象的操作实质上对数据表进行操作。,将,CEx_ODBCView,类的基类设置成,CRecordView,。由于,CRecordView,的基类是,CFormView,,因此它需要与之相关联的表单资源。,在,CEx_ODBCView,类中添加了一个全局的,CEx_ODBCSet,对象指针变量,m_pSet,,目的是在表单视图和记录集之间建立联系,使得记录集中的查询结果能够很容易地在表单视图上显示出来。,4.,设计浏览记录界面,在上面的,Ex_ODBC,中,,MFC,为用户自动创建了用于浏览数据表记录的工具按钮和相应的“记录”菜单项。若用户选择这些浏览记录命令,系统会自动调用相应的函数来移动数据表的当前位置。,若在表单视图,CEx_ODBCView,中添加控件并与表的字段相关联,就可以根据表的当前记录位置显示相应的数据。其步骤如下。,9.1,数据库和,ODBC,操作,(,1,)按照图,9.9,所示的布局,为表单对话框资源模板添加表,9.3,所示的控件。,图,9.9,控件的设计,9.1,数据库和,ODBC,操作,表,9.3,表单对话框控件及属性,添加的控件,ID,号,标 题,其他属性,编辑框,(,学号,),IDC_STUNO,默认,编辑框,(,课程号,),IDC_COURSENO,默认,编辑框,(,成绩,),IDC_SCORE,默认,编辑框,(,学分,),IDC_CREDIT,默认,(,2,)按快捷键,Ctrl+W,,弹出,MFC,ClassWizard,对话框,切换到,Member Variables,页面,在,Class name,框中选择,CEx_ODBCView,,为上述控件添加相关联的数据成员。与以往添加控件变量不同的是,这里添加的控件变量都是由系统自动定义的,并与数据库表字段相关联的。例如,双击,IDC_STUNO,,在弹出的“,Add Member Variable”,对话框中的成员变量下拉列表中选择要添加的成员变量名,m_pSet,-,m_studentno,,选择后,控件变量的类型将自动设置,如图,9.10,所示。,图,9.10,为控件添加数据成员,9.1,数据库和,ODBC,操作,(,3,)按照上一步骤的方法,为表,9.4,所示的其他控件依次添加相关联的成员变量。需要说明的是,控件变量的范围和大小应与数据表中的字段一一对应。结果如图,9.11,所示。,表,9.4,控件变量,控件,ID,号,变量名,范围和大小,IDC_COURSENO,m_pSet,-,m_course,7,IDC_SCORE,m_pSet,-,m_score,0100,IDC_SREDIT,m_pSet,-,m_credit,120,图,9.11,添加的控件变量图,9.12,Ex_ODBC,最后运行结果,(,4,)编译运行并测试,结果如图,9.12,所示。,9.1,数据库和,ODBC,操作,9.1.3 ODBC,数据表绑定更新,上述,MFC ODBC,应用程序框架中,数据表,score,和,CEx_ODBCSet,类进行数据绑定。但当数据表的字段更新后,例如,若用,Access,将,score,数据表再添加一个“备注”字段名(文本类型,长度为,50,个字符),并关闭,Access,后,就需要为,Ex_ODBC,重新为数据表,score,和,CEx_ODBCSet,类进行数据绑定的更新,其步骤如下:,(,1,)按快捷键,Ctrl+W,,打开,MFC,ClassWizard,对话框,切换到“,Member Variables”,页面。,(,2,)在“,Class name”,的下拉列表中选择“,CEx_ODBCSet,”,,此时,MFC,ClassWizard,对话框的,Update Columns,和,Bind All,按钮被激活,如图,9.13,所示。需要说明的是,,Update Columns,按钮用来重新指定与,CRecordSet,类相关的表,而,Bind All,按钮用来指定表的 字段的绑定,即为字段重新指定默认的关联变量。,图,9.13 “MFC,ClassWizard,”,对话框,9.1,数据库和,ODBC,操作,(,3,)单击,Update Columns,按钮,又弹出前面的“,Database Options”,对话框,选择,ODBC,数据源“,Database Example For VC+”,,如图,9.14,所示。单击,OK,按钮,弹出如图,9.15,所示的“,Select Database Tables”,对话框,从中选择要使用的表。单击,OK,按钮,又回到,MFC,ClassWizard,界面,如图,9.16,所示。,图,9.14 “Database Options”,对话框 图,9.15 “Select Database Tables”,对话框,9.1,数据库和,ODBC,操作,图,9.16,更新后的“,Member Variables”,页面,(,4,)单击,Bind All,按钮,,MFC Wizard,将自动为字段落添加相关联的变量。需要说明的是,在按,Bind All,按钮绑定前最好将已有的字段关联变量删除,以保证数据表字段名更改或删除后与变量绑定的正确性。,9.2MFC ODBC,应用编程,9.2.1,查询记录,使用,CRecordSet,类的成员变量,m_strFilter,、,m_strSort,和成员函数,Open,可以对表进行记录的查询和排序。先来看一个示例,该示例在前面的,Ex_ODBC,的表单中添加一个编辑框和一个,查询,按钮,单击,查询,按钮,将按编辑框中的学号内容对数据表进行查询,并将查找到的记录显示在前面添加的控件中。具体过程如下:,(,1,)打开,Ex_ODBC,应用程序的表单资源,按图,9.17,所示的布局添加控件,其中添加的编辑框,ID,号设为,IDC_EDIT_QUERY,,“查询”按钮的,ID,号设为,IDC_BUTTON_QUERY,。,图,9.17,要添加的控件,9.2MFC ODBC,应用编程,(,2,)用,MFC,ClassWizard,为控件,IDC_EDIT_QUERY,添加关联变量,m_strQuery,。,(,3,)在,CEx_ODBCView,类中添加按钮控件,IDC_BUTTON_QUERY,的,BN_CLICKED,消息映射,并在映射函数中添加,下列代码,:,代码中,,m_strFilter,和,m_strSort,是,CRecordSet,的成员变量,用来执行条件查询和结果排序。其中,,m_strFilter,称为“过滤字符串”,相当于,SQL,语句中,WHERE,后的条件串;而,m_strSort,称为“排序字符串”,相当于,SQL,语句中,ORDER BY,后的字符串。若字段的数据类型是文本,则需要在,m_strFilter,字符串中将单引号将查询的内容括起来,对于数字,则不需要用单引号。,需要注意的是:只有在调用,Open,函数之前设置,m_strFilter,和,m_strSort,才能保证查询和排序有效。如果有多个条件查询,则可以使用,AND,、,OR,、,NOT,来组合,例如下面的代码:,m_pSet,-,m_strFilter,= ,studentno,=21010101 AND,studentno,AddNew,(); /,在表的末尾增加新记录,m_pSet,-,SetFieldNull(&(m_pSet,-,m_studentno,), FALSE);,/,设定,m_studentno,值不为空,(NULL),m_pSet,-,m_studentno,= 21010503;,. /,输入新的字段值,m_pSet,-Update();/,将新记录存入数据库,m_pSet,-,Requery,(); /,刷新记录集,这在快照集方式下是必须的,9.2MFC ODBC,应用编程,2.,删除记录,可以直接使用,CRecordSet:Delete,函数来删除记录。需要说明的是,要使删除操作有效,还需要移动记录函数。例如下面的代码:,CRecordsetStatus,status;,m_pSet,-,GetStatus(status,);/,获取当前记录集状态,m_pSet,-Delete();/,删除当前记录,if (,status.m_lCurrentRecord,=0)/,若当前记录索引号为,0(0,表示第一条记录,),则,m_pSet,-,MoveNext,();/,下移一个记录,else,m_pSet,-,MoveFirst,();/,移动到第一个记录处,UpdateData(FALSE,);,3.,修改记录,函数,CRecordSet:Edit,可以用来修改记录,例如:,m_pSet,-Edit(); /,修改当前记录,m_pSet,-,m_name,=,刘向东,;/,修改当前记录字段值,.,m_pSet,-Update(); /,将修改结果存入数据库,m_pSet,-,Requery,();,9.2MFC ODBC,应用编程,3.,撤消操作,如果用户在进行增加或者修改记录后,希望放弃当前操作,则在调用,CRecordSet:Update,(),函数之前调用,CRecordSet:Move(AFX_MOVE_REFRESH,),来撤消操作,便可恢复在增加或修改操作之前的当前记录。,4.,操作界面,需要说明的是,由于记录的添加和修改往往在同一个界面中进行,会造成一些误操作。因此,在修改和添加记录数据之前,往往设计一个对话框用以获得所需要的数据,然后用该数据进行当前记录的编辑。这样就能避免它们的相互影响,且保证代码的相对独立性。,作为示例,下面的过程是在,Ex_ODBC,的表单视图中增加三个按钮:,添加,、,修改,和,删除,,如图,9.19,所示。单击,添加,或,修改,按钮都将弹出一个如图,9.20,所示的对话框,在对话框中对数据进行编辑后,单击,确定,按钮使操作有效。,9.2MFC ODBC,应用编程,图,9.19,Ex_ODBC,的记录编辑 图,9.20 “,学生课程成绩表”对话框,9.2MFC ODBC,应用编程,(,1,)将,Ex_ODBC,的项目工作区窗口切换到,ResourceView,页面,打开用于表单视图,CEx_ODBCView,的对话框资源,IDD_EX_ODBC_FORM,。参看图,9.19,,向表单中添加三个按钮:,添加,(,IDC_REC_ADD,)、,修改,(,IDC_REC_EDIT,)和,删除,(,IDC_REC_DEL,)。,(,2,)添加一个对话框资源,打开属性对话框将其字体设置为“宋体,9,号”,标题定为“学生课程成绩表”,,ID,号设为,IDD_SCORE_TABLE,。,(,3,)参看图,9.20,,将表单中的控件复制到对话框中。复制时先选中,IDD_EX_ODBC_FORM,表单资源模板“学生课程成绩表”组框中的所有控件,然后按,Ctrl+C,,打开对话框,IDD_SCORE_TABLE,资源,按,Ctrl+V,即可。,(,4,)再将,OK,和,Cancel,按钮的标题分别改为“确定”和“取消”。图中具有,3D,效果的竖直线是用静态图片控件(属性为“框架”、“刻蚀”)构成的。,(,5,)双击对话框模板或按,Ctrl+W,快捷键,为对话框资源,IDD_SCORE_TABLE,创建一个对话框类,CScoreDlg,。,(,6,)打开,MFC,ClassWizard,的,Member Variables,标签,在,Class name,中选择,CScoreDlg,,选中所需的控件,ID,号,双击鼠标或单击,Add Variables,按钮。依次为控件添加控件变量,结果如图,9.21,所示。,9.2MFC ODBC,应用编程,图,9.21,为,CScoreDlg,添加的控件变量,9.2MFC ODBC,应用编程,(,7,)用,MFC,ClassWizard,为,CScoreDlg,添加,IDOK,按钮的,BN_CLICKED,的消息映射,并添加下列代码:,void,CScoreDlg:OnOK,(),UpdateData,();,m_strStudentNO.TrimLeft,();,m_strCourseNO.TrimLeft,();,if (,m_strStudentNO.IsEmpty,(),MessageBox,(,学号不能为空!,);,else,if (,m_strCourseNO.IsEmpty,(),MessageBox,(,课程号不能为空!,);,else,CDialog:OnOK,();,(,8,)用,MFC,ClassWizard,为,CEx_ODBCView,类中的三个按钮:,IDC_REC_ADD,、,IDC_REC_EDIT,和,IDC_REC_DEL,添加,BN_CLICKED,的消息映射,并添加,下列代码,:,(,9,)在,Ex_ODBCView.cpp,文件的开始处添加下列,CScoreDlg,类的头文件包含语句:,#include “,ScoreDlg.h,”,(,10,) 编译运行并测试。,9.2MFC ODBC,应用编程,9.2.3,字段操作,在前面的示例中,虽然可以通过,CRecordSet,对象中的字段关联变量可以直接访问当前记录的相关字段值,但有时在处理多个字段时就不太方便了。,CRecordSet,类中的成员变量,m_nFields,(用于保存数据表的字段个数)和成员函数,GetODBCFieldInfo,及,GetFieldValue,可以简化多字段的访问操作。,GetODBCFieldInfo,函数用来数据表中的字段信息,其函数原型如下:,void,GetODBCFieldInfo,( short,nIndex,CODBCFieldInfo,&,fieldinfo,);,其中,,nIndex,用于指定字段索引号,,0,表示第一个字段,,1,表示第二个字段,以此类推。,fieldinfo,是,CODBCFieldInfo,结构参数,用来表示字段信息。,CODBCFieldInfo,结构体原型如下:,struct,CODBCFieldInfo,CString,m_strName,;/,字段名,SWORD,m_nSQLType,;/,字段的,SQL,数据类型,UDWORD,m_nPrecision,;/,字段的文本大小或数据大小,SWORD,m_nScale,;/,字段的小数点位数,SWORD,m_nNullability,;/,字段接受空值,(NULL),能力,;,9.2MFC ODBC,应用编程,结构体裁中,,SWORD,和,UDWORD,分别表示,short,int,和,unsigned long,int,数据类型。,GetFieldValue,函数用来获取数据表当前记录中指定字段的值,其常用的函数原型如下:,void,GetFieldValue,( short,nIndex,CString,&,strValue,);,其中,,nIndex,用于指定字段索引号,,strValue,用来返回字段的内容。,除了上述字段操作外,,CRecordSet,类的成员函数,GetRecordCount,和,GetStatus,,还可分别用来获得表中的记录总数和当前记录的索引,其原型如下:,long,GetRecordCount,( ) const;,void,GetStatus,(,CRecordsetStatus,&,rStatus,) const;,其中,参数,rStatus,是指向下列的,CRecordsetStatus,结构的对象:,struct,CRecordsetStatus,long,m_lCurrentRecord,;/,当前记录的索引,,0,表示第一个记录,,/ 1,表示第二个记录,依次类推。但,-1,表示在第一个记录之前,,-2,表示不确定。,BOOL,m_bRecordCountFinal,;/,记录总数是否是最终结果,;,9.2MFC ODBC,应用编程,需要注意的是,,GetRecordCount,函数所返回的记录总数在表打开时或调用,Requery,函数后是不确定的,因而必须经过下列的代码才能获得最终有效的记录总数:,while (!,m_pSet,-,IsEOF,(),m_pSet,-,MoveNext,();,m_pSet,-,GetRecordCount,();,例,Ex_Field,字段的编程操作,该示例是用列表视图来显示一个课程信息表,(,参见表,9.5),的全部记录内容,并在状态栏中显示记录总数。具体步骤按如下,4,部分进行:,1,)为数据库,Student.mdb,添加一个数据表,course,用,Microsoft Access,为数据库,Student.mdb,添加一个数据表,course,,如,表,9.5,所示。表中上部分是数据表的记录内容,下部分是数据表的结构内容。需要说明的是,上述字段名最好不要是中文,且一般不能为,SQL,的关键字,no,、,class,、,open,等,以避免运行结果出现难以排除的错误。,9.2MFC ODBC,应用编程,2,)为文档应用程序添加,ODBC,的支持,(,1,)用,MFC AppWizard,创建一个单文档应用程序,Ex_Field,,但在向导的第,6,步将,CEx_FieldView,的基类由默认的,CView,选择为,CListView,类。,(,2,)将项目工作区窗口切换到,FileView,页面,展开,Header Files,所有项,双击,stdafx.h,,打开该文件。,(,3,)在,stdafx.h,中添加,ODBC,数据库支持的头文件包含,#include ,:,#,ifndef,_AFX_NO_AFXCMN_SUPPORT,#include / MFC support for Windows Common Controls,#,endif,/ _AFX_NO_AFXCMN_SUPPORT,#include ,3,)创建数据表,score,的,CRecordSet,派生类,(,1,)按快捷键,Ctrl+W,,打开,MFC,ClassWizard,对话框。单击,Add Class,按钮,从弹出的下拉菜单中选择“,New”,。,(,2,)在弹出的“,Add Class”,对话框中输入类名(,Name,)为,CCourseSet,,指定其基类(,Base class,)为,CRecordSet,,结果如图,9.22,所示。,9.2MFC ODBC,应用编程,图,9.22,定义新的,CRecordSet,派生类,(,3,)单击,OK,按钮,弹出“,Database Options”,对话框。从中选择,ODBC,的数据源“,Database Example For VC+”,,单击,OK,按钮,弹出 “,Select Database Tables”,对话框,从中选择要使用的表,course,。,(,4,)单击,OK,按钮回到,MFC,ClassWizard,界面,单击,确定,按钮后,系统自动为用户生成,CCourseSet,类所需要的代码。,(,5,)在,CEx_FieldView:PreCreateWindow,函数中 添加修改列表视图风格的代码:,BOOL,CEx_FieldView:PreCreateWindow(CREATESTRUCT,&,cs,),cs.style,cs.style,|= LVS_REPORT; /,报表方式,return,CListView:PreCreateWindow(cs,);,9.2MFC ODBC,应用编程,(,6,)在,CEx_FieldView:OnInitialUpdate,函数中添加,下列代码,:,需要说明的是,当为数据源中的某个数据表映射一个,CRecordSet,类时,该类对象一定先要调用,CRecordSet:Open,成员函数,才能访问该数据表的记录集,访问后还须调用,CRecordSet:Close,成员函数关闭记录集。,(,7,)在,Ex_FieldView.cpp,文件的前面添加,CCourseSet,类的头文件包含语句:,#include ,Ex_FieldDoc.h,#include ,Ex_FieldView.h,#include ,CourseSet.h,(,8,)编译运行,结果如图,9.23,所示。,图,9.23,Ex_Field,第一次运行结果,9.2MFC ODBC,应用编程,4,)在状态栏中显示当前记录号和记录总数,(,1,)在,MainFrm.cpp,文件中,向原来的,indicators,数组添加一个元素,用来在状态栏上增加一个窗格,修改的结果如下:,static UINT indicators =,ID_SEPARATOR, /,第一个信息行窗格,ID_SEPARATOR,/,第二个信息行窗格,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;,9.2MFC ODBC,应用编程,(,2,)为,CEx_FieldView,类添加一个成员函数,DispRecNum,成员函数,其代码如下:,void,CEx_FieldView:DispRecNum(CCourseSet,*,pSet,),CString,str,;,CMainFrame,*,pFrame,= (,CMainFrame,*),AfxGetApp,()-,m_pMainWnd,;,/,获得主框架窗口的指针,CStatusBar,*,pStatus,= &,pFrame,-,m_wndStatusBar,;,/,获得主框架窗口中的状态栏指针,if (,pStatus,),CRecordsetStatus,rStatus,;,pSet,-,GetStatus(rStatus,);/,获得当前记录信息,str.Format,(,当前记录,:%d,总记录,:%d,1+rStatus.m_lCurrentRecord,pSet,-,GetRecordCount,();,pStatus,-SetPaneText(1,str);/,更新第二个窗格的文本,9.2MFC ODBC,应用编程,该函数先获得状态栏对象的指针,然后调用,SetPaneText,函数更新第二个窗格的文本。,(,3,)在,CEx_FieldView,类的,OnInitialUpdate,函数处添加下列代码:,void,CEx_FieldView:OnInitialUpdate,(),CString,str,;,while (!,cSet.IsEOF,(),DispRecNum,( &,cSet,);,cSet.Close,();/,关闭记录集,(,4,)在,Ex_FieldView.cpp,文件的开始处增加下列语句:,#include ,Ex_FieldDoc.h,#include ,Ex_FieldView.h,#include ,CourseSet.h,#include ,MainFrm.h,9.2MFC ODBC,应用编程,(,5,)将,MainFrm.h,文件中的保护型变量,m_wndStatusBar,变成公共变量。,(,6,)编译运行并测试,结果如图,9.24,所示。,显示的记录信息,图,9.24,Ex_Field,最后运行结果,9.2MFC ODBC,应用编程,9.2.4,多表处理,数据库中表与表之间往往存在着一定的关系,例如要显示一个学生的课程成绩信息,信息包括学号、姓名、课程号、课程所属专业、课程名称、课程类别、开课学期、课时数、学分、成绩,则要涉及到前面的学生课程成绩表(,score,)、课程表以及学生基本信息表。其中的学生基本信息表如表,9.6,所示。表中上部分是数据表的记录内容,下部分是数据表的结构内容。,表,9.6,学生基本信息表,(student),及其表结构,姓名,(,studentname,),学号,(,sudentno,),性别,(,xb,),出生年月,(birthday),专业,(special),李明,王玲,张芳,陈涛,21010101,21010102,21010501,21010502,true,false,false,true,1985-1-1,1985-1-1,1985-1-1,1985-1-1,电气工程及其自动化,电气工程及其自动化,机械工程及其自动化,机械工程及其自动化,序 号,字段名称,数据类型,字段大小,小数位,字段含义,1,2,3,4,5,studentname,studentno,xb,birthday,special,文本,文本,是,/,否,日期,/,时间,文本,20,10,50,姓名,学号,性别,出生年月,专业,9.2MFC ODBC,应用编程,下面的示例在一个对话框中用两个控件来进行学生课程成绩信息的相关操作,如图,9.25,所示,左边是树视图,用来显示学生成绩、专业和班级号三个层次信息,单击班级号,所有该班级的学生课程成绩信息将在右边的列表视图中显示出来。,图,9.25,Ex_Student,运行结果,9.2MFC ODBC,应用编程,例,Ex_Student,多表处理(按,6,部分来阐述),1,)为数据库,Student.mdb,添加一个数据表,student,用,Microsoft Access,为数据库,Student.mdb,添加一个数据表,student,,如前表,9.6,所示。,2,)创建并设计对话框应用程序,(,1,)用,MFC AppWizard,创建一个默认的基于对话框应用程序,Ex_Student,。,(,2,)在打开的对话框资源模板中,删除,取消,按钮和默认的静态文本控件。调整对话框大小,将对话框的标题文本改为“处理多表”,将,确定,按钮的标题文本改为“退出”。,(,3,)参看图,8.26,的控件布局,向对话框中添加一个树控件,在其属性对话框中,选中“有按钮”、“有线条”、“根部的线”和“总是显示选定内容”属性。,(,4,)向对话框中添加一个列表控件,在其属性对话框中,将“查看”属性选为“报告”。,(,5,)用,MFC,ClassWizard,在,CEx_StudentDlg,类中,添加树控件的控件变量为,m_treeCtrl,,添加列表控件的控件变量为,m_listCtrl,。,3,)添加对,MFC ODBC,的支持及记录集,(,1,)在,stdafx.h,文件中添加,ODBC,数据库支持的头文件包含,#include ,。,(,2,)用,MFC,ClassWizard,为数据表,student,、,course,和,score,分别创建,CRecordSet,派生类,CStudentSet,、,CCourseSet,和,CScoreSet,。,9.2MFC ODBC,应用编程,4,)完善左边树控件的代码,(,1,)为,CEx_StudentDlg,类添加一个成员函数,FindTreeItem,,用来查找指定节点下是否有指定节点文本的子节点,该函数的代码如下:,HTREEITEM,CEx_StudentDlg:FindTreeItem(HTREEITEM,hParent,CString,str,),HTREEITEM,hNext,;,CString,strItem,;,hNext,=,m_treeCtrl.GetChildItem,(,hParent,);,while (,hNext,!= NULL),strItem,=,m_treeCtrl.GetItemText,(,hNext,);,if (,strItem,=,str,)return,hNext,;,else,hNext,=,m_treeCtrl.GetNextItem,(,hNext, TVGN_NEXT );,return NULL;,(,2,)为,CEx_StudentDlg,类添加一个,CImageList,成员变量,m_ImageList,。,(,3,)在,CEx_StudentDlg:OnInitDialog,中添加,下列代码,:,9.2MFC ODBC,应用编程,(,4,)在,Ex_StudentDlg.cpp,文件的前面添加记录集类的包含文件,如下面的代码:,#include ,Ex_StudentDlg.h,#include ,StudentSet.h,#include ,ScoreSet.h,#include ,CourseSet.h,(,5,)编译运行,结果如图,9.26,所示。,图,9.26,Ex_Student,第一次运行结果,9.2MFC ODBC,应用编程,5,)完善右边列表控件的代码,(,1,)在,CEx_StudentDlg:OnInitDialog,函数中添加下列代码,用来创建列表标题头:,BOOL,CEx_StudentDlg:OnInitDialog,(),sSet.Close,();,/,设置列表头,CString,strHeader,=,学号,姓名, ,课程号,课程所属专业,课程名称,课程类别,开课学期,课时数,学分,成绩,;,int,nLong, = 80, 80, 80, 180, 180, 80, 80, 80, 80, 80;,for (,int,nCol,=0;,nCol,itemNew.hItem,;/,获取当前选择的节点,/,如果当前的节点没有子节点,那说明该节点是班级号节点,if (,m_treeCtrl.GetChildItem(hSelItem,) = NULL),CString,strSelItem,str,;,strSelItem,=,m_treeCtrl.GetItemText,(,hSelItem,);,str.Format(studentno,LIKE %s%, strSelItem.Left(6);,DispScoreAndCourseInfo(str,);,*,pResult,= 0;,代码中,调用,DispScoreAndCourseInfo,函数是的参数是用来设置数据表,(,记录集,),打开的过滤条件。,str,是类似的这样内容“,studentno,LIKE 210101%”,,它使得所有学号前面是,210101,的记录被打开。,%,是,SQL,使用的通配符,由于,%,也是,Visaul,C+,格式前导符,因为在代码中需要两个,%,。,(,3,)编译运行并测试。,9.3ADO,数据库编程,9.3.1 ADO,编程的一般过程,在,MFC,应用程序中使用,ADO,数据库的一般过程是:添加对,ADO,的支持;创建一个数据源连接;对数据源中的数据库进行操作;关闭数据源。,这
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!