Presentation is loading. Please wait.

Presentation is loading. Please wait.

VC++开发实例 张荣梅 2007年2月.

Similar presentations


Presentation on theme: "VC++开发实例 张荣梅 2007年2月."— Presentation transcript:

1 VC++开发实例 张荣梅 2007年2月

2 软件开发 软件开发概述 软件产品产生过程 软件产品团队的组成 预备知识——VC++编程概述 开发实例 课程设计及其答辩

3 软件开发概述 软件项目的开发方法(软件工程中的软件开发模型) 软件产品的开发方法 传统软件开发与现代软件开发 现代软件开发对人才的要求
软件分为两类:软件产品和软件项目. 软件产品指的是不局限于特定领域的\可被广大用户直接使用的软件系统,如微软的Windows,Office等等.这类系统的特点是技术含量高,开发时要考虑到各种不同的用户需求. 软件项目指的是针对特定领域提供优化业务流程的软件系统,如我们常说的管理信息系统和电子商务系统.这类软件的特点是领域知识所占的比重较大,相对技术性而言,工程性更强. 软件项目的开发方法(软件工程中的软件开发模型) 软件产品的开发方法 传统软件开发与现代软件开发 现代软件开发对人才的要求 软件开发人员具备的能力

4 软件开发的周期 根据软件工程的思想,软件开发的周期可以划分为六个阶段: (1) 规划阶段
确定开发的总目标,给出计划开发的软件系统的功能、性能、可靠性以及接口等方面的设想。 (2) 需求分析阶段 认真细致地了解用户对数据的加工要求,确定系统的功能与边界。本阶段的最终结果,提供一个可作为设计基础的系统说明书,包括对软硬件环境的要求和一整套完善的数据流程图。 (3) 设计阶段 把需求分析阶段所确定的功能细化,主要工作是概念设计阶段、逻辑设计阶段、物理设计阶段,然后,对每个阶段内部设计详细的流程。 (4) 程序编制阶段 以一种或几种特定的程序设计语言表达上一阶段确定的各模块控制流程。程序编制时应遵循结构化程序设计方法。 (5) 调试阶段 对已编好的程序进行单元调试(分调),整体调试(联调)和系统测试(验收)。 (6) 运行和维护阶段 这是整个设计周期最长的阶段,其工作重点是收集和记录系统实际运行的数据。在运行中,必须保持数据库的完整性,必须有效的处理数据故障和进行数据库恢复。同时解决开发过程的遗留问题,改正错误进行功能完善。

5 软件产品的产生过程 新产品项目的提议 市场分析预测 技术可行性分析 制定产品研发实施步骤(功能规范/总体计划/总体进度表) 高层论证和审批
项目确立和执行 产品开发(概念设计/逻辑设计/物理设计/开发计划/编码/测试/文档整理)

6 传统软件开发与现代软件开发 软件开发包括计划、设计、实施、测试以及市场运作。
传统软件开发即作坊式的软件生产。开发工作主要依赖于开发人员的个人素质与程序设计技巧。特点是,缺少与程序有关的文档,软件开发的实际成本和进度与预计的相差太远。没有团队,项目管理松散,程序的可重用的成都差。可维护性差。生产率低,跟不上应用需求的增长速度。 现代软件开发强调采用分工与协作,重视项目管理和软件质量,采用工程化的方法进行文档的控制与代码的管理。

7 现代软件开发对人才的要求 扎实的基础 创新、独立的工作能力 主人翁精神(Ownership)和团队精神(Teamwork) 沟通与协调能力
成就感强,有激情 自觉地干好工作 锲而不舍,从错误中学习

8 产品的团队 互相沟通 沟通 软件开发 项目管理 软件测试 产品管理 后勤管理 用户培训 开发经理 项目经理 测试经理 产品经理 后勤经理
用户培训经理 沟通 产品团队的组成 高级的产品管理团队的组成

9 团队角色与主要目标 团队角色 主 要 目 标 产品管理 确定产品的远景,获取并确定用户的需求,开发并维护商业安全,满足用户的需求 项目管理
主 要 目 标 产品管理 确定产品的远景,获取并确定用户的需求,开发并维护商业安全,满足用户的需求 项目管理 制定开发功能规范,在团队内进行沟通和协商,维持产品进度并报告产品状态,保证能够尽快尽好地在产品约束条件下发布产品 软件开发 开发出满足设计和规范和用户要求的产品 软件测试 开发测试策略和计划,保证在解决了所有已知物体后再发布产品 用户培训 保证使用文档要全部很清楚地写出来,提高用户使用产品的技能,保证大多数用户都能够充分利用产品的功能 后勤管理 保证产品能够平稳地发展

