数据库课程设计报告
- 格式:docx
- 大小:4.13 MB
- 文档页数:22
一.系统概述
1.设计背景
随着高校的扩招,学生数量不断增加,学生信息管理已成为学校管理的重中之重。
传统的管理方法不但效率低,而且还要耗费大量的已经不能满足学校对学生管理的要求。
本系统为提高学生管理的管理水平,优化资源而开发,它解决了学生管理中数据信息量大,修改不方便等问题。
虽然系统中还存在不足和缺陷,但是相信经过以后不断的完善,定会成为学校管理中不可缺少的管理工具。
2.设计目的
使学生在解决现实生活中存在的问题的过程中,进一步巩固对数据哭这门知识的掌握,同时了解数据库系统的开发过程及应用范围,为学生将来的就业打下良好的基础。
3.设计内容
完成一个数据库应用系统的设计全过程,包括需求分析、数据库设计、数据库建立、数据输入、应用系统的设计和开发、用户界面的设计和实现、系统安装和调试等。
二.需求分析
1.功能分析
通过对学生管理过程的研究和分析,要求本系统具有以下功能:
1.学生信息录入。
2.学生成绩录入。
3.成绩等级设置。
4.学生违规处理。
5.学生成绩排行。
6.学生信息查询。
7.学生成绩查询。
用户要输入正确的用户名和密码以后才能登录学生管理系统。
在学生管理系统中,可以通过对主窗口上的按钮对科室信息、科目信息、教师信息、班级信息、班级科目、考试类别进行设置,也可以在“学生管理”菜单中录入学生信息和学生成绩,在录入成绩后,还要对成绩进行等级设置。
当叙述违反学校规定时,要通过学生违规处理将学生和所犯错误进行记录。
在“查询管理”菜单中可以快速队学生信息、学生成绩和学生违规信息进行查询。
2.工作流图
系统工作流图如图2-1。
图2-1
3.数据流图
本系统的数据流图如图2-2.
考试时间安排,成绩通知
处理试卷编写,评定成绩
图2-2
4.数据字典
本系统中采用卡片行式书写数据字典,每张卡片保存一个数据项或数据结构的信息。
其中数据项卡片有学号、学生姓名、班号、科目、教师姓名等,这里为了简洁,只列出学号数据项卡片,如图2-3。
数据结构卡片有科目、学生、教师等,这里也只给出学生数据结构卡片如图2-4。
数据存储卡片有考试结果数据存储卡片如图2-5。
数据流卡片有学生登记表数据流卡片如图2-6。
图2-3
图2-4
图2-5
图2-6
三. 概念模型设计
本系统使用分散-集中设计法设计系统E-R 模型,本系统的数据库实体对象分别为管理员、教师、学生、违规信息、成绩等级、成绩信息。
下面给出这几个实体的E-R 模型图。
1. 管理员实体
管理员实体包括管理员名称和管理员密码,管理员实体E-R 图如图2-1.
图2-1
2. 教师实体
教师实体包括教师姓名、编号、所在办公室、教师文凭和教师职称等,教师实体E-R图如图2-2.
图2-2
3.学生实体
学生实体包括学生编号、学生姓名、学生性别、所在班级、学生年龄、联系电话和联系地址等。
学生实体E-R图如图2-3。
图2-3
4.违规信息实体
违规信息实体包括违规编号、违规内容、处理结果、备注信息和违规时间等。
违规信息E-R图如图2-4。
图2-4
5.成绩等级实体
成绩等级实体包括等级名称、成绩上限和成绩下限。
成绩等级实体E-R图如图2-5。
图2-5
6.成绩信息实体
成绩信息实体包括学生编号、考试科目、来时成绩、考试类别和考试时间。
成绩信息实体E_R图如图2-6。
图2-6
合并局部E-R模型,得到全局E-R模型图,如图2-7.
图2-7
四.逻辑设计
本部分实现的功能是,将上面讨论的E-R模式,转化为关系模型。
具体实现过程如下:
1.E-R图向逻辑模型的转换
数据库名:tb_Student
科室(科室编号、科室名称、电话号码);
班级(班级编号、班级人数);
课程(课程编号、课程名称、任课教师);
选课信息(课程编号、班级编号);
成绩信息(学生学号、课程编号、成绩);
学生信息(学生学号、学生姓名、班级编号、院系名称、性别、年龄、政治身份、民族、籍贯);
违规记录(违规编号、违规时间、违规内容、备注信息、处理结果)
成绩等级(等级名称、成绩上限、成绩下限)。
2.关系模式优化——函数依赖集
F(科室)= { 院系编号<—>院系名称,院系编号—>电话}
F(班级)= {班级编号—>班级人数}
F(课程)= { 课程编号—>课程名称,课程编号—>任课教师}
F(成绩)= {学生学号、课程学号—>成绩}
F(学生信息)= { 学生学号—>学生姓名,学生学号—>班级编号,学生学号
—>院系名称,学生学号—>性别,学生学号—>年龄,学
生学号—>政治身份,学生学号—>民族,学生学号—>籍
贯}
3.分析:不存在非主属性和主属性对码的部分函数依懒和传递函数依赖,因此
满足BCNF。
4.逻辑设计结果:
本例使用的是SQL Sever2000数据库,在SQL Sever2000数据库中设计出本系统的表结构如下:
(1)tb_user(管理员信息表),用来保存管理员的信息,如图4-1。
图4-1
(2)tb_teacher(教师信息表),用来保存教师的信息,如图4-2.
图4-2
(3)tb_studentinfo(学生信息表),用来保存学生基本信息,如图4-3.
图4-3
(4)tb_regbreakinfo(违规信息表),用来保存学生的违规信息,如图4-4.
图4-4
(5)tb_gradelevel(成绩等级表),用来记录成绩等级信息,如图4-5。
图4-5
(6)tb_examinfo_sub(成绩信息表),用来记录成绩信息。
如图4-6.
图4-6
五.源代码及查询截图
1.公共类设计
本系统使用ODBC连接数据源,可以通过CDatabase类的Open函数连接数据库,Open函数用于创建到数据源的连接。
其函数声明如下:
virtual BOOL Open(LPCTSTR lpszDSN,BOOL bExclusive= FALSE,BOOL bReadOnly= FALSE, LPCTSTR lpszConnect = “ODBC;”,BOOL bUseCursorLib=TRUE);
在CMystudentsysApp类中构造一个CDatabase类对象,在InitInstance函数中连接到数据源。
代码如下:
BOOL CMystudentsysApp::InitInstance()
{
if (CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化COM支持库失败!");
exit(1);
}
try
{
CString strConnect;
strConnect.Format("DSN=mystudentsys;"); //设置连接字符串
//判断连接是否成功
if (m_DB.Open(NULL,false,false,"ODBC;DSN=mystudentsys;UID=Sa;PWD=;")==0)
{
AfxMessageBox("Unable to Connect to the Specified Data Source");
return FALSE ;
}
}
catch(CDBException *pE)
{
pE->ReportError();
pE->Delete();
return FALSE;
}
……
}
2.科目信息管理
科目信息管理用于维护科目信息,主要实现科目的添加、修改和删除等操作。
本系统使用ODBC连接数据源,在进行对数据表的操作时可以以CRecordset类为基类派生一个数据表映射类,这样可以方便操作数据表。
派生数据表映射类的步骤如下:
(1)创建一个与数据表映射的类名CSubjectinfo,其基类为CRecordset.
(2)在Database Options对话框中选择ODBC,在其下拉列表中选择mystudentsys数据源。
(3)单击OK按钮打开“SQL Server登录”对话框,单击“确定”按钮,打开Select Database Tables对话框。
(4)在影射类CSubjectifo的头文件中引入afxdb.h头文件。
科目信息管理实现过程:
(1)创建一个对话框,设置其ID为IDD_Dig_subjectinfo,标题为“科目信息管理”。
(2)向对话框中添加一个群组控件、两个静态文本控件和两个编辑对话框控件。
(3)创建一个工具栏资源IDR_TOOLBAR_subjectifo。
(4)为创建的对话框添加一个类,类名为CSubjectdlg。
在该类的头文件中引入Subjectinfo.h头文件,使其可以使用映射类CSubjectinfo。
(5)向对话框中添加OnInitDialog函数,在对话框初始化时创建工具栏并打开本模块实验的数据表。
具体代码见源代码。
(6)自定义一个DisplayRecord函数,在记录集指针移动时为控件赋值。
代码如下:
bool CSubjectdlg::DisplayRecord()
{
if(mysubjectset->IsEOF()&&mysubjectset->IsBOF()) //判断是否移动
到了开头和结尾
{
m_subjectname = "";
m_subjectid = "";
}
else
{
if(mysubjectset->IsBOF()) //移动到了开头,就向后移动
{
mysubjectset->MoveNext();
}
else //否则前移
{
if(mysubjectset->IsEOF())
{
mysubjectset->MovePrev();
}
}
}
m_subjectname = mysubjectset->m_subject; //对应变量赋值
m_subjectid = mysubjectset->m_code;
UpdateData(FALSE);
return TRUE;
}
(7)处理工具栏“添加”按钮的单击事件,代码如下:
void CSubjectdlg::Onsubjectinfotoolbaradd()
{
// TODO: Add your command handler code here
m_subjectname = "";
m_subjectid = "";
UpdateData(FALSE);
}
(8)处理工具栏中“保存”按钮的单击事件,代码如下:
void CSubjectdlg::Onsubjectinfotoolbarsave()
{
// TODO: Add your command handler code here
UpdateData(TRUE);
if(m_subjectname.IsEmpty()||m_subjectid.IsEmpty())
{
AfxMessageBox("请输入相应的数据!");
return ;
}
CString sqlStr_findid;
sqlStr_findid = "SELECT * FROM tb_subject WHERE tb_subject.code='"+m_subjectid+"' ";
mysubjectset_find = new CSubjectinfo(&((CMystudentsysApp*)AfxGetApp())->m_DB);
if(!mysubjectset_find->Open(AFX_DB_USE_DEFAULT_TYPE,sqlStr_findid ))
{
AfxMessageBox("tb_subject 表打开失败!");
}
if(mysubjectset_find->GetRecordCount()!=0)
{
AfxMessageBox("科目代码不能重复,请修改后再输入!");
if(mysubjectset_find->IsOpen())
{
mysubjectset_find->Close();
delete mysubjectset_find;
}
return;
}
if(mysubjectset_find->IsOpen())
{
mysubjectset_find->Close();
delete mysubjectset_find;
}
mysubjectset->AddNew(); //调用添加记录的函数处理
mysubjectset->m_subject = m_subjectname; //对应变量更新
mysubjectset->m_code = m_subjectid;
try
{
mysubjectset->Update();
mysubjectset->Requery();
AfxMessageBox("成功保存数据!");
}
catch( CDBException* e )
{
AfxMessageBox( e->m_strError,MB_ICONEXCLAMATION );
e->Delete();
}
DisplayRecord(); //更新显示
}
(9)处理工具栏中的“删除”、“第一条”、“上一条”、“下一条”和“末一条”
按钮的单击事件,源代码参见CSubjectdlg类中的Onsubjectinfotoolbardel()、Onsubjectinfotoolbarfirst()、Onsubjectinfotoolbarpre() 、
Onsubjectinfotoolbarnext() Onsubjectinfotoolbarlast(),这里就不再一一列出
了。
3.学生信息管理模块
学生信息管理用于设置学生的基本信息,主要实现对学生基本信息的添加、修改和删除等操作。
学生信息管理实现过程:
(1)创建一个对话框,打开对话框属性窗口,设置其ID为IDD_DIginfostudent,标题为“学生信息管理”。
(2)向对话框中添加1个群组控件,7个静态文本控件和7个编辑框控件。
(3)以CRecordset类为基类派生一个CStudentinfoset类。
(4)向对话框中添加OnInitDialog方法,在对话框初始化时创建工具栏并打开本模块使用的数据表。
其实现代码如下:
BOOL CInfoStudent::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
if(!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_SIZE_DYNAMIC)
||!m_ToolBar.LoadToolBar(IDR_TOOLBAR_subjectinfo))
{
TRACE0(_T("创建工具条失败\n"));
return FALSE;
}
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
AFX_IDW_CONTROLBAR_LAST, 0);
m_ToolBar.SetButtonStyle(0,TBBS_CHECKBOX);
m_ToolBar.SetButtonStyle(1,TBBS_CHECKBOX);
m_ToolBar.SetButtonStyle(2,TBBS_CHECKBOX);
m_ToolBar.SetButtonStyle(3,TBBS_CHECKBOX);
m_ToolBar.SetButtonStyle(4,TBBS_CHECKBOX);
m_ToolBar.SetButtonStyle(5,TBBS_CHECKBOX);
m_ToolBar.SetButtonStyle(6,TBBS_CHECKBOX);
// TODO: Add extra initialization here
//RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBA R_LAST,0);
CString sqlStr;
sqlStr="SELECT * FROM tb_studentinfo";
mystudentset = new CStudentinfoset(&((CMystudentsysApp*)AfxGetApp())->m_DB);
if(!mystudentset->Open(AFX_DB_USE_DEFAULT_TYPE,sqlStr)) //打开数据表
{
AfxMessageBox("tb_studentinfo表打开失败!");
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
(5)处理工具栏“添加”、“保存”、“删除”按钮,使其分别与数据库中的相应功能对应。
其中处理“保存”函数代码如下:
void CInfoStudent::Onsubjectinfotoolbaradd()
{
// TODO: Add your command handler code here
m_studentaddr = "";
m_studentage = 0.0f;
m_studentclass = "";
m_studentname = "";
m_studentphone = "";
m_studentsex = "";
m_studentid = "";
UpdateData(FALSE);
}
为了简洁起见,其他按钮处理函数请参考源程序,这里不再赘述。
(6)分别处理工具栏中“第一条”、“上一条”、“下一条”和“末一条”按钮的单击事件,当工具栏按钮按下时,实现显示相应功能。
4.学生成绩录入模块
学生成绩录入管理用于记录学生的考试成绩。
在录入学生成绩时,应保证同一学生的考试科目、考试时间、考试类别不能重复。
学生成绩录入窗口如图4-4. 向数据表中添加记录,首先要打开记录集,可以使用CRecordset类的Open函数来实现。
其函数声明如下:
CRecordset::Open
virtual BOOL Open(UINT nOpenType=AFX_DB_USE_DEFAULT_TYPE,
LPC TSTR lpszSQL=NULL,DWORD dwOptions=none);
throw(CDBException, CMemoryException
参数定义见MSDN。
学生成绩录入的实现过程:
(1)创建一个对话框,设置其ID为IDD_DIginfostudent,标题为“学生成绩录入”
(2)向对话框中添加1个群组控件、6个静态文本控件、4个编辑框控件、1个时间和2个按钮控件。
(3)以CRecordset类为基类派生一个CExaminfo_submarkset类。
(4)向对话框中添加OnInitDialog方法,在对话框初始化时打开本模块使用的数据表。
其函数代码如下:
BOOL CExaminfo_submarkdlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CString sqlStr;
sqlStr = "SELECT * FROM tb_examinfo_sub";
myexamsubmarkset = new CExaminfo_submarkset(&((CMystudentsysApp*)AfxGetApp())->m_DB);
if(!myexamsubmarkset->Open(AFX_DB_USE_DEFAULT_TYPE,sqlStr)) //打开数据表
{
AfxMessageBox("tb_examinfo_sub表打开失败!");
}
m_examdate = CTime::GetCurrentTime();
UpdateData(FALSE);
return TRUE;
}
(5)处理“保存”单击事件,将学生趁机保存到数据表中。
在保持数据时,程序首先检查数据是否合法,如果不合法,则进行提示并退出操作。
其函数代码见CExaminfo_submarkdlg::Oninputsavemarks()。
5.成绩等级管理模块设计
成绩等级管理用于对学生的考试成绩进行等级分类,这样有助对不同程度的学生成绩进行查询。
学生成绩等级管理窗口如图4-5.
CRecordset类代表一个数据源中的记录集,通过该类的成员函数可以实现对数据库中记录的各种操作。
最常用的就是记录集指针移动函数。
成绩等级管理实现过程:
(1)创建一个对话框,设置其ID为IDD_DIggrade_leveldlg,设置话框标题为“成绩等级设置”.
(2)向对话框中添加1个群组控件、3个静态文本控件、2个编辑框控件、1个组合框控件、1个列表视图控件和5个按钮控件。
(3)以CRecordset类为基类派生一个CGrade_levelset类。
(4)向对话框中添加OnInitDialog方法,在对话框初始化时打开本模块使用的数据表。
代码CGrade_levelset::OnInitDialog().
(5)处理“设置”按钮的单击事件,根据编辑框中的分数设置将学生成绩划分为4个等级。
相应实现代码如下:
void CGrade_levelinfodlg::OnBtnsetgradelevel()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_gradekindC.GetWindowText(m_gradekind);
if(m_gradekind.IsEmpty())
{
AfxMessageBox("请输入相应的数据!");
}
CString sqlStr;
sqlStr = "SELECT * FROM tb_gradelevel WHERE tb_gradelevel.grade_level='"+m_gradekind+"'";
gradelevel_findset = new CGrade_levelset(&((CMystudentsysApp*)AfxGetApp())->m_DB);
if(!gradelevel_findset->Open(AFX_DB_USE_DEFAULT_TYPE,sqlStr)) //打开数据表
{
AfxMessageBox("tb_gradelevel表打开失败!");
}
gradelevel_findset->Edit();
gradelevel_findset->m_up_grade = m_upgrade; //对应变量更新
gradelevel_findset->m_low_grade = m_lowgrade;
gradelevel_findset->Update();
gradelevel_findset->Requery();
AfxMessageBox("设置成功!");
DisplayRecord(); //更新显示
if(gradelevel_findset->IsOpen())
{
gradelevel_findset->Close();
delete gradelevel_findset;
}
}
(6)自定义一个DidplayRecord方法,在记录集指针移动时为控件赋值。
(7)分别处理“优秀查询”、“良好查询”、“及格查询”、“不及格查询”按钮单击事件,查询相应等级下的学生成绩记录。
代码见CGrade_levelinfodlg类
中的OnBtnfindbest()、OnBtnfindbetter()、OnBtnfindnormal()以及
OnBtnfindworse(),这里不再赘述。
6.学生违规查询模块设计
学生违规查询用于查询违规的学生信息,通过学生编号可以查询粗该学生的所以违规记录。
学生违规查询如图4-6所示。
在查询时,系统将查询出的结果通过控件显示,这就要用的对话框数据交换(DDX),DDX用于对话框及其相关控件的初始化,并实现控件与对话框之间的数据交换。
DDX机制的函数声明如下:
virtual void DoDataExchange(C DataExchange*pDX);
学生违规查询实现过程:
(1)创建一个对话框,设置其ID为IDD_DIggrade_leveldlg,标题为“成绩等级设置”。
(2)向对话框中添加2个群组控件、5个静态文本控件、4个编辑框控件、1个时间控件、1个列表视图控件和1个按钮控件、
(3)以CRecordset类为基类派生一个CRegbrreskinfoset类。
(4)向对话框中添加OnInitDialog方法,在对话框初始化时设置列表视图控件的表头和列宽度。
代码如下:
BOOL CRegbreak_finddlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_list2.InsertColumn(0,"违规内容");
m_list2.InsertColumn(1,"处理结果");
m_list2.InsertColumn(2,"备注");
m_list2.InsertColumn(3,"时间");
RECT rect;
m_list2.GetWindowRect(&rect);
int wid = rect.right - rect.left;
m_list2.SetColumnWidth(0,wid/4);
m_list2.SetColumnWidth(1,wid/4);
m_list2.SetColumnWidth(2,wid/4);
m_list2.SetColumnWidth(3,wid/4);
m_list2.SetExtendedStyle(LVS_EX_FULLROWSELECT);
return TRUE;
}
(5)自定义一个DispayRecord方法,在记录集指针一直时为控件赋值。
代码参见CRegbreak_finddlg类中的DispayRecord函数,这里不再赘述。
(6)处理“查询”按钮的单击事件,查询指定编号学生的违规信息。
代码如下:void CRegbreak_finddlg::OnBtnfindregbreakinfo()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CString sqlStr;
sqlStr="SELECT * FROM tb_regbreakinfo WHERE studentid='"+m_studentid+"'";
myregbreakset_find = new CRegbrreakinfoset(&((CMystudentsysApp*)AfxGetApp())->m_DB);
if(!myregbreakset_find->Open(AFX_DB_USE_DEFAULT_TYPE,sqlStr))
{
AfxMessageBox("tb_regbreakinfo表打开失败!");
}
if(myregbreakset_find->GetRecordCount() == 0)
{
AfxMessageBox("此学生没有违规记录!");
return;
}
DisplayRecord();
if(myregbreakset_find->IsOpen())
{
myregbreakset_find->Close();
delete myregbreakset_find;
}
}
7.数据库连接方法
运行本实例需要配置用户DSN,在ODBC数据源管理器中配置用户DSN连接指定的SQL Server数据库。
关键操作步骤如下:
(1)单击“开始”按钮,选择“程序”→“管理工具”→“数据源(ODBC)”
命令,打开“ODBC数据源管理器”对话框,打开“用户DSN”选项卡。
(2)单击“添加”按钮,打开“创建新数据源”对话框,选择安装数据源的驱动程序,这里选择“SQL Server”。
(3)单击“完成”按钮,打开“创建到SQL Server的新数据源”对话框,在“名称”文本框中设置数据源名称为“mystudentsys”,在“描述”文本框设置数据源描述为“配置SQL Server数据库DSN”,在“服务器”下拉列表框中选择连接的数据库所在服务器为“(local)”。
(4)单击“下一步”按钮,选择“使用用户输入登录ID和密码的SQL Server验证”单选框,在“登录ID”文本框中输入SQL Server用户登录ID,这里为“sa”,在“密码”文本框中输入SQL Server用户登录密码。
(5)单击“下一步”按钮,选择“更改默认的数据库为”复选框,并在其下拉列表框中选择连接的数据库名称,这里选择“tb_student”,单击“下一步”
按钮。
(6)单击“完成”按钮,打开“ODBC Microsoft SQL Server安装”对话框,显示新创建的ODBC数据源配置信息。
(7)单击“测试数据源”按钮测试数据库连接是否成功,如果测试成功,单击“确定”按钮,完成数据源配置。
8.程序流程图
9.查询截图
(1)主窗口设计
(2)科目信息管理窗体查询窗口:
(3)学生信息管理窗体下一条窗口:
(4)学生成绩录入窗口:
(4)成绩等级管理窗口:
(6)学生违规查询窗口:
六.总结
1.如何解决按Enter键关闭程序?
使用VC++开发的应用程序,在默认情况下,按下Enter键,程序会自动关闭。
这是因为在默认情况下,按Enter键会直接调用对话框的OnOK函数。
解决这个问题的办法是重载OnOK函数,在函数头添加代码如下:
Virtual void OnOK();
在源文件中添加OnOK 函数的实现,在实现函数中不添加任何代码,这样就解决了按Enter键关闭对话框的问题。
2.如何使程序在连接ODBC是不现实连接数据源的对话框?
在本程序完成时,由于连接数据表时使用的是CRecordset类的派生类,所以在操作数据表前都会染成连接数据源的对话框,可是,一个应用程序种如果频繁的弹出连接数据源对话框会非常麻烦,我们必须寻找解决的办法。
先看一下CRecordset类的派生类构造函数,会发现原来在构造时没有连接数据源,所以才会出现这个问题。
我们以CTeacherinfoset类为例,先声明一个CTeacherinfoset 类的指针myteacherset,然后通过如下代码连接数据源。
CString sqlStr;
sqlStr="SELECT*FROM tb_teacher";
myteacherset=new
CTeacherinfoset(&(CMystudentsysApp*)AfxGetApp())->m_DB);
if(!myteacherset->Open(AFX_DB_USE_DEFAULT_TYPE,sqlStr))
{
AfxMessageBox("tb_teacher表打开失败!");
这样,在打开数据表时就不会itanc连接数据源对话框了。
3.通过本次课程设计,你学到了什么?
经过一周的学习,在老师的耐心指导下,我终于完成了本次课程设计。
这次课程设计让我巩固了数据库中E-R模型的设计以及概念模型的设计方法,同时对VC++的使用有了进一步了解,本次课设中,我很欣喜的学会了用MSDN查阅MFC相关函数的定义和声明,这对我的函数实现过程起到很大帮助。
当然我所完成的系统并不完善,而我本人所掌握的知识还很有限,今后我会利用课余时间进一步提高自己的知识储备量,掌握好数据库这门技术。