当前位置:文档之家› 通讯录管理系统

通讯录管理系统

西安科技大学数据库课程设计报告题目:通讯录管理系统班级:软件工程0902学号: 0908010224姓名:王浩2011年6月摘要基于数据库的通讯录管理系统,采用数据库原理、程序设计方法、数据结构等方面的知识结合vc++的mfc类库进行综合设计,具有基本联系人资料管理以及对于登陆用户的管理,权限设置以及数据的备份和恢复等功能。

采用SQL sever 作为通讯录管理系统的后台数据库,使得通讯录管理系统具有更高的稳定性及安全性,也方便了数据库中数据的备份以及发生故障时的还原。

关键词:数据库通讯录管理系统 SQL-sever 后台目录目录 (3)1.绪论 (1)1.1课程设计目的以及意义 (1)1.2课程设计内容 (1)2.需求分析 (2)2.1功能需求 (2)2.2数据分析 (2)3.数据库设计 (3)3.1概念结构设计 (3)3.2逻辑结构设计 (3)3.3物理结构设计 (4)4.系统功能设计 (5)5.系统实现 (6)5.1系统的开发环境 (6)5.2代码部分 (6)6.总结 (57)1.绪论1.1课程设计目的以及意义通过本课程设计,培养学生具有C/S模式的数据库应用软件系统的设计和开发能力;熟练掌握SQL Server数据库的使用,熟练掌握使用VC++开发工具开发数据库应用的能力;为毕业设计打下坚实的基础。

根据所学的数据库原理与程序设计的知识,能够针对一个小型的数据库管理系统,进行系统的需求分析,系统设计,数据库设计,编码,测试等,完成题目要求的功能,从而达到掌握开发一个小型数据库的目的。

根据所学的数据库原理与程序设计的知识, 通过对一个实际问题的分析,设计与实现,将原理与应用相结合,使我学会如何把书本上学到的知识用于解决实际问题,培养自己的动手能力;另一方面,使我能深入理解和灵活掌握教学内容。

1.2课程设计内容通讯录管理系统主要的数据表:用户信息表,联系人信息表等;2.需求分析2.1功能需求该程序要实现以下基本功能:用户管理:管理系统操作人员,设置操作人员口令和权限。

在满足不同系统用户的操作需求基础上,提高系统的安全性。

基础数据管理:维护通讯录每个联系人相关的基础数据信息。

主要包括以下几个功能:增加联系人及其信息、删除联系人及其信息、按条件查找联系人及其信息、以及更改联系人的信息数据库管理:对现有的数据库进行管理,包括数据备份和恢复,以方便用户对数据库的管理和维护工作,提高系统的数据安全性。

2.2数据分析一个普通的通讯录一般而言使用者需要的信息有一下这些:姓名、性别、民族、与用户的关系、生日、手机、备用手机、qq、邮箱、个人简历、以及当前所在单位。

为了方便管理需要添加编号这样的主键属性,同时出于安全性的考虑,除了管理员权限的用户都仅能看到自己所创建的信息,所以在联系人信息中应再加上创建者的属性,该属性应作为用户信息表的外键,在用户表中充当主键不能重复。

其中姓名性别以及和用户的关系是不可缺少的属性应定为非空。