10 产品管理团队的主要组成 产品的管理部门,管理部门的负责人即为产品总经理,同时包括产品计划、市场分析与研究、产品推销、市场、公共关系的负责人。
产品团队承担的角色(1)了解用户的想法;(2)确定项目的发展前景 产品总经理 产品计划 市场分析与研究 市场 产品推销 公共关系

11 项目管理团队 任务是控制决策的各种因素,以保证在合适的时间推出合适的产品,同时负责创建功能规定文档,并将它作为如何实施产品或服务的一种决策工具,以及日常协调工作。 操纵产品的开发过程 管理产品的细节 促进团队内部交流和商议 保证产品的开发进度 控制全局,并做出一些折中决定 项目团队管理 项目协调 产品按时发布 产品结构设计 项目管理团队所承担的角色

12 软件开发团队 任务负责代码的设计和程序的实现。角色是具体说明物理设计功能 估计完成每一个功能所需要的时间和人力 建立数据库 编码实现功能
配置并准备产品 开发管理 用户界面 数据库 系统服务 软件开发团队所承担的角色

13 软件测试团队 站在使用者和攻击者的角度,通过不断地使用刚开发出的软件产品,尽量多地找出产品中存在的问题。 角色是尽量找出所有的Bug
写出测试规范和测试计划 测试管理 强力测试 一致性测试 集成测试 配置测试 软件测试团队所承担的角色

14 参考书 软件开发的科学与艺术 陈宏刚等 电子工业出版社 (微软公司)

15 预备知识 对话框及其控件 ADO技术 ODBC技术 软件工程开发系统的步骤

16 教职工信息管理系统 ADO数据库应用系统 概述-----系统开发的背景与意义 功能需求分析 系统概要设计 数据库设计 系统详细设计与实现
系统测试 结论

17 概述 随着计算机及网络技术的飞速发展,Internet应用在全球范围内日益普及,当今社会正快速向信息化社会前进,信息系统的作用也越来越大。
学校教职工管理是学校管理中需要经常处理的一项工作,手工记录与查询相关信息既浪费时间又浪费人力和物力。采用计算机对教职工管理工作进行管理,可提高教职工管理的统一管理,实现高校教职工管理工作的系统化、规范化和自动化。因此,制作一个教职工管理管理系统有十分重要的意义。 本系统采用ADO技术,用VC++设计开发一个MIS系统

18 功能需求分析 本系统是为了解决学校管理中有关教职工信息和工资的管理,在教职工信息管理系统开发时应该满足以下几个方面的需求:
1. 教职工的基本信息管理,对教职工的信息进行录入,删除、修改以及对教职工信息的查询,应能根据不同的查询条件对教职工的信息进行查询操作。 2. 教职工的工资信息管理,对教职工工资信息进行录入,删除,修改以及对教职工工资信息的查询,应能根据不同的查询条件对教职工工资信息进行查询操 3. 用户权限管理。用户权限的设置,有授权的用户才可以查询、对有关信息进行录入,删除和修改。

19 系统概要设计 教职工信息管理系统 教职工基本信息管理 教职工工资管理 用户权限管理 教职工信息管理系统功能图
1. 教职工基本信息管理:包括添加、删除和查询。查询信息:用户可以选择不同的查询条件来对数据库进行操作,如可以按所在部门来查询每个学院有多少名教职工工,按职称来查询有多少教授,助教等,按编号可唯一查询一名教职工的基本信息。 2. 教职工工资信息管理:包括添加、删除和查询。查询信息:用户可以选择不同的查询条件来对数据库进行操作,如可以按姓名、编号、基本工资查询一名教职工工资信息。 3. 为用户设置功能权限,只有admin授权的用户才可以对有关信息进行入录,删除和查询操作,普通用户是没有权限来为本系统受权的。

20 数据库设计 workermanage.mdb
职工信息: 用于记录教职工的基本情况 职工工资信息: 用于记录教职工工资的基本情况 系统用户信息: 用于该系统管理员admin为用户授权的信息

21 职工信息表workerinfo 字段名称 字段类型 字段大小 索引 必须填写 职工姓名 文本 10 无 是 职工编号 16 职工性别 2
所在部门 20 职工年龄 文本 (整型) 工作时间 文本 时间 12 职务 职称 简历 200

