基于ODBC数据库的通讯录课程设计报告_第1页
基于ODBC数据库的通讯录课程设计报告_第2页
基于ODBC数据库的通讯录课程设计报告_第3页
基于ODBC数据库的通讯录课程设计报告_第4页
基于ODBC数据库的通讯录课程设计报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序设计实践训练课程设计报告姓 名: 班 级: 学 号:指导老师: 日期: 2010.12.202010.12.31 摘 要计算机网络的快速发展,让我们的生活日新月异,电脑在各个领域占据着越来越重要的地位。达到有效利用电脑来发现连接在今天的fast-certification人与人之间的社区是一个非常重要的问题。通讯连结的前提下,我们必须要有联系的人我们想接触。通讯录是一种工具,广泛用于日常生活,各自的功能引起了极大的方便。但也正因为此,设计布局,以使系统简单,易于理解,全功能的通讯录是非常重要的。在这个过程中设计,我们用microsoft access 2003年,以构建一个数据库文件,然后

2、在数据库文件创建一个许多领域数据库文件后,与visual c + +通过视窗xp odbc驱动连接,使用visual c + +文档结构设计数据库应用程序实现添加、修改、删除、查询,记录的功能。美丽的界面设计让人们可以使用对话框来实现和谐人机交互。目 录1. 方案比较与选择41.1 方案描述41.2 方案比较51.3 方案选择52.系统分析与设计5 2.1 系统分析52.2 系统框图62.3 数据库设计73 系统功能实现与代码编写73.1 准备工作73.2 界面设计93.3 连接数据库113.4 代码编写 113.5 关键技术分析214. 讨论及进一步研究和建议215. 成果显示226. 课程

3、设计心得与体会24abstract25参考文献 251方案比较与选择1.1方案描述方案一: 在mfc中进行数据库编程需要涉及4个基本的数据库类:cdatabase、crecordest、crecordview和cdexception。一个cdatabase对象代表与数据源的一个链接。创建一个cdatabase对象后,就可以调用open或openex成员函数打开指定的数据源,从而建立起与底层数据源的链接。应用程序可以通过executesql函数向数据源发出一条不需要返回数据的语言。cdatabase对象在使用完毕后通过close函数关闭与数据源的连接。一个crecordset对象代表从一个数据源

4、检索出的一组记录。crecordset类支持多种类型的记录集,常用的是动态集类型dynaset和快照类型snapshot。动态集类型是数据的动态集合,它支持双向滚动,能够与数据源的其他用户做出的更新保持同步;快照类型则是记录集被填充时数据的静态映像,它也支持双向滚动,但是不能保证与其他用户保持同步。如果使用快照类型的应用程序需要查看其他用户做出的改动,必须先关闭记录集后再重新打开。不管使用哪种类型的数据集,在数据集中添加或删除纪录之后都要调用requery函数来更新数据集。构造crecordset对象时需要一个cdatabase对象。如果将这个参数设置为控制null,系统将创建一个临时的cda

5、tabase对象。通过cdatabase的open函数能够打开数据集并且执行默认的查询语句从数据源中获取数据,函数close则用于关闭数据集、切断数据集和数据源的连接。在数据集中移动当前记录可以通过函数movefirst、movelast、movenext和moveprev进行。如果添加和修改记录,需要先将记录集设置为addnew和edit状态,然后对数据集的变量进行赋值,最后通过update函数完成写入操作。删除记录操作则通过delete函数来完成。在执行数据库操作时可能会引发cdbexception类型的异常。cdbexception类由异常cexception派生而来,成员m_strer

6、ror指明了造成异常的原因,recorderror函数则能够直接弹出一个对话框说明造成异常的原因。crecordview用对话框控件来显示数据库记录,可以把它看作是具有数据库操作功能的试图类,它能够像对话框一样在设计阶段就编辑好资源。方案二: 采用基本对话框模式,主界面上用列表控件来显示数据库,在方案一的基础上,此方案增加了一个查询功能,可分为精确查询和模糊查询。此查询方式是通过输入关键字的方法,然后在数据库中寻找数据,在列表控件中显示所查找的结果。除此之外,此方案对比上一个方案还增加了两个个对话框,例如当点击添加,修改按钮时,会对应弹出一个对话框,可在此对话框中操作。1.2方案比较:方案一的

