资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,.,*,课程案例,企业办公自动化管理系统,通过本案例学习一下内容:,1.企业办公自动化管理系统开发的基本过程,2.系统需求分析和可行性分析,3.系统设计的方法,4.构建开发环境,5.如何分析并设计数据库,6.如何设计公共类,7.主要功能模块的实现方法,8.系统的编译与发布,9.SQL server技术,10.面向对象的开发思想,11.分层开发模式,1,.,系统分析,一.需求分析,对于企业办公自动化管理系统来说,提高企业的管理效率、,方便企业职员的协助是至关重要,企业的办公环境如下:,1.使用计算机网络环境属于局域网。,2.公司规模50100人,人手一台计算机。,3.员工上下班考勤属于人工考勤。,4.实行人性化管理,允许员工自己有发表意见和想法。,5.员工在工作中传送和接收文件,很不方便。,6.对于公司的公告、新闻和规章制度,员工了解不及时,7.重要通知都是逐一打电话通知。,2,.,系统分析,需求分析结论,1.部门管理功能,2.员工管理功能,3.公告管理功能,4.文件管理功能,5.交流管理功能,6.考勤管理功能,7.规章制度管理功能,8.系统管理功能,3,.,二、系统设计,1.系统目标,根据需求分析的描述以及与用户的沟通,现制定系统实现目标如下:,系统采用人机对话方式,界面美观友好,信息查询灵活、方便,数据存储安全可靠。,灵活、快速的发送和接收文件。,实现功能强大的公告发布与管理功能。,系统最大限度地实现易维护性和易操作性,界面简洁、框架清晰、美观大方。,实现企业部门和职员的信息管理功能。,通过后台查看与删除公告信息、查看公文信息。,对员工信息、职位信息与部门信息的管理。,4,.,二、系统设计,业务流程图,5,.,系统功能结构,企业办公自动化管理系统前台(职员)功能结构图,6,.,系统功能结构,企业办公自动化管理系统前台(职员)功能结构图,7,.,构建开放环境,1.web系统开发环境,页面开发环境:VS2005集成开发环境,开发语言:ASP.NET+C#,后台数据库:SQL Server2000,开发环境运行平台:XP(SP2),2.服务器端,WEB服务器:IIS6.0,数据库服务器:SQL Server 2000,网站服务器运行环境:.NET Framework sdk2.0,3.客户端,浏览器:IE6.0,分辨率:最佳效果1024768,8,.,数据库设计,系统数据库采用SQL Server2000数据库,系统数据库名称为db_OAS.数据库db_OAS中包括多张数据表。下面分别给出,数据表概要说明、数据库E-R图、数据表关系图、数据表的结构。,9,.,数据表概要说明,数据表树形结构如下图:,10,.,数据库E-R的分析,课堂练习:,对上表中的各个实体用E-R图进行分析。,要求:,1.用E-R图描述出各个实体。,2.描述数据表结构。,3.描述数据表之间的关系。,11,.,实体描述举例,企业部门实体E-R图描述,企业部门数据表结构描述,12,.,数据表的关系图,13,.,试写出下列需求的SQL语句,根据输入的”用户名”“密码”查询“系统用户表”中是否有记录存在,并判断该用户是“管理员”还是“普通职员”,增加部门信息;,根据ID查看某个部门信息,删除某个部门,14,.,复杂SQL语句的使用 显示企业的年度优秀员工信息,1.优秀员工的标准通过考勤考核(迟到和早退),2.考勤结果的前2位,3.显示的信息包括:,员工姓名,所在部门,照片,15,.,相关资料来自SQL联机丛书,使用 TOP 和 PERCENT 限制结果集,TOP 子句限制返回到结果集中的行数。,TOP,n,PERCENT,n,指定返回的行数。如果未指定 PERCENT,,n,就是返回的行数。,如果一个 SELECT 语句既包含 TOP 又包含 ORDER BY 子句,那么返回的行将会从排序后的结果集中选择。整个结果集按照指定的顺序建立并且返回排好序的结果集的前,n,行。,16,.,相关资料来自SQL联机丛书,用 ORDER BY 对行进行排序,ORDER BY 子句按查询结果中的一列或多列对查询结果进行排序,用作排序依据的列总长度可达 8,060。有关 ORDER BY 子句最大大小的更多信息,请参见,SELECT,。,排序可以是升序的(ASC),也可以是降序的(DESC)。如果没有指定升序还是降序,就假定为 ASC。,17,.,相关资料来自SQL联机丛书,聚合函数,聚合函数对一组值执行计算并返回单一的值。除 COUNT 函数之外,聚合函数忽略空值。聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用。,Transact-SQL 编程语言提供下列聚合函数:,AVG,MAX,SUM,MIN,COUNT等,18,.,相关资料来自SQL联机丛书,使用内联接,内联接是用比较运算符比较要联接列的值的联接。,下面的 Transact-SQL 查询是内联接的一个示例:,USE pubs,SELECT*,FROM authors AS a INNER JOIN publishers AS p,ON a.city=p.city,ORDER BY a.au_lname DESC,此内联接称为相等联接。它返回两个表中的所有列,但只返回在联接列中具有相等值的行。,19,.,select a.name,a.dept,a.photoPath,b.state,from tb_employee AS a inner join,(select TOP 2*,from,(,select employeeName,sum(late)+sum(quit)as state,from tb_sign group by employeeName)as,aa,order by state)as b,on a.name=b.employeeName,order by b.state,20,.,ADO.NET 介绍,ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 和 XML 公开的数据源提供一致的访问。,在创建 ADO.NET 时,Microsoft 具有以下设计目标:,1.利用当前的 ActiveX 数据类型(ADO)知识。,2.支持 N 层编程模型。,3.集成 XML 支持。,21,.,ADO.NET介绍,和.net framework类库中其他所有东西一样,ADO.net不过是一组类型(TYPES)而已,他们都位于SYSTEM.DATA名字空间中。,22,.,ADO.NET介绍,每一种.NET数据供应器都实现为一组类型(types);,System.Data.SqlClient名字空间-SQL Provider,System.Data.OleDb名字空间-OLE DB Provider,不论选择哪种Provider,每一种都提供一套相似的类(Class),23,.,ADO.NET介绍,.NET数据provider都支持的一些基础对象。它们是:,Connection:用于建立和释放连接(SqlConnection-OleDbConnection),Command:用于存储和执行命令,如一个SQL查询或一个存储过程,并为命令指定参数。,DataReader:对数据库中的数据提供直接、循环的只读的访问。,DataAdapter:建造于DataReader之上,用于创建和操作DataSet实体。,24,.,ADO.NET介绍,客户可以通过DataReader或者DataSet来访问数据。,25,.,Visual Studio 中的数据命名空间,.NET Framework 中的数据和 XML 命名空间包括:,System.Data 由构成 ADO.NET 结构的类组成,该结构是托管应用程序的主要数据访问方法。ADO.NET 结构使您可以生成可用于有效管理来自多个数据源的数据的组件。,System.Data.OleDb 构成兼容数据源的 OLE DB.NET Framework 数据提供程序的类。这些类使您能连接到 OLE DB 数据源、针对数据源执行命令并读取结果。,System.Data.SqlClient 构成 SQL Server.NET Framework 数据提供程序的类,该提供程序允许您连接到 SQL Server 7.0、执行命令并读取结果。System.Data.SqlClient 命名空间与 System.Data.OleDb 命名空间类似,但为访问 SQL Server 7.0 和更高版本进行了优化。,26,.,访问数据示例,示例如何打开一连接,,如何创建一个命令,,以及如何利用,DataReaer,读取结果。,示例展示如何使用DataSets,(一个DataAdapter如何用于将一个DataTable添加到一个DataSets中),27,.,访问数据示例-DataReader,1.设置,一个连接,SqlConnection Cn=,New SqlConnection(Server=(local);database=db_OAS;Uid=sa;Pwd=);,2.,创建一个命令,SqlCommand Cmd=,Cn.CreateCommand();,Cmd.CommandText=,select *from tb_department where ID=20;,3.打开连接Cn.Open();,4.执行命令-将结果存入DataReader,SqlDataReader Rdr=Cmd.ExecuteReader();,28,.,访问数据示例-DataReader,5.取结果并显示,try ,while(Rdr.Read(),System.Console.WriteLine(String.Format(0,1,2,Rdr0,Rdr1,Rdr2);,catch(System.Exception e),System.Console.WriteLine(Error:0,e.Message);,29,.,访问数据示例-DataReader,6.释放资源,关闭连接,finally,Rdr.Close();,Cn.Close();,30,.,访问数据示例-DataSets,SqlConnection Cn=,new SqlConnection(Server=(local);database=db_OAS;Uid=sa;Pwd=);,SqlCommand Cmd=,Cn.CreateCommand();,Cmd.CommandText=,select *from tb_department where ID=20;,SqlDataAdapter Da=new,SqlDataAdapter();,Da.SelectCommand=Cmd;,DataSet Ds=new DataSet();,Cn.Open();,Da.Fill(Ds,tb_deparment);,Cn.Close();,31,.,访问数据示例-DataSet,取数据;,try,if(Ds.Tables0.Rows.Count0),DataRow row=Ds.Tables0.Rows0;,System.Console.WriteLine(String.Format(0,1,2,row0,row1,row2);,catch(System.Exception e),System.Console.WriteLine(Error:0,e.Message);,32,.,访问数据示例-DataSet,finally,if(Cn.State=ConnectionState.Open),Cn.Close();,33,.,#region,利用,DataSet,存取查询结果;,public DataSet ExecuteSelect(string strSql,string strTableName),SqlConnection conn=new,SqlConnection(strConn);,SqlCommand com=conn.CreateCommand();,com.CommandText=strSql;,SqlDataAdapter da=new SqlDataAdapter();,da.SelectCommand=com;,DataSet ds=new DataSet();,conn.Open();,da.Fill(ds,strTableName);,conn.Close();,return ds;,#endregion,34,.,#region,增加、删除、添加,SQL,语句接口,public int ExecuteUpdateAndInsert(string strSql),SqlConnection conn=new SqlConnection(strConn);,SqlCommand com=conn.CreateCommand();,com.CommandText=strSql;,conn.Open();,int iResult=com.ExecuteNonQuery();,return iResult;,#endregion,35,.,接口的封装,class DataAccess,const string strConn;,public DataAccess(),strConn=Server=(local);database=db_OAS;Uid=sa;Pwd=;,接口1:利用DataSet,存取查询结果针对SELECT语句;,接口2:,增加、删除、添加,SQL,语句接口,36,.,接口1:,利用,DataSet,存取查询结果针对SELECT语句,#region,该方法执行查询命令,并返回,DataSet,数据集;,public DataSet Run(string strSQL,string strTableName),SqlConnection conn=new SqlConnection(strConn);,conn.Open();,SqlCommand com=new SqlCommand(strSQL,conn);,SqlDataAdapter da=new SqlDataAdapter();,da.SelectCommand=com;,DataSet ds=new DataSet();,da.Fill(ds,strTableName);,conn.Close();,return ds;,#endregion,37,.,接口2:,增加、删除、添加,SQL,语句接口,public bool Run(string strSQL),SqlConnection con=new SqlConnection(strConn);,con.Open();,/,第二种产生命令对象的方法;,SqlCommand com=new SqlCommand(strSQL,con);,if(com.ExecuteNonQuery()0),con.Close();,return true;,else,con.Close();,return false;,38,.,接口的使用,1.创建数据类实例;,DataAccess da=new DataAccess();,2.调用接口;,DataSet ds=,da.Run(Select*from b_department,dept);,string strSQL=insert into tb_department values(+s1+,+s2+);,da.Run(strSQL);,39,.,接口的使用,要求:点击添加按钮,将部门名和描述插入到Dropdownlist控件中显示,点击查询按钮,将显示该部门的描述信息。,40,.,接口的使用,数据绑定;,public void BindDept(),dlShow.DataSource=,da.Run(Select*from tb_department,dept);,dlShow.DataTextField=name;,dlShow.DataBind();,41,.,接口的使用,点击添加按钮;,protected void Button1_Click(object sender,EventArgs e),string s1=txtName.Text;,string s2=txtDemo.Text;,string strSQL=,insert into tb_department values(+s1+,+s2+);,da.Run(strSQL);,BindDept();,42,.,接口的使用,点击查询按钮;,protected void btnShowInfo_Click(object sender,EventArgs e),string s1=dlShow.SelectedValue;,string strSql=,select*from tb_department where name=+s1+;,DataSet ds=da.Run(strSql,dept);,if(ds.Tables0.Rows.Count0),LblShow.Text=,该部门介绍,:+ds.Tables0.Rows02.ToString();,43,.,C#+SQL+HTML,protected void LoadInfo(),DataSet ds=,da.Run(select*from tb_department,dept);,Response.Write();,Response.Write();,Response.Write,(,编号,部门名称,部门介绍,);,Response.Write();,44,.,C#+SQL+HTML,for(int i=0;i 0),.,catch(System.Exception e),.,48,.,接口参数,49,.,控件的使用说明,50,.,用户控件,51,.,用户控件,BaseClass bc=new BaseClass();,if(rdoBtnAdmin.Checked),DataSet ds=bc.GetDataSet(select count(*)from tb_sysUser where userName=+,txtName.Text,+and userPwd=+,txtPwd.Text,+and system=1,tb_employee);,if(ds.Tables0.Rows.Count0),52,.,用户控件,BaseClass bc=new BaseClass();,DataSet ds=bc.GetDataSet(,select a.name,a.dept,a.photoPath,a.job,b.state from tb_employee as a inner join(select TOP 2*FROM(select employeeName,sum(late)+sum(quit)as state from tb_sign group by employeeName)as aa order by state)as b on a.name=b.employeeName order by b.state“,tb_sign);,DataList1.DataSource=ds;,DataList1.DataBind();,53,.,数据绑定,姓名,:,部门,:,职务,:,54,.,显示控件-GridView,55,.,显示控件-GridView,显示表格数据是软件开发中的一个周期性任务。ASP.NET 提供了许多工具来在网格中显示表格数据,可以使用 GridView 来完成以下操作:,通过数据源控件自动绑定和显示数据。,通过数据源控件对数据进行选择、排序、分页、编辑和删除。,56,.,显示控件-GridView,通过以下方式自定义 GridView 控件的外观和行为:,指定自定义列和样式。,利用模板创建自定义用户界面(UI)元素。,通过处理事件将自己的代码添加到 GridView 控件的功能中。,57,.,比较 GridView 和 DataGrid,GridView 控件是 DataGrid 控件的后继控件。与 DataGrid 控件相似,GridView 控件旨在在 HTML 表中显示数据。,当绑定到数据源时,DataGrid 和 GridView 控件分别将 DataSource 中的一行显示为输出表中的一行。,DataGrid 和 GridView 控件都是从 WebControl 类派生的。,58,.,比较 GridView 和 DataGrid,虽然 GridView 控件与 DataGrid 控件具有类似的对象,模型,但与 DataGrid 控件相比,前者还具有许多新功能,和优势,包括:,更丰富的设计时功能。,改进的数据源绑定功能。,排序、分页、更新和删除的自动处理。,其他列类型和设计时列操作。,具有 PagerTemplate 属性的自定义页导航用户界面(UI)。,59,.,GridView 控件中设置数据显示格式,可以指定 GridView 控件的行的布局、颜色、字体和对齐方式。,可以指定行中包含的文本和数据的显示。,另外,可以指定将数据行显示为项目、交替项、选择的项还是编辑模式项。,60,.,GridView 控件中设置数据显示格式,61,.,使用 GridView 控件进行数据绑定,GridView 控件提供了两个用于绑定到数据的,选项,(具体说明参见MSDN),使用 DataSourceID 属性进行数据绑定,此选项让您能够将 GridView 控件绑定到数据源控件,使用 DataSource 属性进行数据绑定,此选项使您能够绑定到包括 ADO.NET 数据集和数据读取器在内的各种对象。,62,.,使用 GridView 控件进行数据绑定,protected void,Page_Load,(object sender,EventArgs e),if(!IsPostBack),GridView1.DataSource=bc.GetDataSet(select*from,tb_department,department);,GridView1.DataKeyNames=new string ID;,GridView1.DataBind();,63,.,使用 GridView 控件编辑和删除数据,64,.,HyperLinkField 类 来自MSDN,HyperLinkField 类字段表示在数据绑定控件,中显示为超链接的字段。,重要属性说明:,DataNavigateUrlFields 属性,获取或设置数据源中字段的名称,用于为 H,yperLinkField,对象中的超链接构造 URL。,DataNavigateUrlFormatString 属性,取或设置当 URL 数据绑定到数据源中的字段时,,HyperLinkColumn,中的超链接的 URL 的显示格式。,DataNavigateUrlFormatString=,“DeptInfoEdit2.aspx?id=0,65,.,显示编辑的二级页面,66,.,显示编辑的二级页面,根据传过来的,ID,进行查找,并显示到页面元素中去,;,if(!Page.IsPostBack),DataSet ds=bc.GetDataSet,(SELECT*FROM tb_department WHERE ID=+Request.QueryStringid.ToString()+,department);,if(ds.Tables0.Rows.Count 0),TxtDeptName.Text=,ds.Tables0.Rows0Name.ToString();,TxtDeptMemo.Text=,ds.Tables0.Rows0memo.ToString();,67,.,理解事件冒泡,在ASP.NET框架中包含3个支持事件冒泡的标准控件(Repeater、DataList和DataGrid控件),事件冒泡指上述这些控件能捕获其子控件的事件。当子控件产生一个事件时,事件就向上“冒泡”传给包含该子控件的容器控件(父控件),而容器控件就可以执行一个子程序来处理该事件,68,.,事件处理,删除事件:,bc.SqlExecute(DELETE FROM tb_department WHERE ID=+,GridView1.DataKeyse.RowIndex.Value.ToString(),+);,GridView1.DataSource=bc.GetDataSet(select*from,tb_department,department);,GridView1.DataBind();,69,.,使用第三方控件-FreeTextBox,70,.,使用第三方控件-FreeTextBox,在页面源代码中添加:,71,.,使用第三方控件-FreeTextBox,72,.,使用第三方控件-FreeTextBox,通过存储过程执行,protected void BtnSave_Click(object sender,EventArgs e),bc.ExecProcNotice(txtTitle.Text,FreeTextBox1.Text,SessionLoginName.ToString(),73,.,存储过程的设计,插入公告;,CREATE PROCEDURE insert_tb_notice,(noticeTitle varchar(40),noticePerson varchar(20),noticeContent text ),AS insert into db_OAS.dbo.tb_notice,(noticeTitle,noticePerson,noticeContent),values,(,noticeTitle,noticePerson,noticeContent,),GO,74,.,执行存储过程的代码分析,执行存储过程,-,专门用于,FreeTextBox,public Boolean ExecProcNotice(string strTitle,string,strContent,string strName),SqlConnection conn=new SqlConnection(ConfigurationManager.AppSettingsconStr);,conn.Open();,SqlCommand com=,new SqlCommand(insert_tb_notice,conn);,com.CommandType=,CommandType.StoredProcedure;,/,标题,SqlParameter pTitle=,new SqlParameter(noticeTitle,SqlDbType.VarChar,40);,pTitle.Value=strTitle;,com.Parameters.Add(pTitle);,75,.,/,内容,SqlParameter pContent=new SqlParameter(noticeContent,SqlDbType.VarChar,0);,pContent.Value=strContent;,com.Parameters.Add(pContent);,/,发布者,SqlParameter pName=new SqlParameter(noticePerson,SqlDbType.VarChar,20);,pName.Value=strName;,com.Parameters.Add(pName);,76,.,if(com.ExecuteNonQuery()0),conn.Close();,return true;,else,conn.Close();,return false;,77,.,
展开阅读全文