3.数据库设计3.1概念结构设计用户联系人创建1N用户名主键密码权限手机备用手机QQ电子邮箱所在单位编号外键主键姓名性别民族关系个人简历生日图3-1 通讯录管理系统E-R 图3.2逻辑结构设计将通讯录管理系统E-R 图转换为关系模型为: 用户(用户名,密码,权限)联系人(编号,姓名,性别,民族,关系,生日,个人简历,手机,备用手机,QQ ,电子邮件,所在单位,用户名) 此关系模型 已经达到3NF3.3物理结构设计表3-1 用户表User结构字段含义类型长度约束条件Uusername 用户名varchar 30 主键Upassword 密码varchar 12 Not NULL Uaccess 权限varchar 6 Not NULL表3-2 联系人表Information结构字段含义类型长度约束条件Ino 编号varchar 10 主键Iname 姓名varchar 20 Not NULL Isex 性别varchar 2 '男' or'女' Ination 民族varchar 30Iresume 个人简历nvarchar 1000Imobile 手机char 11Ismobile 备用手机char 11Iunit 所在单位varchar 50Iqq QQ varchar 15Iemile 电子邮件varchar 50Irel 关系varchar 8 Not NULLIbirthday 生日 datetime 8 Uusername创建者varchar30外键4.系统功能设计程序登陆框判断账号密码是否正确确认不正确程序主窗口对话框查询操作查询条件选择查询内容输入增加联系人对话框联系人信息输入注销修改手动改编辑框信息点击列表框选择联系人点击查询删除联系人备份还原用户管理对话框添加新用户对话框输入新用户信息点击列表框选择用户删除用户手动修改编辑框信息修改图4-1 主程序工作流程图程序具有登陆框,登陆成功进入主程序框架,可以选择添加删除修改备份还原以及用户管理操作,当不同用户登陆时检测权限,普通用户用户管理按钮打不开,此时查询修改仅能对自己所创建的内容进行修改删除插入,管理员用户中admin是不可删除的系统初管理员,管理员用户可以修改任何用户所创建的数据,并对用户实行管理。