7、设计思路及步骤清晰,程序代码设计思路以及实现的功能也较容易实现。但是此方案不能实现手动查询功能,而且在实现添加、删除、修改功能时,不能知道是否操作成功,要打开数据库才知道已经操作成功了,这对用户运用不方便。方案二的设计相对方案一来说详细多了。查询还分为精确查询和模糊查询,主界面直接显示数据库,直观方便,在增加和修改时另外弹出对话框,层次感强,而且增加和修改后可以马上刷新列表控件中的内容,非常直观。1.3方案选择: 由于两个方案都没有可以完全实现我们需要的功能,所以我们小组决定结合两个方案。即是将方案一的设计全部采用,再在方案二上采用其查询功能,但是不分精确查询和模糊查询,只需要查询时显示相对应

8、的数据即可。还有就是采用方案二中多对话框的方法,也就是在点击添加,修改按键之一时会弹出相对应的对话框供用户操作。还有就是采用方案二中的添加一个列表控件显示数据,这样方便用户查看。总而言之,我们的方案是取两个方案中我们需要的功能,将两者结合起来,实现另一个简单却全面的通讯录。2.系统分析与设计2.1系统分析通讯录的功能包括添加、修改、删除、查询四个主要功能,当添加记录时,弹出添加窗口,修改是弹出修改窗口,删除和查询在主界面显示,所以整个系统包括三个对话框。(1) 主界面通过主界面,可以用来显示通讯录的信息,包括查询和删除功能,当输入查询姓名查询时,系统检测该姓名在通讯录表中是否存在,如果存在,就

9、在主界面的列表控件显示出来。当选择删除按钮时,如果没有在列表中选中要删除的记录,则系统会提示需要选中记录,如果有,就直接删除该记录,并且刷新通讯录。(2) 增加记录窗口当点击主界面中的添加按钮时,就会弹出本对话框,用户可以输入新的记录,点击“确定”,完成记录的添加,同时系统刷新通信录。用户可以在主界面的列表中看到增加的记录。(3)修改记录窗口当点击主界面中的修改按钮时,如果用户没有在列表中选中要修改的记录,系统会提示要选中记录,如果有,就弹出本窗口,窗口中将显示所选记录的信息,用户可在其基础上修改,点击“确定”,完成记录的修改,同时系统刷新通讯录,你可以在主界面的列表中看到该记录已被修改。2.

10、2系统框图用access建立通讯录的数据库设计概念:通讯录包含查询、添加、修改、删除功能,利用单文档模式创建工程,编辑通讯录的主界面主界面包括用于浏览的列表控件、一个用于查询时输入姓名的editbox和四个button按钮,分别表示用于查询、添加、修改、删除功能当点击添加和修改按钮时会分别弹出用于添加记录和修改记录的对话框,编辑两个对话框,界面是一样的,包括姓名、电话、地址和邮箱用于输入的四个editbox、确定和取消按钮三个界面控件设置,用classwizard添加消息响应函数,代码编写图2-12.3数据库设计根据系统功能需求,数据库采用microsoft access 2003建立。mic

11、rosoft access 2003是一个桌面级的数据库管理系统,简单易用,功能强大。支持的数据类型较丰富,操作简便。本通讯录设计为个人的简易通讯录,所以包括的信息较简单,有姓名、电话、地址和e-mail四项。根据设计要求,本系统的数据库设计如下表1。表1 通讯录信息表字段名称数据类型字段属性字段大小描述必填字段id自动编号长整型序号name文本50姓名是tel文本50电话否addrs文本50地址否email文本50邮箱否3系统功能的实现和代码编写3.1准备工作通过数据库的设计得到一个access数据库文档:txl.mdb。为了使程序能访问数据库,需要把数据库注册到odbc驱动程序管理器。od

12、bc管理程序把数据库访问的请求传递给正确的驱动程序,驱动程序再使用sql语句提示dbms(数据库管理系统)完成数据库的访问工作。(1)打开如图3-1所示的odbc数据源管理器。 图3-1-1 odbc数据源管理器(2)在【用户dsn】选项卡中单击【添加】按钮,弹出【创建新数据源】对话框,如图3-2所示。选择access数据库对应的驱动程序“microsoft access driver(*.mdb)”,并单击【完成】按钮。 图3-1-2 选择access驱动程序(3)此时弹出【odbc microsoft access安装】对话框,如图3-3所示。单击【选择】按钮,选择要配置的数据库文件txl