22 职工工资信息表 字段名称 字段类型 字段大小 索引 必须填写 职工编号 文本 16 职工姓名 10 基本工资 浮点 其他工资 月收入

23 系统用户信息表 用Access创建数据库 .mdb,以及3张表 字段名称 字段类型 字段大小 索引 必须填写 用户名 文本 16 无 是
密码 18 用Access创建数据库 .mdb,以及3张表

24 系统详细设计与实现 界面设计 登录界面 代码实现 主界面 职工基本信息录入界面 职工基本信息查询界面 职工工资录入界面 职工工资查询界面
用户管理界面 代码实现

25 登录界面与主界面

26 职工基本信息操作界面

27 工资操作界面

28 用户管理界面

29 ADO环境的设置与数据库的连接 ADO环境的设置 在StdAfx.h文件中,加入如下语句:
#import “msado15.dll” no_namespace rename(“EOF”,“adoEOF”) 注意:将msado.dll复制到当前文件夹下 数据库的连接 在项目的App程序类中,加入成员变量 public: _ConnectionPtr m_pConnection;

30 数据库的连接 在项目的程序类的初始化例程函数中 ,添加连接数据库的代码: BOOL CMyApp::InitInstance() { 。。。。。。 ::CoInitialize(NULL); try {m_pConnection.CreateInstance("ADODB.Connection"); //创建Connection对象 m_pConnection->Open ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=workermanage.mdb","","",adModeUnknown); ///连接数据库 } catch(_com_error e) {AfxMessageBox("数据库连接失败,确认数据库workermanage.mdb是否在当前路径下!"); return FALSE; }

31 登陆界面的详细设计 IDD_LOGIN CLOGIN
工作流程: 用户输入用户名和密码,单击“确定”按钮, 在密码数据库中查找是否有这样的用户,如有则打开主界面,否则,重新输入用户名和密码。 控件类型 ID 属性 变量或函数 Picture IDC_STATIC Icon IDI_ICON1 Edit Box IDC_EDIT_ PASSWORD 选中Password CString m_password USERNAME CString m_username Button IDC_QUEDING 确定 OnQueding() IDCANCEL 取消

32 登录界面的代码实现 void CLOGIN:: OnQueding() {UpdateData(true);
if(m_password==""||m_username=="") MessageBox("用户名和密码不能为空,请输入完整!"); else { CString sql="select * from usermanage where name='"+m_username+“ ' and password='"+m_password+"'"; _RecordsetPtr m_pRecordset; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql, _variant_t((IDispatch*)(((CMyApp*)AfxGetApp())->m_pConnection),true), adOpenStatic,adLockOptimistic,adCmdText); } CString m_password CString m_username

33 试一试,修改程序,使用户登录时,有三次输入密码的机会
catch (_com_error e) { CATCH_ERROR; return; } if(!m_pRecordset->adoEOF) { CMyDlg dlg; //主界面 dlg.DoModal (); else MessageBox("用户名或密码不对,请重新登录!"); m_password=""; m_username=""; m_name.SetFocus (); UpdateData(false); CDialog::OnOK(); 试一试,修改程序,使用户登录时,有三次输入密码的机会

34 有三次输入密码的机会 void CLOGIN:: OnQueding() { UpdateData(true);
CString sql="select * from usermanage where name='"+m_username+"' and password='"+m_password+"'"; _RecordsetPtr m_pRecordset; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)(((CMyApp*)AfxGetApp())->m_pConnection),true),adOpenStatic,adLockOptimistic,adCmdText); } catch (_com_error e) CATCH_ERROR; return; }

35 if(!m_pRecordset->adoEOF) //如果存在这样的用户
{ EndDialog(IDOK); //结束登录对话框 CMyDlg dlg; //模式打开主对话框 dlg.DoModal (); } else { m_iLogOnCount++; //登录次数加1,成员变量 if(m_iLogOnCount>=3) //如果超过3次,则结束对话框,程序结束 { MessageBox("对不起!你不是该系统的用户,请与管理员联系!"); this->EndDialog(0); MessageBox("用户名或密码不对,请重新登录!"); m_password=""; m_username=""; m_name.SetFocus (); UpdateData(false); return;} CDialog::OnOK();

36 登陆界面的启动 Pulic: _C_ConnectionPtr m_pConnection; MFC创建的应用程序框架
BOOL CMyApp::InitInstance() { 。。。。。。 HRESULT hr; try {hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象 if(SUCCEEDED(hr)) hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source =workermanage.mdb","","",adModeUnknown);///连接数据库 } } catch(_com_error e) AfxMessageBox("数据库连接失败,确认数据库workermanage.mdb是否在当前路径下!"); return FALSE; CLOGIN dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) {。。。。。。} else if (nResponse == IDCANCEL) Pulic: _C_ConnectionPtr m_pConnection; MFC创建的应用程序框架 默认的是主界面CMuDlg,为了在程序启动后首先出现登陆界面,需要修改原来的代码为 CLOGIN

37 主界面的详细设计 IDD_MY_DIALOG
控件类型 ID 属性 函数 Button IDC_BUTTON_INFOMATION 职工信息入录 OnButtonInfomation() IDC_BUTTON_IN_S 职工信息查询 OnButtonInS() IDC_BUTTON_WAGE 职工工资入录 OnButtonWage() IDC_BUTTON_WA_S 职工工资查询 OnButtonWaS() IDC_BUTTON_UESR 用户管理 OnButtonUesr() 工作流程:在主界面中,选择某一按钮,弹出相应的操作界面。

38 主界面的代码实现 void CMyDlg::OnPaint() //显示背景图片 { CPaintDC dc(this);
背景图片为一事先用PHOTSHOP制作好的位图。首先将该图片插入到项目中,然后在对话框的OnPaint()中,用代码将其显示。也可在对话框中插入图片框来显示。 void CMyDlg::OnPaint() //显示背景图片 { CPaintDC dc(this); CRect rect; GetClientRect(rect); CBitmap * bitmap=new CBitmap; bitmap->LoadBitmap (IDB_BITMAP1); CDC * m_dc=new CDC; m_dc->CreateCompatibleDC (&dc); m_dc->SelectObject (bitmap); dc.BitBlt(0,0,rect.right,rect.bottom,m_dc,0,0,SRCCOPY); delete m_dc; delete bitmap; }

39 void CMyDlg::OnButtonInfomation() //基本信息操作
{ CINFOMATION dlg; dlg.DoModal (); } void CMyDlg::OnButtonWage() CWAGE dlg; void CMyDlg::OnButtonInS() //查询 CinfoSearch dlg; void CMyDlg::OnButtonWaS() CwageSearch dlg;

40 void CMyDlg::OnButtonUesr() //用户管理
{ CLOGIN *passwordDlg=(CLOGIN*)(AfxGetApp()->m_pMainWnd); if(passwordDlg->m_username =="admin") CUSER dlg; dlg.DoModal (); } else MessageBox("你没有权限进行该操作,请以管理员身份登陆此系统","警告", MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2);

41 职工基本信息界面设计 IDD_INFORMATION
控件类型 ID 属性 变量或函数 EDIT Box IDC_EDIT_ID CString m_id IDC_EDIT_NAME CString m_name IDC_EDIT_AGE CString (int) m_age IDC_EDIT_DEPARTMENT CString m_dep IDC_EDIT_TITLE CString m_title IDC_EDIT_WORKDATE CString m_workdate IDC_EDIT_HISTORY CString m_history Combo Box IDC_COMBO_PROF DATA 助教 讲师 CComboBox m_grade IDC_COMBO_SEX DATA 男 女 CComboBox m_sex Button IDC_BUTTON_ADD 增加 OnButtonAdd() IDC_BUTTON_BROWE 信息浏览 OnButtonBrowse() IDOK 取消 单击“增加”按钮,会将输入的信息添加到相应的数据库表中;单击“浏览”按钮,弹出浏览窗口。

42 基本信息界面的代码实现 void CINFOMATION::OnButtonAdd() { CString sex,grade,sql;
UpdateData (true); m_sex.GetWindowText (sex); m_grade.GetWindowText (grade); if(m_id==""|| m_dep ==""|| m_workdate ==""|| m_title ==""||m_name==""||m_history==""||m_age=="") MessageBox("参数不能为空,请输入完整!"); sql="select * from workerinfo where id='"+m_id+"'"; _RecordsetPtr m_pRecordset; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql, _variant_t((IDispatch*)(((CMyApp*)AfxGetApp())->m_pConnection),true), adOpenStatic,adLockOptimistic,adCmdText); } catch (_com_error e) { CATCH_ERROR; return; 基本信息界面的代码实现

43 也可采用命令指针实现 if(!m_pRecordset->adoEOF) { MessageBox("所添加的记录已经存在!"); }
else { _RecordsetPtr m_pRecordset; sql="insert into workerinfo values ('"+m_id+"','"+m_name+"','"+sex+"','"+m_age+"','"+m_title+"','"+m_workdate+"','"+m_dep+"','"+grade+"','"+m_history+"')"; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql, _variant_t((IDispatch*)(((CMyApp*)AfxGetApp())->m_pConnection),true),adOpenStatic,adLockOptimistic,adCmdText); } catch (_com_error e) { CATCH_ERROR; MessageBox("添加成功"); m_work==""; m_time=="";m_segment=="";m_name=="";m_history=="";m_age==""; UpdateData (false); 如果m_age是整型的,则sql应采用Format()函数来写 Sql.Format(“ %s %s %s %d ”,m_id,m_name,sex,m_age, ) 也可采用命令指针实现

44 浏览界面的详细设计与实现 IDD_INFORSEARCH
控件类型 ID 属性 变量或函数 ListCONTROL IDC_LIST_INFORS CListCtrl m_listis EDIT Box IDC_EDIT_TYPE CString m_edittype IDC_EDIT_NUMBER int m_number Combo Box IDC_COMBO_TYPE DATA 姓名性别年龄职称 所在部门 CComboBox m_combotype Button IDC_BUTTON_S 查询 OnButtonS() IDC_BUTTON_DEL 删除 OnButtonDel() IDOK 退出

45 对话框初始化 BOOL CinfoSearch::OnInitDialog() { CDialog::OnInitDialog();
//初始化列表控件 CString strListHead[9]; int width[9]; strListHead[0]="职工编号"; strListHead[1]="姓名"; strListHead[2]="性别"; strListHead[3]="年龄"; strListHead[4]="所在部门"; strListHead[5]="工作时间"; strListHead[6]="职务"; strListHead[7]="职称"; strListHead[8]="简历"; width[0]=80; width[1]=60; width[2]=60; width[3]=100; width[4]=100; width[5]=80; width[6]=80; width[7]=100; width[8]=100; m_listis.SetExtendedStyle (LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); for (int i=0;i<9;i++) m_listis.InsertColumn (i,strListHead[i],LVCFMT_CENTER,width[i]); } m_combotype.SetCurSel (1); //初始化数据信息 InitListData();

46 void CinfoSearch::InitListData()
{ _RecordsetPtr m_pRecordset; CString sql="select * from workerinfo"; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)(((CMyApp*)AfxGetApp())->m_pConnection),true),adOpenStatic,adLockOptimistic,adCmdText); } catch (_com_error e) { CATCH_ERROR;

47 m_listis.DeleteAllItems ();
CString strText; _variant_t var; int nItem=0; try { if (!m_pRecordset->BOF) m_pRecordset->MoveFirst(); while (!m_pRecordset->adoEOF) var=m_pRecordset->GetCollect("id"); if(var.vt !=VT_NULL) strText=(LPCSTR)_bstr_t(var); m_listis.InsertItem (nItem,strText); 。。。。。。。

48 nItem++; m_pRecordset->MoveNext(); } catch (_com_error e) { CATCH_ERROR; return;

49 查询 void CinfoSearch::OnButtonS() { CString combotype,edittype,sql;
int Item; m_combotype.GetWindowText(combotype); if (combotype=="姓名") m_edittype.GetWindowText (edittype); sql="select * from workerinfo where name='"+edittype+"'"; } if(combotype=="年龄") m_edittype.GetWindowText(edittype); sql="select * from workerinfo where age='"+edittype+"'"; if(combotype=="性别") sql="select * from workerinfo where sex='"+edittype+"'"; if(combotype=="所在部门") sql="select * from workerinfo where segment='"+edittype+"'"; if(combotype=="职称") sql="select * from workerinfo where grade='"+edittype+"'";

50 if(edittype=="") { MessageBox("请输入要查询的参数!"); } else m_listis.DeleteAllItems (); _RecordsetPtr m_pRecordset; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)(((CMyApp*)AfxGetApp())->m_pConnection),true),adOpenStatic,adLockOptimistic,adCmdText); catch (_com_error e) CATCH_ERROR; CString strText; _variant_t var; int nItem=0;

51 try { if (!m_pRecordset->BOF) m_pRecordset->MoveFirst(); while (!m_pRecordset->adoEOF) var=m_pRecordset->GetCollect("id"); if(var.vt !=VT_NULL) strText=(LPCSTR)_bstr_t(var); m_listis.InsertItem (nItem,strText); var=m_pRecordset->GetCollect("name"); m_listis.SetItemText (nItem,1,strText); var=m_pRecordset->GetCollect("sex"); m_listis.SetItemText (nItem,2,strText); 。。。。。。 nItem++; m_pRecordset->MoveNext(); } } }

