学生管理系统的C++的数据库编程第1节数据库的逻辑设计在下面的讨论中,结合本教科书,不妨做“学生成绩管理数据库”,它有三个数据表:学生信息表(学号/C/8,姓名/C/8,性别/C/6,出生日期/C/10,身高/C/4,专业/C/16)表名为StudentTable(number,name,sex,birthdate,height,specialty)课程表(课程号/C/8,所属专业/C/20,课程名/C/10,学分/C/4,考试时间/C/10)表名为CourseTable(CourseNumber,ForSpecial,CourseName,TotalCredit,TestDate)学生成绩表(学号/C/8,课程号/C/8,成绩/C/6)(studentNO,courseNo,score)表名为StudentScoreTable★在表的数据结构设计中,字段名尽量采用“可读性”较好的标识符,在程序中看到它,也就知道它实际含义,即“说明”处的文字解释。★上面的数据库,不管是在ACCESS系统中设计的,还是在SQLServer系统中设计的,VC++的使用和SQL语句引用的方式是一样的、效果是一样的。★C++特别适合做“文本(类型CString)”处理。在学生成绩管理数据库中,各字段一律定义为“文本型”,当字段实际类型是数值型或要做算术运算时,C++提供了将数值字符串转换为算术型量转换函数:atoi(str)、atol(str)依次将串转换为int、long;而atof(str)转换double或float型。第2节数据库管理系统和数据库的物理设计2.1用SQLServer系统创建学生成绩管理数据库★具体过程省略2.2将创建的数据库添加到系统数据源ODBC的“用户DSN”中第一步:操作:“开始/控制面板/管理工具/ODBC数据源”,则弹出“ODBC数据源管理器”对话框。先选择“用户DSN”,再按“添加(D)…”按钮:第二步:按“添加”按钮之后,又弹出下面“创建新数据源”对话框:第三步:取数据源的驱动程序“SQLServer”之后,按“完成”按钮。输入数据源名称,数据源描述和SQLServer所在服务器名称或者IP地址。服务器名称可以是SQLServer所在机器名称,也可以是IP地址。单击下一步按钮。第四步:选择登录SQLServer时的身份验证方式。并输入登录SQLServer时所用到的用户名和密码。如下图所示:第五步:选择选项,否则默认数据库是master。然后选择您想要连接的数据库。其余的按默认设置,如下图所示。然后单击下一步按钮。第六步:按默认设置,单击完成按钮。第七步:这里给出了数据库连接的摘要信息,如果想测试一下是否能够连接到数据库,可以单击按钮,会出现测试结果,如下图所示。打击确定完成连接。连接数据库的时候,一定要输入和刚才数据源名称一致的dsn。如dsn=StudentAndJava。第3节C++开发应用程序的基本知识3.1VC++系统的几个重要的英文词语(1)Identifier标识符(俗话讲“名字”),缩写词是ID。(2)MFCMicrosoftFoundationClassLibrary微软的基础类库。(3)Application(App)泛指“应用”(程序)。(4)APIApplicationProgrammingInterface应用程序接口。(5)AFXApplicationFrameworks应用程序框架。(6)AppWizard应用程序向导。(7)WorkSpaceVC++的工作空间视窗,有三个页(面):ClassView页:“类”视图页,展示当前应用程序所用的类。ResourceView页:“资源”视图页,展示当前应用程序所用的资源(如Dialog和Menu等)。FileView页:“文件”视图页,展示当前应用程序所存放的文件(如扩展名为.cpp、.h文件)。(8)ODBCOpenDatabaseConnectivity(开放的数据库连接)。为各种类型的数据库管理系统提供了统一的编程接口,例如不同数据库系统的驱动程序。3.2MFC中提供的基类(BaseClass)(1)CObject是大多数类的基类,完成动态空间的分配与回收,支持一般诊断与出错处理。(2)CCmdTarget负责将系统事件(消息)和窗口事件(消息)发送给响应该事件的对象。(3)CWinApp是CCmdTarget类的派生类,完成对线程的控制(线程的建立、运行、终止、挂起)。(4)CDocument是文档类,包括应用程序在运行期间所得到的数据。(5)CWnd是通用窗口类,提供Windows中的所有通用特性、对话框和控件。(6)CFrameWnd是从CWnd继承来的,实现了标准的框架应用程序。(7)CDialog用来控制对话框窗口。(8)CView用于让用户通过窗口来访问文档。(9)CMDIFameWnd是一个简化的窗口框架(没有最大化和最小化按钮),用于多文档应用程序的主框架窗口的显示和管理。(10)CMDIChildWnd用于文档子窗口的显示和管理。(11)动态记录集CRecordSet选择和连接ODBC中数据库的某个“表”。3.3C++的对话框(表单视图)中最基本“控件”的使用(1)静态文本(StaticText)设计“标签”,默认的ID是“IDC_STATIC”。不接受用户的输入,不产生通知消息。例如,书写数据库的字段名、提示词。(2)组框(GroupBox)定义一个矩形框,默认的ID是“IDC_STATIC”。矩形框内可以放按钮等控件,使界面设计“好看”一点。(3)编辑框(EditBox)在对换话框中用于设计文本数据的显示或输入,系统默认的ID是“IDC_EDIT1”,用其属性对换话框中“General”选项后,用户可重新命名字(例如:IDC_STATIC_number)。(4)命令按钮(Button)映射消息:BN_CLICKED单击,BN_DOUBLECLICKED双击,响应“单击”消息的是“事件(Events)”函数程序。系统默认的ID是IDC_BUTTON1。★C++中的消息驱动机制Windows的环境中,系统产生的动作和用户程序运行产生的动作“称为”事件(Events)产生的消息(Message),Windows是通过系统发送消息来完成用户输入的。例如:用户按鼠标左按钮,系统发送WM_LBUTTONDOWN消息;用户敲一个字符键,系统发送WM_CHAR消息;COMMAND用户进行菜单选择、工具按钮单击等操作,系统发送WM_消息;★C++中的资源应用程序中的光标、菜单、工具栏、位图、对话框、.....,都是资源,系统都用相应的“标识符”来区分。这些资源,像VC++中的常量一样,可以被编辑和修改。VC++的许多编辑器,都能达到“所见即所得”的设计效果。例如:IDOK为对话框中“确认”,IDCANCEL为对话框中“取消”,BN_CLICKED为单击按钮。★Windows的动态连接库(.DLL)实现用户界面、在屏幕上显示文本和图形,都是通过动态连接库来实现的。动态连接库是一些具有扩展名为DLL文件,文件中是一些特殊结构的函数。例如:USER32.DLL,负责窗口管理,功能有消息、菜单、光标、计时器,其它与控制窗口显示相关的功能。3.4在C++中创建一个工程(Project)并且附带数据库的基本步骤(1)在C++环境中,选择菜单“文件/新建”,在弹出的“新建”对话框中,取“工程/MFCAppWizard(exe)/给工程命名”。例如,工程名是“学生成绩管理”:(2)在MFC向导的第1步,选择“S单个文档”(或M多重文档),然后按“下一步”按钮。即,要创建一个表单视图(界面),在界面上设置各种“控件”:(3)在MFC向导的第2步,取“W数据库查看使用文件支持”,并通过命令DataSource去浏览已经存放在ODBC中的数据库及其数据库中的一个表:数据库和数据表选择成功后,按MFC向导对话框中“完成”按钮以及最后的“确定”按钮,就进入下面的C++的MFC开发环境。可以用“工具箱”中的控件在界面上设计了,例如控件(标签、文本框、组框、命令按钮,在工具箱中的图标依次是)。注意:“W数据库查看使用文件支持”将数据库与表单视图连接在一起,或者说建立了“表单视图与记录集”之间的联系,系统自动产生了程序操作数据库的指针m_pSet-。第4节用C++做应用程序开发中的技术或技巧的汇总4.1数据库指针“m_pSet-”常用的成员函数(完成不同的功能)(1)激活界面中控件UpdateData(TRUE);激活表单中控件,例如m_Name、m_Number、m_Result…等。UpdateData(FALSE);使用户能看见表单视图(界面上)当前记录的m_Name、m_Number、…等的变化(2)数据指针的位置的确定m_pSet-IsEOF()是否遇到数据表尾,“是”返回值为真。m_pSet-IsBOF()是否为数据表文件头。m_pSet-MoveFirst();指向第1个记录m_pSet-MoveNext();指向当前位置的下一个记录m_pSet-MovePrev();指向当前位置的前一个记录m_pSet-MoveLast();指向最后一个记录m_pSet-m_字段名;(例如:学号字段,m_pSet-m_number)(3)在数据库中添加一个新记录m_pSet-AddNew();追加一条新记录的功能函数在此语句之后,书写向数据库追加的记录的各个字段。最后写下面两句换话:m_pSet-Update();新记录写入数据库的数据表。m_pSet-Requery();刷新记录集。这将改动“物理”数据库。(4)删除数据库中当前显示的记录m_pSet-Delete();删除“当前显示”的记录时,有时会出现“已删除”字样回显。(5)执行“统计或查询”类命令的一般程序模式在对话框上添加一个“命令按钮”,再创建该命令的事件(Events...)函数,在函数体内书写程序,组织“循环、判定、数据指针移位”等操作。例如:m_pSet-MoveFirst();while(!m_pSet-IsEOF())没有遇到数据表尾时继续循环。{统计和判断语句;放结果信息的控件m_Result成员变量;MessageBox(按确定键看下一个记录,对话框,0);m_pSet-MoveNext();}4.2应用程序执行时的“人机交互”办法可以引用系统内部的人机交互对话框,下面的是它们一般格式:AfxMessageBox(提示信息,int,int);窗口标题不能自己确定MessageBox(提示信息,窗口标题,int);可以自己确定窗口标题(1)AfxMessageBox(窗口内提示信息,标题默认为项目名,100,10);返回值是整数。有“是(Y)”、“否(N)”两个按钮,选择“是(Y)”函数返回值6、“否(N)”函数返回值7。(2)MessageBox(窗口内提示信息,窗口标题,0);只有一个“确定”按钮,返回值是整数1。如果是intflag=MessageBox(窗口内提示信息,窗口标题,100);有“是(Y)”、“否(N)”两个按钮,选择“是(Y)”函数返回值6、“否(N)”函数返回值7。用户在程序中用if语句判flag中保存的返回值,决定执行“则”或“否则”动作。(3)利用字符串“并置”运算,将记录的各个字段“合并”到1个字符串变量中,放到MessageBox()或者AfxMessageBox()中,作为提示信息随时输出。例如:CStringinfo=\0;info=学号:\t+m_pSet-m_number+\n;info+=姓名:\t+m_pSet-m_name+\n;info+=性别:\t+m_pSet-m_sex+\n;info+=身高:\t+m_pSet-m_column1+\n;info+=出生日期:\t+m_pSet-m_birthdate+\n;if(查询条件满足){MessageBox(info,查询到