13、.mdb,并输入数据源名称“txl”。单击【确定】按钮就可以了。 图3-1-3 【odbc microsoft access安装】对话框(4)创建项目根据需要分析和系统的功能,用visual c+6.0创建一个基于对话框的mfc app wizard(exe)项目,项目名为address。创建项目后,会呈现出一个对话框,本系统就在该对话框基础上开始设计的。3.2界面设计(1)主界面设计通讯录的主界面设计如图3-2-1 图3-2-1主界面设计图对话框设置为:idd_main_dialog、宋体、9.其中主要的控件属性设置以及功能如表2。 表2 idd_main_dialog对话框中的主要控件控件

14、类型id属性设置buttonidc_button_addcaption设为“添加”buttonidc_button_modifycaption设为“修改”buttonidc_button_deletecaption设为“删除”buttonidc_button_searchcaption设为“查询”buttonidc_button_exitsearchcaption设为“退出查询”static text默认caption设为“请输入姓名查询”group box默认caption设为“功能区”edit boxidc_input默认edit boxidc_list1view选中report(2)增加

15、记录界面设计当点击主界面中的添加按钮时,就会弹出增加记录的界面,设计图如图3-2-2 3-2-2 添加记录界面设计图对话框设置为:idd_add_dialog,标题为“添加记录”。其中的主要控件如表3。 表3 添加/修改记录界面控件表控件类型id属性设置static text默认caption设为“姓名”static text默认caption设为“电话”static text默认caption设为“地址”static text默认caption设为“e-mail”edit boxidc_edit_name默认edit boxidc_edit_tel默认edit boxidc_edit_add

16、rs默认edit boxidc_edit_email默认buttonidok caption设为“”buttonidcancelcaption设为“”(3)修改记录界面设计当点击主界面修改按钮时,就会弹出修改记录界面,如图3-3-3 图3-3-3 修改记录界面设计图其对话框设置为:idd_mod_dialog,标题为修改记录。其中主要的控件同增加记录界面一样,如表3.3.3连接数据库添加cpersonset类与数据库中的txl表连接。cpersonset的base class是crecordset。在database options对话框中选择“odbc”作为数据源,选择已注册的数据源txl,