52 catch (_com_error e) { CATCH_ERROR; return; } Item=m_listis.GetItemCount (); m_number=Item; UpdateData(false); if(Item==0) MessageBox("所查找的记录不存在!");

53 删除 if(nItem!=-1) strDelid=m_listis.GetItemText(nItem,0);
void CinfoSearch::OnButtonDel() { CString strDelid=_T(""),strSQL=""; int nItem=m_listis.GetNextItem(-1,LVNI_SELECTED); if(nItem!=-1) strDelid=m_listis.GetItemText(nItem,0); m_listis.DeleteItem(nItem); } strSQL="delete from workerinfo where id='"+strDelid+"' "; _RecordsetPtr m_pRecordset; try m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open ((_variant_t)strSQL,_variant_t((IDispatch*)(((CMyApp*)AfxGetApp())->m_pConnection),true),adOpenStatic,adLockOptimistic,adCmdText); catch(_com_error e) CATCH_ERROR;

54 用户权限管理 只有系统管理员有 资格进行用户的添加与删除; 一般用户拒绝。 控件类型 ID 属性 函数 Edit Box
IDC_EDIT_NAME CString m_name IDC_EDIT_CODE CString m_password IDC_EDIT_CODE1 CString m_password1 Button IDC_BUTTON_WA_S 添加 OnButtonAdd() IDC_BUTTON_UESR 删除 OnButtonDelr() 只有系统管理员有 资格进行用户的添加与删除; 一般用户拒绝。

