基于ODBC数据库的通讯录课程设计报告.docx
《基于ODBC数据库的通讯录课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于ODBC数据库的通讯录课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
![基于ODBC数据库的通讯录课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/26/39c2e122-1fd6-4d70-baa9-fa368e894c32/39c2e122-1fd6-4d70-baa9-fa368e894c321.gif)
基于ODBC数据库的通讯录课程设计报告
程序设计实践训练课程设计报告
姓名:
班级:
学号:
指导老师:
日期:
2010.12.20~2010.12.31
摘要
计算机网络的快速发展,让我们的生活日新月异,电脑在各个领域占据着越来越重要的地位。
达到有效利用电脑来发现连接在今天的fast-certification人与人之间的社区是一个非常重要的问题。
通讯连结的前提下,我们必须要有联系的人我们想接触。
通讯录是一种工具,广泛用于日常生活,各自的功能引起了极大的方便。
但也正因为此,设计布局,以使系统简单,易于理解,全功能的通讯录是非常重要的。
在这个过程中设计,我们用MicrosoftAccess2003年,以构建一个数据库文件,然后在数据库文件创建一个许多领域数据库文件后,与VisualC++通过视窗XPODBC驱动连接,使用VisualC++文档结构设计数据库应用程序实现添加、修改、删除、查询,记录的功能。
美丽的界面设计让人们可以使用对话框来实现和谐人机交互。
目录
1.方案比较与选择…………………………………………………………………4
1.1方案描述………………………………………………………………………4
1.2方案比较………………………………………………………………………5
1.3方案选择………………………………………………………………………5
2.系统分析与设计……………………………………………………………………5
2.1系统分析………………………………………………………………………5
2.2系统框图………………………………………………………………………6
2.3数据库设计……………………………………………………………………7
3系统功能实现与代码编写…………………………………………………………7
3.1准备工作………………………………………………………………………7
3.2界面设计………………………………………………………………………9
3.3连接数据库…………………………………………………………………11
3.4代码编写……………………………………………………………………11
3.5关键技术分析………………………………………………………………21
4.讨论及进一步研究和建议………………………………………………………21
5.成果显示…………………………………………………………………………22
6.课程设计心得与体会……………………………………………………………24
Abstract………………………………………………………………………………25
参考文献……………………………………………………………………………25
1.方案比较与选择
1.1方案描述
方案一:
在MFC中进行数据库编程需要涉及4个基本的数据库类:
CDatabase、CRecordest、CRecordView和CDException。
一个CDatabase对象代表与数据源的一个链接。
创建一个CDatabase对象后,就可以调用Open或OpenEx成员函数打开指定的数据源,从而建立起与底层数据源的链接。
应用程序可以通过ExecuteSQL函数向数据源发出一条不需要返回数据的语言。
CDatabase对象在使用完毕后通过Close函数关闭与数据源的连接。
一个CRecordset对象代表从一个数据源检索出的一组记录。
CRecordset类支持多种类型的记录集,常用的是动态集类型dynaset和快照类型snapshot。
动态集类型是数据的动态集合,它支持双向滚动,能够与数据源的其他用户做出的更新保持同步;快照类型则是记录集被填充时数据的静态映像,它也支持双向滚动,但是不能保证与其他用户保持同步。
如果使用快照类型的应用程序需要查看其他用户做出的改动,必须先关闭记录集后再重新打开。
不管使用哪种类型的数据集,在数据集中添加或删除纪录之后都要调用Requery函数来更新数据集。
构造CRecordset对象时需要一个CDatabase对象。
如果将这个参数设置为控制NULL,系统将创建一个临时的CDatabase对象。
通过CDatabase的Open函数能够打开数据集并且执行默认的查询语句从数据源中获取数据,函数Close则用于关闭数据集、切断数据集和数据源的连接。
在数据集中移动当前记录可以通过函数MoveFirst、MoveLast、MoveNext和MovePrev进行。
如果添加和修改记录,需要先将记录集设置为AddNew和Edit状态,然后对数据集的变量进行赋值,最后通过Update函数完成写入操作。
删除记录操作则通过Delete函数来完成。
在执行数据库操作时可能会引发CDBException类型的异常。
CDBException类由异常CException派生而来,成员m_strError指明了造成异常的原因,RecordError函数则能够直接弹出一个对话框说明造成异常的原因。
CRecordView用对话框控件来显示数据库记录,可以把它看作是具有数据库操作功能的试图类,它能够像对话框一样在设计阶段就编辑好资源。
方案二:
采用基本对话框模式,主界面上用列表控件来显示数据库,在方案一的基础上,此方案增加了一个查询功能,可分为精确查询和模糊查询。
此查询方式是通过输入关键字的方法,然后在数据库中寻找数据,在列表控件中显示所查找的结果。
除此之外,此方案对比上一个方案还增加了两个个对话框,例如当点击添加,修改按钮时,会对应弹出一个对话框,可在此对话框中操作。
1.2方案比较:
方案一的设计思路及步骤清晰,程序代码设计思路以及实现的功能也较容易实现。
但是此方案不能实现手动查询功能,而且在实现添加、删除、修改功能时,不能知道是否操作成功,要打开数据库才知道已经操作成功了,这对用户运用不方便。
方案二的设计相对方案一来说详细多了。
查询还分为精确查询和模糊查询,主界面直接显示数据库,直观方便,在增加和修改时另外弹出对话框,层次感强,而且增加和修改后可以马上刷新列表控件中的内容,非常直观。
1.3方案选择:
由于两个方案都没有可以完全实现我们需要的功能,所以我们小组决定结合两个方案。
即是将方案一的设计全部采用,再在方案二上采用其查询功能,但是不分精确查询和模糊查询,只需要查询时显示相对应的数据即可。
还有就是采用方案二中多对话框的方法,也就是在点击添加,修改按键之一时会弹出相对应的对话框供用户操作。
还有就是采用方案二中的添加一个列表控件显示数据,这样方便用户查看。
总而言之,我们的方案是取两个方案中我们需要的功能,将两者结合起来,实现另一个简单却全面的通讯录。
2.系统分析与设计
2.1系统分析
通讯录的功能包括添加、修改、删除、查询四个主要功能,当添加记录时,弹出添加窗口,修改是弹出修改窗口,删除和查询在主界面显示,所以整个系统包括三个对话框。
(1)主界面
通过主界面,可以用来显示通讯录的信息,包括查询和删除功能,当输入查询姓名查询时,系统检测该姓名在通讯录表中是否存在,如果存在,就在主界面的列表控件显示出来。
当选择删除按钮时,如果没有在列表中选中要删除的记录,则系统会提示需要选中记录,如果有,就直接删除该记录,并且刷新通讯录。
(2)增加记录窗口
当点击主界面中的添加按钮时,就会弹出本对话框,用户可以输入新的记录,点击“确定”,完成记录的添加,同时系统刷新通信录。
用户可以在主界面的列表中看到增加的记录。
(3)修改记录窗口
当点击主界面中的修改按钮时,如果用户没有在列表中选中要修改的记录,系统会提示要选中记录,如果有,就弹出本窗口,窗口中将显示所选记录的信息,用户可在其基础上修改,点击“确定”,完成记录的修改,同时系统刷新通讯录,你可以在主界面的列表中看到该记录已被修改。
2.2系统框图
2.3数据库设计
根据系统功能需求,数据库采用MicrosoftAccess2003建立。
MicrosoftAccess2003是一个桌面级的数据库管理系统,简单易用,功能强大。
支持的数据类型较丰富,操作简便。
本通讯录设计为个人的简易通讯录,所以包括的信息较简单,有姓名、电话、地址和e-mail四项。
根据设计要求,本系统的数据库设计如下表1。
表1通讯录信息表
字段名称
数据类型
字段属性
字段大小
描述
必填字段
ID
自动编号
长整型
序号
NAME
文本
50
姓名
是
TEL
文本
50
电话
否
ADDRS
文本
50
地址
否
EMAIL
文本
50
邮箱
否
3.系统功能的实现和代码编写
3.1准备工作
通过数据库的设计得到一个Access数据库文档:
TXL.mdb。
为了使程序能访问数据库,需要把数据库注册到ODBC驱动程序管理器。
ODBC管理程序把数据库访问的请求传递给正确的驱动程序,驱动程序再使用SQL语句提示DBMS(数据库管理系统)完成数据库的访问工作。
(1)打开如图3-1所示的ODBC数据源管理器。
图3-1-1ODBC数据源管理器
(2)在【用户DSN】选项卡中单击【添加】按钮,弹出【创建新数据源】对话框,如图3-2所示。
选择Access数据库对应的驱动程序“MicrosoftAccessDriver(*.mdb)”,并单击【完成】按钮。
图3-1-2选择Access驱动程序
(3)此时弹出【ODBCMicrosoftAccess安装】对话框,如图3-3所示。
单击【选择】按钮,选择要配置的数据库文件TXL.mdb,并输入数据源名称“TXL”。
单击【确定】按钮就可以了。
图3-1-3【ODBCMicrosoftAccess安装】对话框
(4)创建项目
根据需要分析和系统的功能,用VisualC++6.0创建一个基于对话框的MFCAppWizard(exe)项目,项目名为Address。
创建项目后,会呈现出一个对话框,本系统就在该对话框基础上开始设计的。
3.2界面设计
(1)主界面设计
通讯录的主界面设计如图3-2-1
图3-2-1主界面设计图
对话框设置为:
IDD_MAIN_DIALOG、宋体、9.
其中主要的控件属性设置以及功能如表2。
表2IDD_MAIN_DIALOG对话框中的主要控件
控件类型
ID
属性设置
Button
IDC_BUTTON_ADD
Caption设为“添加”
Button
IDC_BUTTON_MODIFY
Caption设为“修改”
Button
IDC_BUTTON_DELETE
Caption设为“删除”
Button
IDC_BUTTON_SEARCH
Caption设为“查询”
Button
IDC_BUTTON_EXITSEARCH
Caption设为“退出查询”
StaticText
默认
Caption设为“请输入姓名查询”
GroupBox
默认
Caption设为“功能区”
EditBox
IDC_INPUT
默认
EditBox
IDC_LIST1
View选中Report
(2)增加记录界面设计
当点击主界面中的添加按钮时,就会弹出增加记录的界面,设计图如图3-2-2
3-2-2添加记录界面设计图
对话框设置为:
IDD_ADD_DIALOG,标题为“添加记录”。
其中的主要控件如表3。
表3添加/修改记录界面控件表
控件类型
ID
属性设置
StaticText
默认
Caption设为“姓名”
StaticText
默认
Caption设为“电话”
StaticText
默认
Caption设为“地址”
StaticText
默认
Caption设为“e-mail”
EditBox
IDC_EDIT_NAME
默认
EditBox
IDC_EDIT_TEL
默认
EditBox
IDC_EDIT_ADDRS
默认
EditBox
IDC_EDIT_EMAIL
默认
Button
IDOK
Caption设为“”
Button
IDCANCEL
Caption设为“”
(3)修改记录界面设计
当点击主界面修改按钮时,就会弹出修改记录界面,如图3-3-3
图3-3-3修改记录界面设计图
其对话框设置为:
IDD_MOD_DIALOG,标题为修改记录。
其中主要的控件同增加记录界面一样,如表3.
3.3连接数据库
添加CPersonSet类与数据库中的TXL表连接。
CPersonSet的BaseClass是CRecordSet。
在DatabaseOptions对话框中选择“ODBC”作为数据源,选择已注册的数据源TXL,在SelectDatabaseTables对话框中选择要绑定的表TXL。
3.4代码编写
(1)功能函数RefreshData:
从数据库获取通讯录信息,加入到列表控件中,刷新数据显示。
定义如下:
public:
voidRefreshData();
实现如下:
voidCMAINDLG:
:
RefreshData()
{
//对列表控件的内容更新,清空原来的内容
m_ctrlperson.DeleteAllItems();
m_ctrlperson.SetRedraw(FALSE);
//创建记录集
CPersonSetm_personset(&m_database);
m_personset.Open(AFX_DB_USE_DEFAULT_TYPE,m_query);
CDBVariantvarValue;
charbuf[20];
//用来记录当前记录的序号
inti=0;
//如果表中有记录,打开后将游标定在第一位,使记录集中的第一条记录成为当前记录
if(m_personset.GetRecordCount()!
=0)m_personset.MoveFirst();
while(!
m_personset.IsEOF())
{
inttemp=0;
//对整型数字的处理
m_personset.GetFieldValue(temp,varValue);
sprintf(buf,"%d",varValue.m_lVal);m_ctrlperson.InsertItem(i,buf);
//对字符串显示处理
//m_personset.GetFieldValue(0,varValue);
//m_ctrlperson.SetItemText(i,0,varValue.m_pstring->GetBuffer
(1));
m_personset.GetFieldValue(1,varValue);
m_ctrlperson.SetItemText(i,1,varValue.m_pstring->GetBuffer
(1));
m_personset.GetFieldValue(2,varValue);
m_ctrlperson.SetItemText(i,2,varValue.m_pstring->GetBuffer
(1));
m_personset.GetFieldValue(3,varValue);
m_ctrlperson.SetItemText(i,3,varValue.m_pstring->GetBuffer
(1));
m_personset.GetFieldValue(4,varValue);
m_ctrlperson.SetItemText(i,4,varValue.m_pstring->GetBuffer
(1));
m_personset.MoveNext();
i++;
}
m_ctrlperson.SetRedraw();
}
(2)初始化对话框。
初始化列表控件,并填充通讯录信息。
代码如下:
BOOLCMAINDLG:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//TODO:
Addextrainitializationhere
//确定列名
m_ctrlperson.InsertColumn(0,"序号");
m_ctrlperson.InsertColumn(1,"姓名");
m_ctrlperson.InsertColumn(2,"电话");
m_ctrlperson.InsertColumn(3,"地址");
m_ctrlperson.InsertColumn(4,"e-mail");
//重新分配列宽
m_ctrlperson.SetColumnWidth(0,60);
m_ctrlperson.SetColumnWidth(1,60);
m_ctrlperson.SetColumnWidth(2,100);
m_ctrlperson.SetColumnWidth(3,150);
m_ctrlperson.SetColumnWidth(4,180);
m_ctrlperson.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_query.Format("select*fromTXLorderbyIDASC");
RefreshData();
returnTRUE;
}
(3)查询功能按钮的代码实现
这个功能的实现通过两个函数完成,首先查询按钮的代码。
当点击查询按钮时,如果没有输入姓名的话,系统会提示要输入姓名查询,如果有输入姓名,则执行SearchData();
“添加”按钮:
voidCMAINDLG:
:
OnButtonSearch()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
CPersonSetm_personset;//定义CPersonset类的对象
CStringm_tablefield;
m_tablefield.Format("NAME");
if(!
m_input.IsEmpty())
{
m_searchSQL.Format("select*fromTXLwhere%s='%s'",m_tablefield,m_input);
SearchData();
}
else
{
MessageBox("请填写查询关键字","提示",MB_OK|MB_ICONINFORMATION);
GetDlgItem(IDC_INPUT)->SetFocus();
}
}
SearchData()函数根据输入的姓名,在数据库中搜索,当找到时,将查询结果通过列表控件显示。
函数定义如下:
public:
voidSearchData();
代码编写如下:
voidCMAINDLG:
:
SearchData()
{
//对列表控件的内容更新,清空原来的内容
m_ctrlperson.DeleteAllItems();
//创建记录集
CPersonSetm_personset(&m_database);
m_personset.Open(AFX_DB_USE_DEFAULT_TYPE,m_searchSQL);
CDBVariantvarValue;
charbuf[20];
//用来记录当前记录的序号
inti=0;
//如果表中有记录,打开后将游标定在第一位,使记录集中的第一条记录成为当前记录
if(m_personset.GetRecordCount()!
=0)m_personset.MoveFirst();
while(!
m_personset.IsEOF())
{
inttemp=0;
//对整型数字的处理
m_personset.GetFieldValue(temp,varValue);
sprintf(buf,"%d",varValue.m_lVal);m_ctrlperson.InsertItem(i,buf);
//对字符串显示处理
//m_personset.GetFieldValue(0,varValue);
//m_ctrlperson.SetItemText(i,0,varValue.m_pstring->GetBuffer
(1));
m_personset.GetFieldValue(1,varValue);
m_ctrlperson.SetItemText(i,1,varValue.m_pstring->GetBuffer
(1));
m_personset.GetFieldValue(2,varValue);
m_ctrlperson.SetItemText(i,2,varValue.m_pstring->GetBuffer
(1));
m_personset.GetFieldValue(3,varValue);
m_ctrlperson.SetItemText(i,3,varValue.m_pstring->GetBuffer
(1));
m_personset.GetFieldValue(4,varValue);
m_ctrlperson.SetItemText(i,4,varValue.m_pstring->GetBuffer
(1));
m_personset.MoveNext();
i++;
}
}
(4)“添加”功能
当点击添加按钮时,弹出添加对话框,代码实现如下:
voidCMAINDLG:
:
OnButtonAdd()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_database.Close();
CADDDLGDLG;//CADDDLG是为添加记录对话框建的类
DLG.m_database.Open(_T("TXL"));
DLG.DoModal();
RefreshData();//添加完成时,要更新数据库显示
}
在添加记录对话框中,输入信息,点击确定按钮实现添加功能。
“添加”功能实现:
voidCADDDLG:
:
OnOK()
{
//TODO:
Addextravalidationhere
UpdateData(TRUE);//得到输入的内容
CStringstrSQL,strchkSQL;
inti=1;
intflag=0;
//从主码为1开始在数据库的相应表中搜索,如果找到记录,则主码值加1,直到数据库中
//无该主码值对应的记录,则将该主码值分配给新的记录
if(!
m_name.IsEmpty())//如果姓名填写了
{
while(!
flag)
{
CPersonSetm_recordset(&m_databa