5.系统实现5.1系统的开发环境硬件环境:处理器:Inter Core2 Duo T6600 2.20GHz内存:2GB硬盘空间:320GB显卡:Nvidia GeForce GT 220M软件环境:操作系统:Windows XP sp3数据库:Microsoft SQL sever 2000编程环境:Microsoft Visual C++5.2代码部分1.按照物理结构设计建立数据库取名为通讯录表5-1 用户表User结构字段含义类型长度约束条件Uusername 用户名varchar 30 主键Upassword 密码varchar 12 Not NULL Uaccess 权限varchar 6 Not NULL表5-2 联系人表Information结构字段含义类型长度约束条件Ino 编号varchar 10 主键Iname 姓名varchar 20 Not NULL Isex 性别varchar 2 '男' or'女' Ination 民族varchar 30Iresume 个人简历nvarchar 1000Imobile 手机char 11Ismobile 备用手机char 11Iunit 所在单位varchar 50Iqq QQ varchar 15Iemile 电子邮件varchar 50Irel 关系varchar 8 Not NULL Ibirthday 生日datetime 8Uusername 创建者varchar 30 外键之后打开查询分析器输入存储过程建立的语句用来结束当前数据库连接use mastergoif exists(select 1 from sysobjects where id=object_id('p_killspid') and xtype='P')beginexec('drop procedure p_killspid')endgocreate proc p_killspid@dbname sysnameasdeclare @s nvarchar(1000)declare tb cursor local forselect s='kill '+cast(spid as varchar)from master..sysprocesseswhere dbid=db_id(@dbname)open tbfetch next from tb into @swhile @@fetch_status=0beginexec(@s)fetch next from tb into @sendclose tbdeallocate tbgo并建立数据源取名为tongxunlu 选择windows NT验证且默认数据库选择通讯录2.添加类CLoginSet 派生于CRecordset类选择数据源tongxunlu 在Recordset Type里选择Dynaset确定后选择er 表确定同理添加CInfoSet类选择的表为rmation3.新建mfc项目工程取名为tongxunlu 选择对话框删掉系统给的几个控件按下图建立新的控件图5-1 登陆框控件如下表更改ID 添加变量关联表5-3 登陆框控件表ID 控件类型内容变量关联ID_OK CButton 登陆ID_EXIT CButton 退出ID_USERNAME CComboBox m_CtrUsername ID_USERNAME CString m_user ID_PASSWORD CEdit m_CtrPassword ID_PASSWORD CString m_password4.在函数BOOL CTongxunluDlg::OnInitDialog()中添加如下代码//引入用户表内数据到组合框中CLoginSet recordset;CString strSQL;UpdateData(TRUE);strSQL="select * from [User]";if(!recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)){MessageBox("打开数据库失败!","数据库错误",MB_OK);return FALSE;}while(! recordset.IsEOF()){m_CtrUsername.AddString(recordset.m_Uusername);recordset.MoveNext();}recordset.Close();5.为登陆按钮添加消息响应函数void CTongxunluDlg::OnOk(){// TODO: Add your control notification handler code here CLoginSet recordset;CString strSQL;UpdateData(TRUE);if(m_user.IsEmpty()){//检测用户名是否为空AfxMessageBox("请输入用户名!");m_CtrUsername.SetFocus();return;}if(m_password.IsEmpty()){//检测密码是否为空AfxMessageBox("请输入密码!");m_CtrPassword.SetFocus();return;}strSQL.Format("select * from [User] where Uusername='%s' AND Upassword='%s'",m_user,m_password);if(!recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)){MessageBox("打开数据库失败","数据库错误",MB_OK);return;}if(recordset.GetRecordCount()==0){//如果没有一条记录和输入相同无法进入recordset.Close();MessageBox("密码错误请重新输入!");m_password="";m_CtrPassword.SetFocus();UpdateData(FALSE);}else{//账户密码输入正确进入后recordset.Close();CConnectDlg dlg;CDialog::OnOK();UpdateData(TRUE);//当前用户名dlg.m_nowuser=m_user;dlg.DoModal();}}6.为退出按钮添加消息响应函数void CTongxunluDlg::OnExit(){// TODO: Add your control notification handler code here //点击退出退出程序exit(0);}7.重载PreTranslateMessage()函数添加如下代码if(pMsg->message == WM_KEYDOWN){switch(pMsg->wParam){case VK_RETURN://屏蔽回车// OnKeyDown(VK_SPACE, LOWORD(pMsg ->lParam), HIWORD(pMsg->lParam));return TRUE;case VK_ESCAPE://屏蔽Escreturn TRUE;}}8.在资源管理器中插入对话框资源并如图建立相应的控件图5-2 主界面控件图表5-4 主界面控件表ID 控件类型内容变量关联ID_SELFUN CComboBox m_Ctrselfun ID_BACKUP CButton 备份ID_DELETE CButton 删除ID_INSERT CButton 插入联系人ID_LIST CListCtrl m_list ID_NOWUSER CString m_nowuser ID_RESTORE CButton 还原ID_SELECT CButton 查询ID_SELFUN CComboBox m_Ctrslefun ID_SELROM CString m_selrom ID_UPDATE CButton 修改ID_USERMANAGE CButton 用户管理ID_ZHUXIAO CButton 注销IDE_BIRTHDAY CString m_birthday IDE_EMAIL CString m_email IDE_MOBILE CString m_mobile IDE_NAME CString m_name IDE_NATION CString m_nationg IDE_QQ CString m_qq IDE_REL CString m_relIDE_RESUME CString m_resume IDE_SEX CString m_sex IDE_SMOBILE CString m_smobile IDE_UNIT CString m_unit 并为此对话框创建类,CConnectDlg类9.重载OnInitDialog() 函数,在函数中添加如下代码//初始化列表框m_list.InsertColumn(0,"编号");m_list.InsertColumn(1,"姓名");//平分列表框为两列RECT rectList;m_list.GetWindowRect(&rectList);int wid=rectList.right-rectList.left;m_list.SetColumnWidth(0,wid/2);m_list.SetColumnWidth(1,wid/2);m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);//初始化组合框内容查询条件m_Ctrselfun.AddString("按姓名查询");m_Ctrselfun.AddString("按性别查询");m_Ctrselfun.AddString("按民族查询");m_Ctrselfun.AddString("按关系查询");m_Ctrselfun.AddString("全部查找");m_Ctrselfun.SetCurSel(4);m_CtrSelRom.EnableWindow(FALSE);//刷新数据库将已存在的数据添加于列表框内CLoginSet log;CString strSQL,SQL;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser); SQL.Format("select Ino,Iname from Information where Uusername='%s'",m_nowuser); log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA"){m_usermanage.EnableWindow(TRUE);RefreshList("select Ino,Iname from Information");}else{m_usermanage.EnableWindow(FALSE);RefreshList(SQL);}log.Close();10.添加成员函数RefreshList(CString strSQL)void CConnectDlg::RefreshList(CString strSQL){//按sql语句刷新列表框UpdateData(FALSE);CDatabase db;CInfoSet m_infoset;m_list.DeleteAllItems();m_infoset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);int i=0;while(!m_infoset.IsEOF()){CString temp;m_list.InsertItem(i,temp);m_list.SetItemText(i,0,m_infoset.m_Ino);m_list.SetItemText(i,1,m_infoset.m_Iname);m_infoset.MoveNext();i++;}m_infoset.Close();db.Close();UpdateData(FALSE);}11.重载PreTranslateMessage函数,添加如下代码//屏蔽回车键和esc键if(pMsg->message == WM_KEYDOWN){switch(pMsg->wParam){case VK_RETURN://屏蔽回车return TRUE;case VK_ESCAPE://屏蔽Escreturn TRUE;}}12.对查询按钮添加消息响应函数添加如下代码//选择查询方式并查询int n=m_Ctrselfun.GetCurSel();CString strSQL;UpdateData(TRUE);switch (n){//按关系查询case 0:if(m_selrom=="")AfxMessageBox("请输入查询内容!",MB_OK);else{CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s' and Irel ='%s'",m_nowuser,m_selrom);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA"){strSQL.Format("select Ino,Iname from Information where Irel = '%s'",m_selrom);RefreshList(strSQL);}if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}break;case 1:if(m_selrom=="")AfxMessageBox("请输入查询内容!",MB_OK);else{//按民族查询CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s' and Ination='%s'",m_nowuser,m_selrom);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA"){strSQL.Format("select Ino,Iname from Information where Ination = '%s'",m_selrom);RefreshList(strSQL);}if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}break;case 2://按姓名查询if(m_selrom=="")AfxMessageBox("请输入查询内容!",MB_OK);else{CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s' and Iname ='%s'",m_nowuser,m_selrom);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA"){strSQL.Format("select Ino,Iname from Information where Iname = '%s'",m_selrom);RefreshList(strSQL);if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}break;case 3://按性别查询if(m_selrom=="")AfxMessageBox("请输入查询内容!",MB_OK);else{CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s' and Isex = '%s'",m_nowuser,m_selrom);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA")strSQL.Format("select Ino,Iname from Information where Isex = '%s'",m_selrom);RefreshList(strSQL);}if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}break;case 4://全部查询{CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s'",m_nowuser);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA")RefreshList("select Ino,Iname from Information");if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}break;default:AfxMessageBox("请选择查询条件",MB_OK);}13.对列表框添加双击的消息响应函数,代码如下void CConnectDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) {// TODO: Add your control notification handler code here//双击列表框显示数据int i=m_list.GetSelectionMark();if(i<0){MessageBox("无内容");return;}else{m_name=m_list.GetItemText(i,1);CString strSQL;strSQL.Format("select * from Information where Iname='%s'",m_name);CInfoSet info;info.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);m_sex=info.m_Isex;m_nation=info.m_Ination;CString str;str.Format("%d-%d-%d",info.m_Ibirthday.GetYear(),info.m_Ibirthday.GetMonth(),info.m_Ib irthday.GetDay());m_birthday=str;m_rel=info.m_Irel;m_resume=info.m_Iresume;m_mobile=info.m_Imobile;m_smobile=info.m_Ismobile;m_email=info.m_Iemile;m_unit=info.m_Iunit;m_qq=info.m_Iqq;UpdateData(FALSE);info.Close();}*pResult = 0;}14.为添加联系人按钮添加消息响应函数代码如下CInsertDlg dlg;dlg.Set(m_nowuser);if(dlg.DoModal()==IDOK){//添加过之后重新刷新列表框CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s'",m_nowuser);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA")RefreshList("select Ino,Iname from Information");if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}15.为删除联系人按钮添加消息响应函数,代码如下//获得当前选择的数据记录int i=m_list.GetSelectionMark();if(i<0){MessageBox("请选择一条记录进行删除!");}m_name=m_list.GetItemText(i,1);//删除当前数据记录CString sda;CDatabase db;db.Open(_T("tongxunlu"));sda.Format("delete from Information where Iname='%s'",m_name); db.ExecuteSQL(sda);db.Close();RefreshList("select Ino,Iname from Information");m_birthday = _T("");m_email = _T("");m_mobile = _T("");m_name = _T("");m_nation = _T("");m_qq = _T("");m_resume = _T("");m_sex = _T("");m_smobile = _T("");m_unit = _T("");m_rel = _T("");UpdateData(FALSE);16.为组合框查询方式添加选择函数,代码如下void CConnectDlg::OnSelchangeSelfun(){// TODO: Add your control notification handler code here//当切换查询方式时选到全部查询查询内容编辑框禁用每次更改清空查询内容int i=m_Ctrselfun.GetCurSel();if(i==4){m_CtrSelRom.EnableWindow(FALSE);}else{m_CtrSelRom.EnableWindow(TRUE);m_CtrSelRom.Clear();}m_selrom="";UpdateData(FALSE);}17.为修改按扭添加消息响应函数代码如下UpdateData(TRUE);//得到当先选择的数据记录int i= m_list.GetSelectionMark();m_name=m_list.GetItemText(i,1);CString temp;temp=m_name;if(i<0){MessageBox("请选择一条记录进行修改","错误");return;}CString strSQL;CInfoSet info;strSQL.Format("select * from Information where Iname='%s'",temp);if(!info.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)){MessageBox("打开数据库失败!","数据库错误");return;}//更改数据UpdateData(FALSE);info.Edit();info.m_Isex=m_sex;info.m_Ination=m_nation;info.m_Irel=m_rel;info.m_Imobile=m_mobile;info.m_Ismobile=m_smobile;info.m_Iqq=m_qq;info.m_Iemile=m_email;info.m_Iunit=m_unit;info.m_Iresume=m_resume;info.Update();info.Close();//按权限刷新列表CString strSQL1,SQL;CLoginSet log;strSQL1.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser); SQL.Format("select Ino,Iname from Information where Uusername='%s'",m_nowuser); log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL1);if(log.m_Uaccess=="DBA")RefreshList("select Ino,Iname from Information");if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();UpdateData(FALSE);18.为用户管理按钮添加消息响应函数//调用用户管理对话框CUserManage dlg;dlg.DoModal();19.给备份按钮添加消息响应函数,代码如下//设置备份文件路径CFileDialog dlg(FALSE,NULL,"联系人.bak",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"备份文件(*.bak) | *.bak|All(*.*) | *.*||");if(dlg.DoModal()==IDOK){UpdateData();m_path=dlg.GetPathName();UpdateData(FALSE);elsereturn;//进行备份CString strSQL;strSQL.Format("backup database 通讯录to disk='%s'",m_path);CDatabase db;if(!db.Open(_T("tongxunlu"))){MessageBox("数据库连接错误","错误");return;}db.ExecuteSQL(strSQL);db.Close();AfxMessageBox("备份完成");20.为还原按钮添加消息响应函数代码如下//获得备份文件的路径保存于m_path中CFileDialog dlg(TRUE,NULL,"联系人.bak",OFN_HIDEREADONL Y | OFN_OVERWRITEPROMPT,"备份文件(*.bak) | *.bak|All(*.*) | *.*||");if(dlg.DoModal()==IDOK)UpdateData();m_path=dlg.GetPathName();UpdateData(FALSE);}elsereturn;CDatabase m_database;//设置数据库连接时间m_database.SetLoginTimeout(600);m_database.SetQueryTimeout(600);if(!m_database.IsOpen()){if(!m_database.Open(_T( "tongxunlu")))MessageBox( "不能打开到该数据源的连接! "); }//在master下执行杀死与通讯录数据库连接的存储过程CString strSQL1;strSQL1="use master exec p_killspid '通讯录'";m_database.ExecuteSQL(strSQL1);//从所得路径回复数据库CString strSQL;strSQL.Format("restore database 通讯录from disk='%s'",m_path);m_database.ExecuteSQL(strSQL);//关闭数据库连接m_database.Close();AfxMessageBox("数据库还原成功!");//刷新列表框CLoginSet log;CString SQL;m_database.Open(_T("tongxunlu"));strSQL1="";strSQL1.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser); SQL.Format("select Ino,Iname from Information where Uusername='%s'",m_nowuser); log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL1);if(log.m_Uaccess=="DBA"){m_usermanage.EnableWindow(TRUE);RefreshList("select Ino,Iname from Information");}else{m_usermanage.EnableWindow(FALSE);RefreshList(SQL);}log.Close();m_database.Close();21.为注销按钮添加消息响应函数,代码如下CTongxunluApp *ptheApp=(CTongxunluApp*)AfxGetApp(); //获得登陆框的app指针CDialog::OnCancel(); //关闭当前通讯录框架对话框ptheApp->InitInstance(); //打开登陆框对话框22.插于对话框资源如图添加对话框控件图5-4 增加联系人控件图表5-5 增加联系人控件表ID 控件类型内容变量关联ID_ADD CButton 增加ID_ESCAPE CButton 取消IDE_ADBIRTHDAY CTime m_addbirthday IDE_ADDEMAIL CString m_addemail IDE_ADDMOBILE CString m_addmobile IDE_ADDNAME CString m_addname IDE_ADDNATION CString m_addnation IDE_ADDQQ CString m_addqqIDE_ADDREL CString m_addrel IDE_ADDRESUME CString m_addresume IDE_ADDSEX CString m_addsex IDE_ADDSMOBILE CString m_addsmobile IDE_ADDUNIT CString m_addunit IDE_INO CString m_addno 并给对话框添加新类CInsertDlg23.重载OnInitDialog()函数,添加如下代码BOOL CInsertDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization hereUpdateData(TRUE);CString InitNo;InitNo="select Ino from Information";CInfoSet tt;tt.Open(AFX_DB_USE_DEFAULT_TYPE,InitNo);tt.MoveLast();int x=atoi(tt.m_Ino);x+=1;CString xx;xx.Format("%d",x);m_addno=xx;UpdateData(FALSE);return TRUE;// return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}24.给增加按钮添加消息响应函数,添加代码如下UpdateData(TRUE);CString strSQL,SQL;SQL.Format("select Uaccess from [User] where Uusername='%s'",m_createname);CLoginSet log;if(!log.Open(AFX_DB_USE_DEFAULT_TYPE,SQL)){MessageBox("连接数据库失败","错误");return;}CInfoSet info;UpdateData();if(m_addno==""){MessageBox("请输入编号","错误!");return;}if(m_addname==""){MessageBox("请输入姓名","错误!");return;}if(m_addrel==""){MessageBox("请输入关系","错误!");return;}if(m_addsex==""){MessageBox("请输入性别","错误!");return;}strSQL.Format("select Ino from Information where Ino='%s'",m_addno); CInfoSet templog;templog.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);int i=templog.GetRecordCount();templog.Close();if(!info.Open(AFX_DB_USE_DEFAULT_TYPE)){MessageBox("打开数据库失败!","数据库错误",MB_OK);return;}info.SetFieldNull(NULL);info.AddNew();if(i==0)info.m_Ino=m_addno;else{MessageBox("有重复的编号,请更改");return;}info.m_Iname=m_addname;info.m_Isex=m_addsex;info.m_Ination=m_addnation;info.m_Irel=m_addrel;info.m_Ibirthday=m_addbirthday;info.m_Imobile=m_addmobile;info.m_Ismobile=m_addsmobile;info.m_Iqq=m_addqq;info.m_Iemile=m_addemail;info.m_Iunit=m_addunit;info.m_Iresume=m_addresume;info.m_Uusername=m_createname;info.Update();info.Close();CDialog::OnOK();25.给取消按钮添加消息响应函数,添加代码如下CDialog::OnCancel();26.添加成员函数Set(CString m_user),函数内容如下void CInsertDlg::Set(CString m_user){m_createname=m_user;}27.重载PreTranslateMessage函数,添加如下代码if(pMsg->message == WM_KEYDOWN){switch(pMsg->wParam){case VK_RETURN://屏蔽回车// OnKeyDown(VK_SPACE, LOWORD(pMsg ->lParam), HIWORD(pMsg->lParam));return TRUE;case VK_ESCAPE://屏蔽Escreturn TRUE;}}28.如图插入对话框并修改对话框上的控件图5-5 用户管理控件图表5-6 用户管理控件表ID 控件类型内容变量关联ID_ADDUSER CButton 添加ID_UCACLE CButton 取消ID_UPDATEPASS CButton 修改IDC_DELETEUSER CButton 删除ID_USERLIST CListCtrl m_userlist IDC_ACCESS CComboBox m_ctraccess IDC_GPASSWORD CString m_gpassword IDC_GUSERNAME CString m_gusername 并创建新类CuserManage29.重载OnInitDialog函数并添加如下代码m_userlist.InsertColumn(0,"用户名");m_userlist.InsertColumn(1,"密码");m_userlist.InsertColumn(2,"权限");RECT rectList;m_userlist.GetWindowRect(&rectList);int wid=rectList.right-rectList.left;m_userlist.SetColumnWidth(0,wid/3);m_userlist.SetColumnWidth(1,wid/3);m_userlist.SetColumnWidth(2,wid/3);m_userlist.SetExtendedStyle(LVS_EX_FULLROWSELECT);RefreshList("select * from [User]");m_ctraccess.AddString("普通用户");m_ctraccess.AddString("管理员");30.为添加按钮添加消息响应函数,添加如下代码CInsertNewUser dlg;if(dlg.DoModal()==IDOK)RefreshList("select * from [User]");UpdateData(FALSE);31.为列表添加单击相应,添加如下代码void CUserManage::OnClickUserlist(NMHDR* pNMHDR, LRESULT* pResult) {// TODO: Add your control notification handler code hereint i=m_userlist.GetSelectionMark();m_gusername=m_userlist.GetItemText(i,0);CString strSQL;strSQL.Format("select * from [User] where Uusername='%s'",m_gusername);CLoginSet log;log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);m_gpassword=log.m_Upassword;if(m_gusername=="admin"){m_ctraccess.EnableWindow(FALSE);UpdateData(FALSE);}else{m_ctraccess.EnableWindow(TRUE);UpdateData(FALSE);}CString temp;temp=log.m_Uaccess;if(temp=="DBA")m_ctraccess.SetCurSel(0);elsem_ctraccess.SetCurSel(1);UpdateData(FALSE);*pResult = 0;}32.为修改按钮添加消息响应函数,添加如下代码UpdateData(TRUE);CLoginSet log;CString strSQL;strSQL.Format("select * from [User] where Uusername='%s'",m_gusername);if(!log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)){。

相关主题