55 添加用户 void CUSER::OnButtonAdd() { CString sql; UpdateData (true);
if(m_name==""||m_password=="") { MessageBox("参数不能为空,请输入完整!"); return; } if(m_password.Compare(m_password1)!=0) { MessageBox(“两次输入的密码不一致,请重新输入!“,”错误”,MB_OK|MB_ICONSTOP); else _CommandPtr m_pCommand; try m_pCommand.CreateInstance("ADODB.Command"); _variant_t vNULL; vNULL.vt=VT_ERROR; vNULL.scode=DISP_E_PARAMNOTFOUND; m_pCommand->ActiveConnection=m_pConnection; m_pCommand->CommandText ="insert into usermanage VALUES(m_name,m_password')"; m_pCommand->Execute(&vNULL,&vNULL,adCmdText); } catch (_com_error e) CATCH_ERROR; MessageBox("添加成功"); }} 添加用户

56 删除用户 如数据库中存在该用户,确定删除,否则报告错误 void CUSER::OnBtnDel() { CString sql;
UpdateData (true); if(m_name=="") MessageBox("参数不能为空,请输入完整!"); else { _RecordsetPtr m_pRecordset; CString strSQL1="select* from usermanage where name='"+m_name+"' "; CString strSQL="delete from usermanage where name='"+m_name+"' "; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)strSQL1,_variant_t((IDispatch*)(((CMyApp*)AfxGetApp())->m_pConnection),true),adOpenStatic,adLockOptimistic,adCmdText); if(!m_pRecordset->adoEOF) { if(MessageBox("你确定要删除此用户吗?","警告",MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2)==IDYES) m_pRecordset->Open((_variant_t)strSQL,_variant_t((IDispatch*)(((CMyApp*)AfxGetApp())->m_pConnection),true),adOpenStatic,adLockOptimistic,adCmdText); } { return; } } else { MessageBox("用户名不存在!"); return; } catch(_com_error e) { CATCH_ERROR; MessageBox("删除成功!"); 删除用户 如数据库中存在该用户,确定删除,否则报告错误

57 使用命令对象删除 _CommandPtr m_pCommand; try {
m_pCommand.CreateInstance("ADODB.Command"); _variant_t vNULL; vNULL.vt=VT_ERROR; vNULL.scode=DISP_E_PARAMNOTFOUND; m_pCommand->ActiveConnection=m_pConnection; m_pCommand->CommandText=strSQL; m_pCommand->Execute(&vNULL,&vNULL,adCmdText); } catch(_com_error e) //处理异常 AfxMessageBox(e.ErrorMessage() );

58 系统测试 编译运行 测试数据库的连接 测试错误输入

59 结论 完成了一个MIS的设计开发 系统的优点 存在的问题 进一步的工作

60 计算器 数据库系统 ODBC数据库 ADO数据库 多媒体播放器 文件的读与写 网络聊天室


Download ppt "VC++开发实例 张荣梅 2007年2月."

Similar presentations


Ads by Google