课程设计报告
题目: 基于VC++的客户资料管理系统的设计与实现
————数据库的设计
班 级: 10计科
姓 名:
学 号: PB10202812
院 系: 人 武 学 院
组 员:
2011年06 月9日
摘 要
客户资料管理系统是典型的客户信息管理系统,其主要的功能是把客户管理过程信息化,自动化以减轻人工的重复繁琐劳动。其开发主要包括后台数据库的建立维护以及前台应用程序的开发两个方面。对于后台数据库要求建立一个稳定的数据库,保持数据的一致性,完整性,安全性也是必要的。对于前台要求稳定,实用,易用。
本系统是为公司客户资料管理的各种工作而设计的。根据需求分析,需要实现对系统用户,基本信息(客户姓名、单位名称、联系电话相关信息等)的管理。
经过分析,本系统使用SQL SERVER做为其后台数据库,采用ADO 数据库链接技术;Visual C++做为开发工具, 提供了相当齐备的类库、友好的编程界面和多种多样的数据库访问技术。其中ADO 使得编写数据库应用程序变得简单容易。
公司客户资料管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性, 完整性,安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。
关键词: VC+ + 数据库; 客户资料管理系统; ADO技术
目录
第1章 需求分析……………………………………………………2 第2章 系统分析……………………………………………………3 第3章 数据库设计…………………………………………………4
3.1 建立E-R 图……………………………………………………4 3.2 SQL建立数据库及查询………………………………………5 3.3 ADO方式连接数据库的类实现………………………………8 3.4 ADO控件访问数据库……………………………………23 第4章 总结…………………………………………………………23 第5章 参考文献…………………………………………………24
1
第1章 需求分析
客户管理是一个企业在经营管理中不可缺少的部分,它的成功与否对于企业的发展来说都是至关重要的,所以公司客户管理系统应该能够为用户提供充足的信息和快捷的查询手段。但如果使用传统的人工直接统计的话,工作量十分的庞大,存在许多的缺点,如:效率低,保密性差,且如果客户多,时间一长,将产生大量的文件及数据,对于查找,更新和维护带来困难。
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
作为计算机应用的一部分,使用计算机对客户进行管理,可使人们从繁重而又单调的统计运算中解脱出来,仅用一些简单的操作便可及时准确地获得需要得信息。使企业实现科学化,正规化管理,与世界接轨。因此,开发这样一套管理软件成为很必要的事情。
此设计主要实现的功能有实现对系统用户,基本信息(客户姓名、单位名称、联系电话相关信息等)的管理。
需求分析阶段的工作结果是开发软件的重要基础,大量统计数字表明,软件系统中15%的错误起源于错误的需求。为了提高软件的质量,确保软件开发成功,降低软件的开发成本,一旦对目标系统提出一组要求之后,必须严格验证这些需求的正确性。一般来说,应从下面四个方面进行验证:
a. 一致性 所有需求必须是一致的,任何一条需求不能和其他需求互相矛
盾。
b. 完整性 需求必须是完整的,规格说明书应该包括用户需要的每一个功
能或性能。
c.现实性 指定的需求应该是用现有的硬件技术和软件技术基础上可以实
现的。对硬件技术的进步可以做些预测,对软件技术的进步很难做些预测,只能从现有的技术水平出发判断需求的现实性。
d. 有效性 必须证明需求是正确有效的,确保能解决用户面对的问题。 通过用户和设计者对上述需求分析所得到的管理系统功能的复查,并且对照上面几点要求进行验证,客户信息管理系提出的基本满足需求分析验证的要求。
2
第2章 系统分析
1. Visual C++
Visual C++是运行于Windows 平台上的交互式的可视化集成开发环境,它是美国Microsoft 公司开发的Microsoft Visual Studio 套件中的一部分。像其他可视化集成开发环境一样,Visual C++集程序的代码编辑、编译、连接和调试等功能于一体,给编程人员提供了一个完整方便的开发界面和许多有效的辅助开发工具。Visual C++的应用程序向导可以以很大一部分类型的程序提供框架代码,用户不用书写程序代码,只需按几个按钮就可以生成一些完整的可以运行的程序。
Visual C++具有以下优点:
1) 面向对象、可视化开发。提供了面向对象的应用程序框架MFC (Microsoft Foundation Class:微软基础类库),大大简化了程序员的编程工作,提高了模块的可重用性。Visual C++还提供了基于CASE 技术的可视化软件自动生成和维护工具AppWizard 、ClassWizard 、Visual Studio、WizardBar 等,帮助用户直观的、可视地设计程序的用户界面,可以方便的编写和管理各种类,维护程序源代码,从而提高了开发效率。用户可以简单而容易地使用C/C++编程。
2) 众多的开发商支持以及业已成为工业标准的MFC 类库。MFC 类库已经成为事实上的工业标准类库,得到了众多开发商和软件开发工具的支持;另外,由于众多的开发商都采用Visual C++进行软件开发,这样用Visual C++开发的程序就与别的应用软件有许多相似之处,易于学习和使用。
3)Visual C++封装了Windows 的API (应用程序接口)函数、USER 、KERNEL 、GDI 函数,帮助我们弄清了许多函数的组织方法,隐去了创建、维护窗口的许多复杂的例行工作,简化了编程。
2)ADO(ActiveX Data Object)
ADO 技术是基于OLE DB的访问接口,它继承了OLE DB技术的优点,并且,ADO 对OLE DB的接口作了封装,定义了ADO 对象,使程序开发得到简化,ADO 技术属于数据库访问的高层接口。
3
2. SQL主要语法
SQL SERVER 提供了关系数据库的查询语言SQL(Structured Query Language) , 是一种非常口语化、既易学又易懂的语法。此一语言几乎是每个资料库系统都必须提供的,,包含了资料的定义(DDL )以及资料的处理(DML )。SQL 原来拼成SEQUEL ,这语言的原型以“系统 R“的名字在 IBM 圣荷西实验室完成,经过IBM 内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统R 的技术基础发展出来 IBM 的产品。而且美国国家标准学会(ANSI )及国际标准化组织(ISO )在1987遵循一个几乎是以 IBM SQL 为基础的标准关连式资料语言定义。
第3章 数据库设计
3.1 建立E-R 图
E-R 图提供了表示实体性、属性和联系的方法:
● 实体性:用矩形表示,矩形框内写实体名。
● 属性:用椭圆形表示,并用无向边将其与相应的实体型连接起来。
● 联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连
接起来,同时在无向边旁标上联系连接起来。
客户资料E-R 图如图3-1所示
图3-1 客户实体及属性
4
3.2 SQL建立数据库及查询
3.2.1 数据规范化问题
当把数据库收集在一个二维表中,往往有很多重复的数据,即冗余度大。像这样的二维表是不宜作为数据库管理的,必须进行规范化后才能使用。数据规范化理论是研究如何将一个不好的关系模型转化成为好的关系模型。规范化理论认为,关系数据库中的每一个关系都要满足一定的规范。根据满足规范的条件不同,可分为五个等级,分别称为第一范式(1NF ),第二范式(2NF )……第五范式(5NF ),通常解决一般性问题时,只要把数据规范到第三范式(3NF )标准就可满足需要,不是规范化等级越高越好。下面给出第一、第二和第三范式的条件:
第一范式(1NF ):如果关系R 的所有属性都是不可再分的数据项,则称该关系为第一范式。记作R 属于1NF 。
第二范式(2NF ):若关系R 属于1NF ,且它的每一非主属性都完全依赖与关键字,则称R 属于第二范式。记作R 属于2NF 。
第三范式(3NF ):若关系R 属于2NF ,且每一非主属性都不传递依赖于关键字,则称R 属于第三范式。记作R 属于3NF 。
运用SQL server 2000新建一个数据库,客户管理所有客户信息的数据都保存在这个数据库中。
5
3.2..2设计表的结构
4.2.3 SQL建立数据库和表: create database Custom
create table customs
( Cus_name Varchar(50) primary key, Cus_Sex Varchar(4), Cus_ID Varchar(20), Hukou Varchar(100), Mobile Varchar(30),
Office_phone Varchar(30), Email Varchar(20), Remark Varchar(200), ); insert into
6
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('欧阳丽',' 女','[**************]17',' 毕节','[1**********]','0857-8222222','bijie@xj,com',NULL); insert into
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('吴维相',' 男','[***********]',' 毕节','[1**********]','0857-8266666','bijie@wwx,com',NULL); insert into
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('徐进',' 男','[***********]',' 毕节','[1**********]','0857-8888888','bijie@xj,com',NULL); insert into
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('陈云春',' 男','[**************]22',' 六盘水','[1**********]','0858-8666666','[email protected]',NULL); insert into
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('陈真秀',' 女','[**************]00',' 六盘水','[1**********]','0858-86686866','[email protected]',NULL); insert into
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('张成明',' 男','[**************]22',' 贵阳','[1**********]','0857-8899999','[email protected]',NULL);
7
3.2.4 SQL查询及结果:
select Cus_name 客户名,Cus_Sex 性别,Cus_ID 身份证号,Hukou 户口所在地,Mobile 手机号码,Office_phone 办公电话E,Email 邮箱,Remark 备注
from customs
3.3 ADO方式连接数据库的类实现 #include "StdAfx.h"
#import"F:\VC++.6.0.SP6\VC6CN\SHARED\ADO\msado15.dll"no_namespace rename("EOF","adoEOF")rename("EOF","adoEOF") class ADOConn { public:
_ConnectionPtr m_pConnection;//指向Connection 对象的指针 _RecordsetPtr m_pRecordset;//指向Recordset 对象的指针
public:
ADOConn(){} virtual ~ADOConn(){}
void OnInitADOConn();//初始化——连接数据库
8
_RecordsetPtr&GetRecordset(_bstr_t bstrSQL);//执行查 BOOL ExecuteSQL(_bstr_t bstrSQL);//执行SQL 语句Insert Update_variant_t };
void ADOConn::OnInitADOConn()//初始化一个连接数据库 {
::CoInitialize(NULL);//初始化OLE/COM库环境 try {
//创建Connection 对象
m_pConnection.CreateInstance("ADODB.Connection");//设void ExitConnect();
置连接字符串,必须是BSTR 型或者_bstr_t类型 _bstr_t
strConnect="Provider=SQLOLEDB.1;Integrated
Security=SSPI;Persist Security Info=False; Initial Catalog=Custom; Data Source=local;"; }
catch(_com_error e)//捕捉异常
9
m_pConnection->Open(strConnect,"","",adModeUnknown);
{
AfxMessageBox(e.Description());//显示错误信息 } }
_RecordsetPtr& ADOConn::GetRecordset(_bstr_t bstrSQL)//执行数据库查询 { try {
//连接数据库,如果Connection 对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(), }
catch(_com_error e) {
AfxMessageBox(e.Description()); }
adOpenDynamic,adLockOptimistic,adCmdText);
return m_pRecordset;//返回记录集
}
10
BOOL ADOConn::ExecuteSQL (_bstr_t bstrSQL)//执行SQL 语句 { try {
if(m_pConnection==NULL) OnInitADOConn();
//Connection对象的Execute 方法:
//(_bstr_tCommandText,VARIANT*RecordsAffected,longOptions) //其中CommandText 是命令字符串,通常是SQL 命令 //参数RecordsAffected 是操作完成后所影响的行数
//参数Options 表示CommandText 的类型:adCmdText ——文本 //命令,adCmdTable ——表名;adCmdProc ——存储过程; //adCmdUnkown——未知
m_pConnection->Execute (bstrSQL,NULL,adCmdText);
return true; }
catch(_com_error e)
{ }
AfxMessageBox(e.Description()); return false;
} 11
void ADOConn::ExitConnect()//断开与数据库的连接 { if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
::CoUninitialize();//关闭OLE/COM库并释放资源
}
class customs//创建对象客户customs 类 { private: int Cus_ID;
CString Cus_name; CString Cus_Sex; CString Hukou; CString Mobile; int Office_phone; CString Email;
CString Remark; public: customs();
virtual ~customs(){}
//设置和读取成员变量值 12
int GetCus_ID();
void SetCus_ID(int vCusId); CString GetCus_name();
void SetCus_nam(CString vCusname); CString GetCus_Sex(); void SetCus_Sex(CString vSex); CString GetEmail();
void SetEmail(CString vEmail); CString GetRemark();
void SetRemark(CString vRemark); int GetOffice_phone();
void SetOffice_phone(int vphone); CString GetHukou();
void SetHukou(CString vHukou); CString GetMobile();
void SetMobile(CString vMobile); void SetCus_name(CString vcusName); //数据库操作 void sql_insert();
void sql_update(CString cCus_name); void sql_delete(CString Cus_name);
13
void GetData(CString cCus_name);//根据客户名字读取所有字段 };
customs::customs() { Cus_ID=0; Cus_name=""; Cus_Sex=""; Hukou=""; Office_phone=0;
Mobile=""; Email=""; Remark="";
}
//设置和读取成员变量值 int customs::GetCus_ID() { return Cus_ID; }
void customs::SetCus_ID(int vcusId) {
Cus_ID=vcusId; }
14
CString customs::GetCus_name() { return Cus_name;
}
void customs::SetCus_name(CString vCusName) { Cus_name=vCusName;
}
CString customs::GetCus_Sex()//获取Sex(性别) 变量 { return Cus_Sex;
}
void customs::SetCus_Sex(CString vSex) { Cus_Sex=vSex;
}
CString customs::GetHukou()//获取HuKou(户口) 变量 { return Hukou;
}
15
void customs::SetHukou(CString vHukou) {
Hukou=vHukou;
}
int customs::GetOffice_phone()//获取Office_phone(办公电话) 变量 {
return Office_phone; }
void customs::SetOffice_phone(int vOffice_phone) { }
CString customs::GetEmail()//获取Email(邮箱) 变量 { }
void customs::SetEmail(CString vEmail) {
Email=vEmail; return Email;
Office_phone=vOffice_phone;
} 16
CString customs::GetRemark()//获取Remark(备注) 变量 { return Remark;
}
void customs::SetRemark(CString vRemark) { Remark=vRemark; }
CString customs::GetMobile()//获取Mobile(手机号) 变量{ return Mobile; }
void customs::SetMobile(CString vMobile) { Mobile=vMobile; }
void customs::sql_insert()//函数sql_insert的实现 { ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn(); //设置查询语句 17
CString strRemark;
strRemark.Format("%s",Remark); _bstr_t vSQL; vSQL="INSERT
INTO
customs(Cus_ID,Cus_name,Hukou,Cus_Sex,Mobile,Remark,Office_phone,Email)
V ALUES(1,'"+Cus_name+"','"+Hukou+"','"+Cus_Sex+"','"+Mobile+"',"+strRemark+",1,'"+Email+"')"; //执行INSERT 语句 }
void customs::sql_update(CString cCus_name)//函数sql_update的
//实现
{
ADOConn m_AdoConn; m_AdoConn.OnInitADOConn(); CString strRemark;
strRemark.Format("%s",strRemark); _bstr_t vSQL; char sql[100];
m_AdoConn.ExecuteSQL(vSQL);
m_AdoConn.ExitConnect();//断开与数据库的连接
18
strcpy(sql, ""); strcpy(sql, "UPDATE customs SET Cus_ID="); char temp[10]; itoa(Cus_ID, temp, 10); strcat(sql, temp); strcat(sql, ",Hukou='"); strcat(sql, Hukou); strcat(sql, "',Cus_Sex='"); strcat(sql, Cus_Sex); strcat(sql, "',Mobile='"); strcat(sql, Mobile); strcat(sql, "',Remark='"); strcat(sql, Remark);
//strcat(sql, "',Office_phone='"); //strcat(sql, Office_phone); itoa(Office_phone,temp,10); strcat(sql, "',Email='"); strcat(sql, Email);
//itoa(Cus_name, temp, 10);
strcat(sql,"',Cus_name='"); strcat(sql,Cus_name);
19
strcat(sql, "'WHERE Cus_name =");
strcat(sql, temp);
//vSQL="UPDATE Customs SET
Cus_ID="+Cus_ID+",Hukou='"+Hukou+"',Cus_Sex='"+Cus_Sex+"',Mobile='"+Mobile+"',Remark='"+Remark+"',Cus_name='"+Cus_name+"',Email='"+Email+"'WHERE Office_phone="+Office_phone; }
void customs::sql_delete(CString cCus_name) //函数sql_delete的
//实现
{
ADOConn m_AdoConn; m_AdoConn.OnInitADOConn(); m_AdoConn.ExecuteSQL(vSQL); m_AdoConn.ExitConnect();
//设置DELETE 语句
_bstr_t vSQL;
FROM
customs
WHERE
vSQL="DELETE
Cus_name="+cCus_name; //执行DELETE 语句
m_AdoConn.ExecuteSQL(vSQL);
20
m_AdoConn.ExitConnect(); }
void customs::GetData(CString cCusID)//函数GetData 的实现 {
ADOConn m_AdoConn; m_AdoConn.OnInitADOConn(); _bstr_t vSQL; vSQL="SELECT
*
FROM
customs
WHERE
Cus_ID="+cCusID; //执行SELETE 语句
Cus_name=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Cu_RecordsetPtr m_pRecordset;
m_pRecordset=m_AdoConn.GetRecordset(vSQL); if(m_pRecordset->adoEOF==1)
customs();
else {
Cus_ID=atoi(cCusID);
s_name");
21
Cus_Sex=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect(" Cus_Sex"); ");
Mobile=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("MobilHukou=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Hukou
e"); ;
Remark=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("RemaEmail=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Email")
rk");
Office_phone=atoi((LPCTSTR)(_bstr_t)m_pRecordset->GetColl
ect("Office_phone")); }
void main() {}
运行:
}
m_AdoConn.ExitConnect();//断开与数据库的连接
22
3.4 ADO控件访问数据库
在应用程序中添加Microsoft ADO Data和Microsoft DataGrid两个控件,并且在Microsoft ADO Data 控件ConnectionString 属性中添加连接数据库据库的属性值(Provider=SQLOLEDB.1;Data Source=MyPCSERVER Integrated Security=SSPI; Initial Catalog=Custom Persist Security Info=False)、Recordsource 属性中添加查询数据库表的属性值(SELECT * FROM customs),然后测试连接数据库,连接成功,编译、运行得到如图3-4查询结果。
ADO 控件访问数据库运行结果:
图3-4
第4章 总结
主要的分工情况如下:徐进(数据库的设计和查询的实现)、吴维相(进行添加、删除、修改等设计)、陈云春(用户权限控制、系统测试)
通过这几个星期的努力,客户资料管理系统的设计与开发已完成。其基本功能包括:增加、删除、修改、查询,客户基本信息管理(客户姓名、单位名称、 联系电话)相关信息等功能已基本达到。这次课程设计是按照软件开发流程进行
23
的。从一开始的详细设计,用UML 描绘出系统的基本框架,到数据库的设计,以 及每个部分的实现,采用了面向对象的思想,这对系统的日后维护及功能的扩充有很大的帮助。在这几个星期的开发过程中,加深了对Visual C++ 的理解,对SQL SERVER数据库使用也比较熟练,尤其是SQL 语句的使用。最重要的是,我们对这样一个大的程序的编写过程中,培养了自学的能力, 对C++语言的认识有了进一步的提高。尤其是软件的开发过程中,十分注重的是团队的合作精神,这是我们在这次课程设计中深刻体会到的。
第5章 参考文献
【1】 张海藩 牟永敏 面向对象程序设计实用教程(第二版) 清华大学出版社
2007年
【2】 陈天华 面向对象程序设计与Visual C++6.0教程 清华大学出版社
2006年
【3】萨师煊、王珊. 数据库系统概论(第四版). 高等教育出版社. 2006年.
【4】张海藩 软件工程导论(第五版) 清华大学出版社 2008年 【5】安训国 数据结构(第四版) 大连理工大学出版社 2001年 【6】http://www.docin.com/p-222962908.html
24
课程设计报告
题目: 基于VC++的客户资料管理系统的设计与实现
————数据库的设计
班 级: 10计科
姓 名:
学 号: PB10202812
院 系: 人 武 学 院
组 员:
2011年06 月9日
摘 要
客户资料管理系统是典型的客户信息管理系统,其主要的功能是把客户管理过程信息化,自动化以减轻人工的重复繁琐劳动。其开发主要包括后台数据库的建立维护以及前台应用程序的开发两个方面。对于后台数据库要求建立一个稳定的数据库,保持数据的一致性,完整性,安全性也是必要的。对于前台要求稳定,实用,易用。
本系统是为公司客户资料管理的各种工作而设计的。根据需求分析,需要实现对系统用户,基本信息(客户姓名、单位名称、联系电话相关信息等)的管理。
经过分析,本系统使用SQL SERVER做为其后台数据库,采用ADO 数据库链接技术;Visual C++做为开发工具, 提供了相当齐备的类库、友好的编程界面和多种多样的数据库访问技术。其中ADO 使得编写数据库应用程序变得简单容易。
公司客户资料管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性, 完整性,安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。
关键词: VC+ + 数据库; 客户资料管理系统; ADO技术
目录
第1章 需求分析……………………………………………………2 第2章 系统分析……………………………………………………3 第3章 数据库设计…………………………………………………4
3.1 建立E-R 图……………………………………………………4 3.2 SQL建立数据库及查询………………………………………5 3.3 ADO方式连接数据库的类实现………………………………8 3.4 ADO控件访问数据库……………………………………23 第4章 总结…………………………………………………………23 第5章 参考文献…………………………………………………24
1
第1章 需求分析
客户管理是一个企业在经营管理中不可缺少的部分,它的成功与否对于企业的发展来说都是至关重要的,所以公司客户管理系统应该能够为用户提供充足的信息和快捷的查询手段。但如果使用传统的人工直接统计的话,工作量十分的庞大,存在许多的缺点,如:效率低,保密性差,且如果客户多,时间一长,将产生大量的文件及数据,对于查找,更新和维护带来困难。
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
作为计算机应用的一部分,使用计算机对客户进行管理,可使人们从繁重而又单调的统计运算中解脱出来,仅用一些简单的操作便可及时准确地获得需要得信息。使企业实现科学化,正规化管理,与世界接轨。因此,开发这样一套管理软件成为很必要的事情。
此设计主要实现的功能有实现对系统用户,基本信息(客户姓名、单位名称、联系电话相关信息等)的管理。
需求分析阶段的工作结果是开发软件的重要基础,大量统计数字表明,软件系统中15%的错误起源于错误的需求。为了提高软件的质量,确保软件开发成功,降低软件的开发成本,一旦对目标系统提出一组要求之后,必须严格验证这些需求的正确性。一般来说,应从下面四个方面进行验证:
a. 一致性 所有需求必须是一致的,任何一条需求不能和其他需求互相矛
盾。
b. 完整性 需求必须是完整的,规格说明书应该包括用户需要的每一个功
能或性能。
c.现实性 指定的需求应该是用现有的硬件技术和软件技术基础上可以实
现的。对硬件技术的进步可以做些预测,对软件技术的进步很难做些预测,只能从现有的技术水平出发判断需求的现实性。
d. 有效性 必须证明需求是正确有效的,确保能解决用户面对的问题。 通过用户和设计者对上述需求分析所得到的管理系统功能的复查,并且对照上面几点要求进行验证,客户信息管理系提出的基本满足需求分析验证的要求。
2
第2章 系统分析
1. Visual C++
Visual C++是运行于Windows 平台上的交互式的可视化集成开发环境,它是美国Microsoft 公司开发的Microsoft Visual Studio 套件中的一部分。像其他可视化集成开发环境一样,Visual C++集程序的代码编辑、编译、连接和调试等功能于一体,给编程人员提供了一个完整方便的开发界面和许多有效的辅助开发工具。Visual C++的应用程序向导可以以很大一部分类型的程序提供框架代码,用户不用书写程序代码,只需按几个按钮就可以生成一些完整的可以运行的程序。
Visual C++具有以下优点:
1) 面向对象、可视化开发。提供了面向对象的应用程序框架MFC (Microsoft Foundation Class:微软基础类库),大大简化了程序员的编程工作,提高了模块的可重用性。Visual C++还提供了基于CASE 技术的可视化软件自动生成和维护工具AppWizard 、ClassWizard 、Visual Studio、WizardBar 等,帮助用户直观的、可视地设计程序的用户界面,可以方便的编写和管理各种类,维护程序源代码,从而提高了开发效率。用户可以简单而容易地使用C/C++编程。
2) 众多的开发商支持以及业已成为工业标准的MFC 类库。MFC 类库已经成为事实上的工业标准类库,得到了众多开发商和软件开发工具的支持;另外,由于众多的开发商都采用Visual C++进行软件开发,这样用Visual C++开发的程序就与别的应用软件有许多相似之处,易于学习和使用。
3)Visual C++封装了Windows 的API (应用程序接口)函数、USER 、KERNEL 、GDI 函数,帮助我们弄清了许多函数的组织方法,隐去了创建、维护窗口的许多复杂的例行工作,简化了编程。
2)ADO(ActiveX Data Object)
ADO 技术是基于OLE DB的访问接口,它继承了OLE DB技术的优点,并且,ADO 对OLE DB的接口作了封装,定义了ADO 对象,使程序开发得到简化,ADO 技术属于数据库访问的高层接口。
3
2. SQL主要语法
SQL SERVER 提供了关系数据库的查询语言SQL(Structured Query Language) , 是一种非常口语化、既易学又易懂的语法。此一语言几乎是每个资料库系统都必须提供的,,包含了资料的定义(DDL )以及资料的处理(DML )。SQL 原来拼成SEQUEL ,这语言的原型以“系统 R“的名字在 IBM 圣荷西实验室完成,经过IBM 内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统R 的技术基础发展出来 IBM 的产品。而且美国国家标准学会(ANSI )及国际标准化组织(ISO )在1987遵循一个几乎是以 IBM SQL 为基础的标准关连式资料语言定义。
第3章 数据库设计
3.1 建立E-R 图
E-R 图提供了表示实体性、属性和联系的方法:
● 实体性:用矩形表示,矩形框内写实体名。
● 属性:用椭圆形表示,并用无向边将其与相应的实体型连接起来。
● 联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连
接起来,同时在无向边旁标上联系连接起来。
客户资料E-R 图如图3-1所示
图3-1 客户实体及属性
4
3.2 SQL建立数据库及查询
3.2.1 数据规范化问题
当把数据库收集在一个二维表中,往往有很多重复的数据,即冗余度大。像这样的二维表是不宜作为数据库管理的,必须进行规范化后才能使用。数据规范化理论是研究如何将一个不好的关系模型转化成为好的关系模型。规范化理论认为,关系数据库中的每一个关系都要满足一定的规范。根据满足规范的条件不同,可分为五个等级,分别称为第一范式(1NF ),第二范式(2NF )……第五范式(5NF ),通常解决一般性问题时,只要把数据规范到第三范式(3NF )标准就可满足需要,不是规范化等级越高越好。下面给出第一、第二和第三范式的条件:
第一范式(1NF ):如果关系R 的所有属性都是不可再分的数据项,则称该关系为第一范式。记作R 属于1NF 。
第二范式(2NF ):若关系R 属于1NF ,且它的每一非主属性都完全依赖与关键字,则称R 属于第二范式。记作R 属于2NF 。
第三范式(3NF ):若关系R 属于2NF ,且每一非主属性都不传递依赖于关键字,则称R 属于第三范式。记作R 属于3NF 。
运用SQL server 2000新建一个数据库,客户管理所有客户信息的数据都保存在这个数据库中。
5
3.2..2设计表的结构
4.2.3 SQL建立数据库和表: create database Custom
create table customs
( Cus_name Varchar(50) primary key, Cus_Sex Varchar(4), Cus_ID Varchar(20), Hukou Varchar(100), Mobile Varchar(30),
Office_phone Varchar(30), Email Varchar(20), Remark Varchar(200), ); insert into
6
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('欧阳丽',' 女','[**************]17',' 毕节','[1**********]','0857-8222222','bijie@xj,com',NULL); insert into
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('吴维相',' 男','[***********]',' 毕节','[1**********]','0857-8266666','bijie@wwx,com',NULL); insert into
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('徐进',' 男','[***********]',' 毕节','[1**********]','0857-8888888','bijie@xj,com',NULL); insert into
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('陈云春',' 男','[**************]22',' 六盘水','[1**********]','0858-8666666','[email protected]',NULL); insert into
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('陈真秀',' 女','[**************]00',' 六盘水','[1**********]','0858-86686866','[email protected]',NULL); insert into
customs(Cus_name,Cus_Sex,Cus_ID,Hukou,Mobile,Office_phone,Email,Remark)
values('张成明',' 男','[**************]22',' 贵阳','[1**********]','0857-8899999','[email protected]',NULL);
7
3.2.4 SQL查询及结果:
select Cus_name 客户名,Cus_Sex 性别,Cus_ID 身份证号,Hukou 户口所在地,Mobile 手机号码,Office_phone 办公电话E,Email 邮箱,Remark 备注
from customs
3.3 ADO方式连接数据库的类实现 #include "StdAfx.h"
#import"F:\VC++.6.0.SP6\VC6CN\SHARED\ADO\msado15.dll"no_namespace rename("EOF","adoEOF")rename("EOF","adoEOF") class ADOConn { public:
_ConnectionPtr m_pConnection;//指向Connection 对象的指针 _RecordsetPtr m_pRecordset;//指向Recordset 对象的指针
public:
ADOConn(){} virtual ~ADOConn(){}
void OnInitADOConn();//初始化——连接数据库
8
_RecordsetPtr&GetRecordset(_bstr_t bstrSQL);//执行查 BOOL ExecuteSQL(_bstr_t bstrSQL);//执行SQL 语句Insert Update_variant_t };
void ADOConn::OnInitADOConn()//初始化一个连接数据库 {
::CoInitialize(NULL);//初始化OLE/COM库环境 try {
//创建Connection 对象
m_pConnection.CreateInstance("ADODB.Connection");//设void ExitConnect();
置连接字符串,必须是BSTR 型或者_bstr_t类型 _bstr_t
strConnect="Provider=SQLOLEDB.1;Integrated
Security=SSPI;Persist Security Info=False; Initial Catalog=Custom; Data Source=local;"; }
catch(_com_error e)//捕捉异常
9
m_pConnection->Open(strConnect,"","",adModeUnknown);
{
AfxMessageBox(e.Description());//显示错误信息 } }
_RecordsetPtr& ADOConn::GetRecordset(_bstr_t bstrSQL)//执行数据库查询 { try {
//连接数据库,如果Connection 对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(), }
catch(_com_error e) {
AfxMessageBox(e.Description()); }
adOpenDynamic,adLockOptimistic,adCmdText);
return m_pRecordset;//返回记录集
}
10
BOOL ADOConn::ExecuteSQL (_bstr_t bstrSQL)//执行SQL 语句 { try {
if(m_pConnection==NULL) OnInitADOConn();
//Connection对象的Execute 方法:
//(_bstr_tCommandText,VARIANT*RecordsAffected,longOptions) //其中CommandText 是命令字符串,通常是SQL 命令 //参数RecordsAffected 是操作完成后所影响的行数
//参数Options 表示CommandText 的类型:adCmdText ——文本 //命令,adCmdTable ——表名;adCmdProc ——存储过程; //adCmdUnkown——未知
m_pConnection->Execute (bstrSQL,NULL,adCmdText);
return true; }
catch(_com_error e)
{ }
AfxMessageBox(e.Description()); return false;
} 11
void ADOConn::ExitConnect()//断开与数据库的连接 { if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
::CoUninitialize();//关闭OLE/COM库并释放资源
}
class customs//创建对象客户customs 类 { private: int Cus_ID;
CString Cus_name; CString Cus_Sex; CString Hukou; CString Mobile; int Office_phone; CString Email;
CString Remark; public: customs();
virtual ~customs(){}
//设置和读取成员变量值 12
int GetCus_ID();
void SetCus_ID(int vCusId); CString GetCus_name();
void SetCus_nam(CString vCusname); CString GetCus_Sex(); void SetCus_Sex(CString vSex); CString GetEmail();
void SetEmail(CString vEmail); CString GetRemark();
void SetRemark(CString vRemark); int GetOffice_phone();
void SetOffice_phone(int vphone); CString GetHukou();
void SetHukou(CString vHukou); CString GetMobile();
void SetMobile(CString vMobile); void SetCus_name(CString vcusName); //数据库操作 void sql_insert();
void sql_update(CString cCus_name); void sql_delete(CString Cus_name);
13
void GetData(CString cCus_name);//根据客户名字读取所有字段 };
customs::customs() { Cus_ID=0; Cus_name=""; Cus_Sex=""; Hukou=""; Office_phone=0;
Mobile=""; Email=""; Remark="";
}
//设置和读取成员变量值 int customs::GetCus_ID() { return Cus_ID; }
void customs::SetCus_ID(int vcusId) {
Cus_ID=vcusId; }
14
CString customs::GetCus_name() { return Cus_name;
}
void customs::SetCus_name(CString vCusName) { Cus_name=vCusName;
}
CString customs::GetCus_Sex()//获取Sex(性别) 变量 { return Cus_Sex;
}
void customs::SetCus_Sex(CString vSex) { Cus_Sex=vSex;
}
CString customs::GetHukou()//获取HuKou(户口) 变量 { return Hukou;
}
15
void customs::SetHukou(CString vHukou) {
Hukou=vHukou;
}
int customs::GetOffice_phone()//获取Office_phone(办公电话) 变量 {
return Office_phone; }
void customs::SetOffice_phone(int vOffice_phone) { }
CString customs::GetEmail()//获取Email(邮箱) 变量 { }
void customs::SetEmail(CString vEmail) {
Email=vEmail; return Email;
Office_phone=vOffice_phone;
} 16
CString customs::GetRemark()//获取Remark(备注) 变量 { return Remark;
}
void customs::SetRemark(CString vRemark) { Remark=vRemark; }
CString customs::GetMobile()//获取Mobile(手机号) 变量{ return Mobile; }
void customs::SetMobile(CString vMobile) { Mobile=vMobile; }
void customs::sql_insert()//函数sql_insert的实现 { ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn(); //设置查询语句 17
CString strRemark;
strRemark.Format("%s",Remark); _bstr_t vSQL; vSQL="INSERT
INTO
customs(Cus_ID,Cus_name,Hukou,Cus_Sex,Mobile,Remark,Office_phone,Email)
V ALUES(1,'"+Cus_name+"','"+Hukou+"','"+Cus_Sex+"','"+Mobile+"',"+strRemark+",1,'"+Email+"')"; //执行INSERT 语句 }
void customs::sql_update(CString cCus_name)//函数sql_update的
//实现
{
ADOConn m_AdoConn; m_AdoConn.OnInitADOConn(); CString strRemark;
strRemark.Format("%s",strRemark); _bstr_t vSQL; char sql[100];
m_AdoConn.ExecuteSQL(vSQL);
m_AdoConn.ExitConnect();//断开与数据库的连接
18
strcpy(sql, ""); strcpy(sql, "UPDATE customs SET Cus_ID="); char temp[10]; itoa(Cus_ID, temp, 10); strcat(sql, temp); strcat(sql, ",Hukou='"); strcat(sql, Hukou); strcat(sql, "',Cus_Sex='"); strcat(sql, Cus_Sex); strcat(sql, "',Mobile='"); strcat(sql, Mobile); strcat(sql, "',Remark='"); strcat(sql, Remark);
//strcat(sql, "',Office_phone='"); //strcat(sql, Office_phone); itoa(Office_phone,temp,10); strcat(sql, "',Email='"); strcat(sql, Email);
//itoa(Cus_name, temp, 10);
strcat(sql,"',Cus_name='"); strcat(sql,Cus_name);
19
strcat(sql, "'WHERE Cus_name =");
strcat(sql, temp);
//vSQL="UPDATE Customs SET
Cus_ID="+Cus_ID+",Hukou='"+Hukou+"',Cus_Sex='"+Cus_Sex+"',Mobile='"+Mobile+"',Remark='"+Remark+"',Cus_name='"+Cus_name+"',Email='"+Email+"'WHERE Office_phone="+Office_phone; }
void customs::sql_delete(CString cCus_name) //函数sql_delete的
//实现
{
ADOConn m_AdoConn; m_AdoConn.OnInitADOConn(); m_AdoConn.ExecuteSQL(vSQL); m_AdoConn.ExitConnect();
//设置DELETE 语句
_bstr_t vSQL;
FROM
customs
WHERE
vSQL="DELETE
Cus_name="+cCus_name; //执行DELETE 语句
m_AdoConn.ExecuteSQL(vSQL);
20
m_AdoConn.ExitConnect(); }
void customs::GetData(CString cCusID)//函数GetData 的实现 {
ADOConn m_AdoConn; m_AdoConn.OnInitADOConn(); _bstr_t vSQL; vSQL="SELECT
*
FROM
customs
WHERE
Cus_ID="+cCusID; //执行SELETE 语句
Cus_name=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Cu_RecordsetPtr m_pRecordset;
m_pRecordset=m_AdoConn.GetRecordset(vSQL); if(m_pRecordset->adoEOF==1)
customs();
else {
Cus_ID=atoi(cCusID);
s_name");
21
Cus_Sex=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect(" Cus_Sex"); ");
Mobile=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("MobilHukou=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Hukou
e"); ;
Remark=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("RemaEmail=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Email")
rk");
Office_phone=atoi((LPCTSTR)(_bstr_t)m_pRecordset->GetColl
ect("Office_phone")); }
void main() {}
运行:
}
m_AdoConn.ExitConnect();//断开与数据库的连接
22
3.4 ADO控件访问数据库
在应用程序中添加Microsoft ADO Data和Microsoft DataGrid两个控件,并且在Microsoft ADO Data 控件ConnectionString 属性中添加连接数据库据库的属性值(Provider=SQLOLEDB.1;Data Source=MyPCSERVER Integrated Security=SSPI; Initial Catalog=Custom Persist Security Info=False)、Recordsource 属性中添加查询数据库表的属性值(SELECT * FROM customs),然后测试连接数据库,连接成功,编译、运行得到如图3-4查询结果。
ADO 控件访问数据库运行结果:
图3-4
第4章 总结
主要的分工情况如下:徐进(数据库的设计和查询的实现)、吴维相(进行添加、删除、修改等设计)、陈云春(用户权限控制、系统测试)
通过这几个星期的努力,客户资料管理系统的设计与开发已完成。其基本功能包括:增加、删除、修改、查询,客户基本信息管理(客户姓名、单位名称、 联系电话)相关信息等功能已基本达到。这次课程设计是按照软件开发流程进行
23
的。从一开始的详细设计,用UML 描绘出系统的基本框架,到数据库的设计,以 及每个部分的实现,采用了面向对象的思想,这对系统的日后维护及功能的扩充有很大的帮助。在这几个星期的开发过程中,加深了对Visual C++ 的理解,对SQL SERVER数据库使用也比较熟练,尤其是SQL 语句的使用。最重要的是,我们对这样一个大的程序的编写过程中,培养了自学的能力, 对C++语言的认识有了进一步的提高。尤其是软件的开发过程中,十分注重的是团队的合作精神,这是我们在这次课程设计中深刻体会到的。
第5章 参考文献
【1】 张海藩 牟永敏 面向对象程序设计实用教程(第二版) 清华大学出版社
2007年
【2】 陈天华 面向对象程序设计与Visual C++6.0教程 清华大学出版社
2006年
【3】萨师煊、王珊. 数据库系统概论(第四版). 高等教育出版社. 2006年.
【4】张海藩 软件工程导论(第五版) 清华大学出版社 2008年 【5】安训国 数据结构(第四版) 大连理工大学出版社 2001年 【6】http://www.docin.com/p-222962908.html
24