课程案例—企业办公自动化管理系统通过本案例学习一下内容:1.企业办公自动化管理系统开发的基本过程2.系统需求分析和可行性分析3.系统设计的方法4.构建开发环境5.如何分析并设计数据库6.如何设计公共类7.主要功能模块的实现方法8.系统的编译与发布9.SQLserver技术10.面向对象的开发思想11.分层开发模式系统分析一.需求分析对于企业办公自动化管理系统来说,提高企业的管理效率、方便企业职员的协助是至关重要,企业的办公环境如下:1.使用计算机网络环境属于局域网。2.公司规模50—100人,人手一台计算机。3.员工上下班考勤属于人工考勤。4.实行人性化管理,允许员工自己有发表意见和想法。5.员工在工作中传送和接收文件,很不方便。6.对于公司的公告、新闻和规章制度,员工了解不及时7.重要通知都是逐一打电话通知。系统分析需求分析结论1.部门管理功能2.员工管理功能3.公告管理功能4.文件管理功能5.交流管理功能6.考勤管理功能7.规章制度管理功能8.系统管理功能二、系统设计1.系统目标根据需求分析的描述以及与用户的沟通,现制定系统实现目标如下:系统采用人机对话方式,界面美观友好,信息查询灵活、方便,数据存储安全可靠。灵活、快速的发送和接收文件。实现功能强大的公告发布与管理功能。系统最大限度地实现易维护性和易操作性界面简洁、框架清晰、美观大方。实现企业部门和职员的信息管理功能。通过后台查看与删除公告信息、查看公文信息。对员工信息、职位信息与部门信息的管理。二、系统设计业务流程图浏览企业公告/规章制度员工上下班考勤发送手机短信是否迟到/早退统计迟到/早退数优秀员工评比员工传送与接收文件业务员系统功能结构企业办公自动化管理系统前台(职员)功能结构图企业办公自动化管理系统企业职员登录系统主页桌面文件管理交流管理考勤管理行政管理查看公告规章制度修改登录密码传送文件接收文件删除文件发送短消息活动投票上班签到下班签到部门及职责员工联系方式系统功能结构企业办公自动化管理系统管理员登录系统管理主页公告管理文件管理部门管理考勤管理员工管理查看公告发布公告传送文件接收文件删除文件新建部门编辑部门信息上班签到下班签到添加员工信息编辑员工信息规章制度管理更新规章制度浏览规章制度系统管理个人密码设置用户设置企业办公自动化管理系统前台(职员)功能结构图构建开放环境1.web系统开发环境页面开发环境:VS2005集成开发环境开发语言:ASP.NET+C#后台数据库:SQLServer2000开发环境运行平台:XP(SP2)2.服务器端WEB服务器:IIS6.0数据库服务器:SQLServer2000网站服务器运行环境:.NETFrameworksdk2.03.客户端浏览器:IE6.0分辨率:最佳效果1024×768数据库设计系统数据库采用SQLServer2000数据库,系统数据库名称为db_OAS.数据库db_OAS中包括多张数据表。下面分别给出数据表概要说明、数据库E-R图、数据表关系图、数据表的结构。数据表概要说明数据表树形结构如下图:企业办公自动化管理系统后台数据库企业部门表企业员工表传送文件表记事本表公告信息表规章制度表员工考勤表考勤时间设置表系统用户表投票信息表数据库E-R的分析课堂练习:对上表中的各个实体用E-R图进行分析。要求:1.用E-R图描述出各个实体。2.描述数据表结构。3.描述数据表之间的关系。实体描述举例企业部门实体E-R图描述企业部门表流水号部门名称职能描述企业部门数据表结构描述数据表的关系图试写出下列需求的SQL语句根据输入的”用户名”“密码”查询“系统用户表”中是否有记录存在,并判断该用户是“管理员”还是“普通职员”增加部门信息;根据ID查看某个部门信息删除某个部门复杂SQL语句的使用—显示企业的年度优秀员工信息1.优秀员工的标准通过考勤考核(迟到和早退)2.考勤结果的前2位3.显示的信息包括:员工姓名,所在部门,照片相关资料—来自SQL联机丛书使用TOP和PERCENT限制结果集TOP子句限制返回到结果集中的行数。TOPn[PERCENT]n指定返回的行数。如果未指定PERCENT,n就是返回的行数。如果一个SELECT语句既包含TOP又包含ORDERBY子句,那么返回的行将会从排序后的结果集中选择。整个结果集按照指定的顺序建立并且返回排好序的结果集的前n行。相关资料—来自SQL联机丛书用ORDERBY对行进行排序ORDERBY子句按查询结果中的一列或多列对查询结果进行排序,用作排序依据的列总长度可达8,060。有关ORDERBY子句最大大小的更多信息,请参见SELECT。排序可以是升序的(ASC),也可以是降序的(DESC)。如果没有指定升序还是降序,就假定为ASC。相关资料—来自SQL联机丛书聚合函数聚合函数对一组值执行计算并返回单一的值。除COUNT函数之外,聚合函数忽略空值。聚合函数经常与SELECT语句的GROUPBY子句一同使用。Transact-SQL编程语言提供下列聚合函数:AVGMAXSUMMINCOUNT等相关资料—来自SQL联机丛书使用内联接内联接是用比较运算符比较要联接列的值的联接。下面的Transact-SQL查询是内联接的一个示例:USEpubsSELECT*FROMauthorsASaINNERJOINpublishersASpONa.city=p.cityORDERBYa.au_lnameDESC此内联接称为相等联接。它返回两个表中的所有列,但只返回在联接列中具有相等值的行。selecta.name,a.dept,a.photoPath,b.statefromtb_employeeASainnerjoin(selectTOP2*from(selectemployeeName,sum(late)+sum(quit)asstatefromtb_signgroupbyemployeeName)asaaorderbystate)asbona.name=b.employeeNameorderbyb.stateADO.NET介绍ADO.NET对MicrosoftSQLServer和XML等数据源以及通过OLEDB和XML公开的数据源提供一致的访问。在创建ADO.NET时,Microsoft具有以下设计目标:1.利用当前的ActiveX数据类型(ADO)知识。2.支持N层编程模型。3.集成XML支持。ADO.NET介绍和.netframework类库中其他所有东西一样,ADO.net不过是一组类型(TYPES)而已,他们都位于SYSTEM.DATA名字空间中。ClientOLEDB.NETDataProviderSQL.NETdataproviderSQLServerOtherDBMSOLEDBProvider.NET数据供应器ADO.NET介绍每一种.NET数据供应器都实现为一组类型(types);System.Data.SqlClient名字空间---SQLProviderSystem.Data.OleDb名字空间---OLEDBProvider不论选择哪种Provider,每一种都提供一套相似的类(Class)ADO.NET介绍.NET数据provider都支持的一些基础对象。它们是:Connection:用于建立和释放连接(SqlConnection--OleDbConnection)Command:用于存储和执行命令,如一个SQL查询或一个存储过程,并为命令指定参数。DataReader:对数据库中的数据提供直接、循环的只读的访问。DataAdapter:建造于DataReader之上,用于创建和操作DataSet实体。ADO.NET介绍客户可以通过DataReader或者DataSet来访问数据。RowsDataSet.NETDataProviderConnectionCommandDataReaerDataAdapterClentsVisualStudio中的数据命名空间.NETFramework中的数据和XML命名空间包括:System.Data—由构成ADO.NET结构的类组成,该结构是托管应用程序的主要数据访问方法。ADO.NET结构使您可以生成可用于有效管理来自多个数据源的数据的组件。System.Data.OleDb—构成兼容数据源的OLEDB.NETFramework数据提供程序的类。这些类使您能连接到OLEDB数据源、针对数据源执行命令并读取结果。System.Data.SqlClient—构成SQLServer.NETFramework数据提供程序的类,该提供程序允许您连接到SQLServer7.0、执行命令并读取结果。System.Data.SqlClient命名空间与System.Data.OleDb命名空间类似,但为访问SQLServer7.0和更高版本进行了优化。访问数据示例示例如何打开一连接,如何创建一个命令,以及如何利用DataReaer读取结果。示例展示如何使用DataSets(一个DataAdapter如何用于将一个DataTable添加到一个DataSets中)访问数据示例--DataReader1.设置一个连接SqlConnectionCn=NewSqlConnection(Server=(local);database=db_OAS;Uid=sa;Pwd=);2.创建一个命令SqlCommandCmd=Cn.CreateCommand();Cmd.CommandText=select*fromtb_departmentwhereID='20';3.打开连接Cn.Open();4.执行命令--》将结果存入DataReaderSqlDataReaderRdr=Cmd.ExecuteReader();访问数据示例--DataReader5.取结果并显示try{while(Rdr.Read()){System.Console.WriteLine(String.Format({0},{1},{2},Rdr[0],Rdr[1],Rdr[2]));}}catch(System.Exceptione){System.Console.WriteLine(Error:{0},e.Message);}访问数据示例--DataReader6.释放资源,关闭连接finally{Rdr.Close();Cn.Close();}访问数据示例--DataSetsSqlConnectionCn=newSqlConnection(Server=(local);database=db_OAS;Uid=sa;Pwd=);SqlCommandCmd=Cn.CreateCommand();Cmd.CommandText=select*fromtb_departmentwhereID='20';SqlDataAdapterDa=newSqlDataAdapter();Da.SelectCommand=Cmd;DataSetDs=newDataSet();Cn.Open();Da.Fill(Ds,tb_deparment);Cn.Close();访问数据示例--DataSet取数据;try{if(Ds.Tables[0].Rows.Count0){DataRowrow=Ds.Tables[0].Rows[0];System.Console.WriteLine(String.Format({0},{1},{2},row[0],row[1],row[2]));}}catch(System.Exceptione){System.Console.WriteLine(Error:{0},e.Message);}访问数据示例--DataSetfinally{if(Cn.State==ConnectionSta