17、在select database tables对话框中选择要绑定的表txl。3.4代码编写(1)功能函数refreshdata:从数据库获取通讯录信息,加入到列表控件中,刷新数据显示。定义如下:public:void refreshdata();实现如下:void cmaindlg:refreshdata()/对列表控件的内容更新,清空原来的内容m_ctrlperson.deleteallitems();m_ctrlperson.setredraw(false);/创建记录集cpersonset m_personset(&m_database);m_personset.open(afx

18、_db_use_default_type,m_query);cdbvariant varvalue;char buf20;/用来记录当前记录的序号int i=0;/如果表中有记录,打开后将游标定在第一位,使记录集中的第一条记录成为当前记录if(m_personset.getrecordcount()!=0)m_personset.movefirst();while(!m_personset.iseof()int temp=0;/对整型数字的处理m_personset.getfieldvalue(temp,varvalue);sprintf(buf,"%d",varvalue

19、.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_ctr

20、lperson.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_ctrlpe

21、rson.setredraw();(2)初始化对话框。初始化列表控件,并填充通讯录信息。代码如下:bool cmaindlg:oninitdialog() cdialog:oninitdialog();/ todo: add extra initialization here/确定列名m_ctrlperson.insertcolumn(0,"序号");m_ctrlperson.insertcolumn(1,"姓名");m_ctrlperson.insertcolumn(2,"电话");m_ctrlperson.insertcolumn

22、(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| l

23、vs_ex_gridlines); m_query.format("select * from txl order by id asc");refreshdata();return true; (3)查询功能按钮的代码实现这个功能的实现通过两个函数完成,首先查询按钮的代码。当点击查询按钮时,如果没有输入姓名的话,系统会提示要输入姓名查询,如果有输入姓名,则执行searchdata();“添加”按钮:void cmaindlg:onbuttonsearch() / todo: add your control notification handler code hereupd

24、atedata(true);cpersonset m_personset;/定义cpersonset类的对象cstring m_tablefield; m_tablefield.format("name");if(!m_input.isempty()m_searchsql.format("select * from txl where %s='%s'",m_tablefield,m_input);searchdata();elsemessagebox("请填写查询关键字","提示",mb_ok|mb

25、_iconinformation);getdlgitem(idc_input)->setfocus();待添加的隐藏文字内容2searchdata()函数根据输入的姓名,在数据库中搜索,当找到时,将查询结果通过列表控件显示。函数定义如下:public:void searchdata();代码编写如下:void cmaindlg:searchdata()/对列表控件的内容更新,清空原来的内容m_ctrlperson.deleteallitems();/创建记录集cpersonset m_personset(&m_database);m_personset.open(afx_db_u

26、se_default_type,m_searchsql);cdbvariant varvalue;char buf20;/用来记录当前记录的序号int i=0;/如果表中有记录,打开后将游标定在第一位,使记录集中的第一条记录成为当前记录if(m_personset.getrecordcount()!=0)m_personset.movefirst();while(!m_personset.iseof()int temp=0;/对整型数字的处理m_personset.getfieldvalue(temp,varvalue);sprintf(buf,"%d",varvalue.

27、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_ctrl

28、person.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)“添加”功

29、能当点击添加按钮时,弹出添加对话框,代码实现如下:void cmaindlg:onbuttonadd() / todo: add your control notification handler code herem_database.close();cadddlg dlg; /cadddlg是为添加记录对话框建的类dlg.m_database.open(_t("txl");dlg.domodal();refreshdata(); /添加完成时,要更新数据库显示在添加记录对话框中,输入信息,点击确定按钮实现添加功能。“添加”功能实现:void cadddlg:onok()

30、 / todo: add extra validation hereupdatedata(true);/得到输入的内容cstring strsql,strchksql;int i=1;int flag=0;/从主码为1开始在数据库的相应表中搜索,如果找到记录,则主码值加1,直到数据库中/无该主码值对应的记录,则将该主码值分配给新的记录if(!m_name.isempty()/如果姓名填写了while(!flag)cpersonset m_recordset(&m_database);strsql.format("select * from txl where id=%d&qu

31、ot;,i);m_recordset.open(afx_db_use_default_type,strsql);if(m_recordset.getrecordcount()=0)strsql.format("insert into txl values(%d,'%s','%s','%s','%s')",i,m_name,m_tel,m_addrs,m_email);m_database.executesql(strsql);m_database.close();cdialog:onok();flag=1;i+

32、;else/如果姓名项为空messagebox("“姓名”项一定要填写!","提示",mb_ok|mb_iconinformation);(5)“修改”功能当点击修改按钮时,弹出修改对话框,当用户没有在列表控件中选中要修改的记录时,系统会自动提示,如果有,系统会将该记录的信息显示在修改记录对话框中,用户可以在这个基础上修改信息。代码实现如下:void cmaindlg:onbuttonmodify() / todo: add your control notification handler code herem_database.close();/本对

33、话框断开与数据库的连接cmodifydlg dlg; / cmodifydlg是为修改记录对话框建的类dlg.m_database.open(_t("txl");int i=m_ctrlperson.getselectionmark();cstring strsql;int id=atoi(m_ctrlperson.getitemtext(i,0);cpersonset m_recordset;cdbvariant varvalue;if(i=-1)messagebox("请选择一条要修改的记录!","提示",mb_ok|mb_ico

34、ninformation);elseint temp=0;strsql.format("select * from txl where id=%d",id);m_recordset.open(afx_db_use_default_type,strsql);m_recordset.getfieldvalue(temp,varvalue);dlg.m_modid=varvalue.m_lval;m_recordset.getfieldvalue(1,varvalue);dlg.m_modname=varvalue.m_pstring->getbuffer(1);m_rec

35、ordset.getfieldvalue(2,varvalue);dlg.m_modtel=varvalue.m_pstring->getbuffer(1);m_recordset.getfieldvalue(3,varvalue);dlg.m_modaddrs=varvalue.m_pstring->getbuffer(1);m_recordset.getfieldvalue(4,varvalue);dlg.m_modemail=varvalue.m_pstring->getbuffer(1); dlg.domodal(); refreshdata(); /修改完成,刷新数

36、据库的显示当用户修改好了信息,点击确定,系统就会完成对该记录的修改,修改功能代码实现如下:void cmodifydlg:onok() /todo: add extra validation hereupdatedata(true);cpersonset m_recordset;cstring strsql;cmaindlg dlg;if(!m_modname.isempty()strsql.format("update txl set name='%s',tel='%s',addrs='%s',email='%s' w

37、here id=%d",m_modname,m_modtel,m_modaddrs,m_modemail,m_modid);m_database.executesql(strsql);m_database.close();cdialog:onok();elsemessagebox("“姓名”项不可以为空!","提示",mb_ok|mb_iconinformation); (6)“删除”按钮当点击删除按钮时,如果用户没有在列表控件中选中要删除的记录,系统会提示用户要选择一项要删除的记录,如果有,则删除该记录,同时刷新数据库显示。删除功能代码实现如

38、下:void cmaindlg:onbuttondelete() / todo: add your control notification handler code here/i是记录中所选的记录号,如果没有则返回int i=m_ctrlperson.getselectionmark();cstring strsql,msg,strname;strname=m_ctrlperson.getitemtext(i,1);msg.format("第 %d 项,姓名为“%s”的记录将被删除!是否继续?",i+1,strname);/如果用户没有选择记录,则提示选取一条记录if(i

39、=-1)messagebox("请选择一条要删除的记录!","提示",mb_ok|mb_iconinformation);elseif(messagebox(msg,"提示",mb_yesno|mb_iconinformation)=idyes)cstring strname=m_ctrlperson.getitemtext(i,1);/从表中删除对应的记录strsql.format("delete from txl where name='%s'",strname);m_database.exec

40、utesql(strsql);m_database.close();refreshdata();3.5关键技术与算法分析 在microsoft access 应用程序中,数据库用来将数据本身与程序相连接以供用户添加,删除,修改和查询。我们在程序中也添加了一个refreshdata函数,在这个函数的应用下,无论用户对数据库做什么更改,数据库都会立即得到更新,例如:添加了几个数据,或者修改数据,删除数据,数据库都会刷新,显示出最新的数据。4进一步完善和建议4.1系统进一步的完善 在基本功能实现之后,添加了一个菜单栏,菜单栏中包括三个子菜单(文件,查看,编辑)。在文件中可以退出系统;在编辑中可以实现

41、查询,添加,修改,删除的功能;在查看中可以查看数据库。这样方便用户操作和查看数据库。数据库的查看通过两个控件实现,adoc控件和datagrid控件。之所以要用到adoc控件是因为datagrid和adoc一起可以省去编写代码的步骤,adoc的属性设置中可以连接到数据库,而datagrid的属性设置中的数据源只要选择adoc,则可以实现简单显示查看数据库的功能。4.2进一步研究建议() 主界面过于简单单调,可以按照自己个人喜好设计一下主界面,这样看起来就更加完善。() 在实现了基本功能之后,有能力的话可以添加一个声音系统,即在操作功能时,系统可以读出数据。5.成果显示 6. 课程设计心得与体会

42、:我们这次选择的课程设计是设计一个基于odbc数据库的通讯录。通过这次课程设计我们更加清楚地认识到vc+的强大性和实用性。之前我们有学习过vc+的一些知识,所以vc+的设计思想我们还是比较清楚的,但是对于数据库的应用我们以前都没有接触过,这次选这个题目,原因之一也是想学多一点知识,挑战一下自己。由于我们没有接触过数据库,在查找到资料后,我们也不能很快清楚地认识到其的制作过程,在运用microsoft access我们收获了一份知识,一份成就感。我们这次课程设计最难得部分就是我们找不到一个完好的例子,所以我们需要参照几个例子,从各个例子中挑选我们需要的功能,实现一个简单而又完善的通讯录。虽然这个的程序没有详细的程序可以参考,但是,这也为我们自己去学习程序和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论