实验报告学院:计信学院专业:网络工程班级:091 姓名学号实验组实验时间2012-6-1 指导教师成绩实验项目名称实验六:数据库系统设计实验目的要求掌握数据库设计的基本技术,熟悉数据库设计的每个步骤中的任务和实施方法,并加深对数据库系统概念和特点的理解。
实验要求本实验属于设计型实验,通过实验,加强对课堂讲授知识的理解。
实验原理必须按照数据库设计的四个阶段进行:需求分析(分析用户要求)、概念设计(信息分析和定义)、逻辑设计(设计实现)和物理设计(物理数据库设计)。
概念模型设计时采用自底向上的方法,即自顶向下的进行需求分析,然后再自底向上地设计概念结构,和自底向上的设计方法;概念模型必须用E-R图进行表示。
在逻辑设计阶段,将E-R图转换成关系模式,然后进行关系模式的规范化。
在物理设计阶段,将关系模式转化成SQL Server中的具体的数据库表,并建立表间的关系,表的索引,及相关的约束。
实验仪器(1)硬件条件:个人计算机。
(2)软件条件:Windows 2000NT Server; MS SQL Server 2000。
实验步骤1、完成系统需求分析报告在系统需求分析报告中包括采用的设计方法、数据流图和数据字典。
2、完成数据库信息要求和关系数据模型设计使用E-R图表示对数据库中要存储的信息及语义进行详细描述,对数据约束和数据之间的关联进行详细描述。
详细描述系统需要的基本表及属性、视图和索引,对基本表的主码、候选码、外码及被参照表进行说明,对基本表中数据的约束条件进行说明。
3、完成数据库的操作和应用要求报告在数据库的操作和应用要求报告中,详细描述数据库的数据操作要求、处理方法和处理流程,画出系统功能模块图。
4、在机器上完成整个数据库的设计。
实验内容要求根据周围的实际情况,自选一个自己熟悉的小型数据库应用项目,并深入到应用项目的现实世界中,进行系统分析和数据库设计。
例如选择学籍管理系统、图书管理系统、材料管理系统或仓库管理系统等。
实验数据我设计的是车站售票管理系统,主要用于车站日常的票务处理。
一、需求分析车站售票管理系统员工管理模块汽车管理模块线路管理模块车票管理模块票务信息管理模块员工信息添加员工信息删除员工信息修改汽车信息添加汽车信息修改汽车信息删除线路信息添加线路信息修改线路信息删除添加车票删除车票查询车票信息购买/预订车票员工信息查询汽车信息查询线路信息查询车票信息查询功能模块图1.员工管理模块:员工有两种身份,售票员和系统管理员。
系统管理员可以进行系统用户的添加,密码的修改操作,汽车,线路,车票信息的更新等,售票员可以查询以上信息和购买车票等。
2.线路信息管理模块:系统管理员可以在线路信息管理模块对车站线路信息进行管理。
管理员首先建立线路信息数据库,输入原始的线路信息,当有新的线路需要添加或者需要对已有的线路信息进行修改,删除的时候,管理员就可以进行相应的操作。
管理员也可以通过本模块查询到所有需要查询的线路的详细信息。
3.汽车信息管理模块:系统管理员可以在汽车信息管理模块实现对汽车信息的管理。
管理员首先应该建立汽车信息数据库,输入原始的数据信息,当有新的汽车信息的时候或者管理员需要修改某个汽车的相关信息以及想要删除某个汽车信息的时候,就可以完成相应的操作。
管理员也可以在整个数据库中查询相关汽车信息。
4.车票信息管理模块:系统管理员可以在车票管理模块实现对车票信息的管理。
管理员根据相应的汽车信息和线路信息来设置相应的车票详细信息。
管理员还可以对某条线路的车票信息进行修改,删除和查询操作。
5.车票订购信息模块用户可以通过查询时间,线路和汽车信息,来确定自己要买什么时间,什么路线,什么型号的汽车的车票,并形成表单。
程序分为登陆界面,主界面,线路信息管理界面,汽车信息管理界面,车票信息管理界面,票务信息管理界面,员工管理界面这几个主体界面。
使用时应先知道管理员或员工帐号和密码,登陆进入系统主菜单界面,里面包括线路信息,汽车信息,车票信息,票务信息,帮助,退出程序菜单选项。
二、系统设计(一)数据流图:车站售票管理系统售票员购票信息售票信息系统管理员汽车,线路等信息汽车,路线等信息顶层数据流图查询处理买票购票信息可供票车票车票记录售票记录信息处理车票信息汽车记录线路记录读入信息处理汽车信息站点记录站点信息1层车票数据流图系统管理员售票员售票出售票查询查询打印售票报表报表打印已售车票查看已售车票情况查看发车时刻表显示发车时刻发车修改修改线路表汽车表员工表线路变更汽车变更人员变更增,删,改增,删,改增,删,改决定决定决定信息处理站点修改增,删,改站点表提取站点(二)数据字典:编号数据项名数据项含义说明数据类型长度与其他数据项的关系是否可以为空1 Uno用户编号整型4User表主键不2 UserName姓名nvarchar 20不3 Password密码nvarchar 20 不4 UserIdentiey身份nvarchar 20 不5 Cno 汽车编号整型 4 Coach表主键不6 Coachnumber 车牌号nvarchar 20 不7 Ctype 汽车型号nvarchar 208 Ctime购买时间datetime 89 Cnum座位数量整型 4 不10 Ctv有无电视char 1011 Ccondition有无空调char 1012 Coachholder 负责人nvarchar 20 不13 Lno线路编号整型 4 Line表主键不14 Ldepart起始城市nvarchar 20 不15 Larrival到达城市nvarchar 20 不16 Ltime 路程时间datetime 817 Tno 车票编号整型 4 Ticket表主键不18 Price 车票价格整型 4 不19 SoldTicket 已卖票数整型 4 不20 LastTicket 剩余票数整型 4 不21 Tdate 出发日期datetime 8 不22 Ttime 出发时间datetime 8 不23 Ptime 购买时间datetime 824 Seat 座位号整型 4 不25 ReserveORBuy 预定或购买char 10 不26 Cityno 站点编号整型 4 City表主键不27 CityName 站点名称nvarchar 20 不2.数据结构编号数据结构名属性1 员工员工编号,姓名,密码,身份2 汽车汽车编号,汽车型号,车牌号,购买时间,座位数量,有无电视,有无空调,负责人3 线路线路编号,起始城市,到达城市,路程时间4 车票车票编号,线路编号,汽车编号,车票价格,已卖票数,剩余票数,出发日期,出发时间5 购票车票编号,购买日期,预定或购买,座位号6 站点站点编号,站点名称编号数据流名输入输出1 变更汽车信息变更信息汽车记录汽车记录2 查询汽车信息汽车编号/汽车型号/车牌号/有无电视/有无空调/负责人3 变更站点信息变更信息站点记录4 变更线路信息变更信息线路记录5 查询线路信息线路编号/起始城市,到达城市线路记录6 变更车票信息变更信息车票记录车票记录7 查询车票信息车票编号/起始城市,到达城市/汽车型号/出发日期,出发时间8 预定车票车票编号,购买日期,预定或购买预订记录9 购买车票车票编号,购买日期,预定或购买购买记录10 查询购买情况车票编号/起始城市,到达城市/汽车型号购买记录11 更改用户变更信息用户记录12 员工信息用户输入电脑的用户名、密码系统主菜单4.数据存储数据存储名输入数据流输出数据流说明部分用户信息变更用户信息查询用户信息汽车信息变更汽车信息查询汽车信息线路信息变更线路信息查询线路信息车票信息变更车票信息查询车票信息预定车票信息车票信息预订记录购买车票信息车票信息购买记录5.处理过程处理过程名输入数据流输出数据流处理操作查询已知汽车/线路/车票信息所需信息购买/预定车票信息+购票时间+座位号无更新变更信息再次查询信息用户权限认证用户名,密码,身份系统主菜单用户登录(三)E-R图售票员汽车线路购买员工编号姓名密码身份汽车编号汽车型号购买时间座位数量有无电视有无空调线路编号起始城市到达城市路程时间车票编号车票价格剩余票数购买日期车牌号负责人已卖票数出发时间预定或购买座位号站点站点编号站点名称系统管理员管理管理车票管理包含包含员工编号姓名密码身份出发日期mnnm1p1mm npm(四)关系模型:1,User员工表(员工编号Uno,姓名UserName,密码Password,身份UserIdentiey)2,Coach汽车信息表(汽车编号Cno,汽车型号Ctype,车牌号Coachnumber,购买时间Ctime,座位数量Cnum,有无电视Ctv,有无空调Ccondition,负责人Coachholder)3,Line线路信息表(线路编号Lno,起始城市Ldepart,到达城市Larrival,路程时间Ltime)4,Ticket车票信息表(车票编号Tno,线路编号Lno,汽车编号Cno,车票价格Price,已卖票数SoldTicket,剩余票数LastTicket,出发日期Tdate,出发时间Ttime)5,Purchase车票购买表(车票编号Tno,购买日期Ptime,预定或购买ReserveORBuy,座位号Seat)6,City站点表(站点编号Cityno,站点名称CityName)三、系统实现(一)数据库设计:1.City站点表:erinfo员工表:3.Ticket车票信息表:4.Coach汽车信息表:5.Purchase车票购买表:6.Line线路表:(二)代码登录操作代码:(1)SqlHelper helper = new SqlHelper();SqlDataReader rdr;(2)if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(identity)) {MessageBox.Show("姓名,密码,身份框均不能为空!");}rdr = helper.ExecuteReader("dbo.SelectUserinfo", CommandType.StoredProcedure);while (rdr.Read()){if (rdr["UserName"].ToString() == name && rdr["Password"].ToString() == password && rdr["UserIdentity"].ToString() == identity){this.Hide();string iden = rdr["UserIdentity"].ToString();MainForm main = new MainForm(iden);main.ShowDialog();rdr.Close();return;}}MessageBox.Show("错误的姓名或密码或与身份不匹配,请重新输入!");rdr.Close();(3)存储过程:ALTER PROCEDURE dbo.SelectUserinfo/*(@parameter1 int = 5,@parameter2 datatype OUTPUT)*/AS/* SET NOCOUNT ON */BEGINselect * from UserinfoEND修改/删除操作代码:(1)try{SqlCommandBuilder scb = new SqlCommandBuilder(sd);sd.Update(ds, "a");ds.AcceptChanges();MessageBox.Show("修改成功!");}catch (Exception ex){MessageBox.Show(ex.Message.ToString());}(2)try{SqlCommandBuilder scb = new SqlCommandBuilder(sd);int a = dataGridView1.CurrentRow.Index;ds.Tables[0].Rows[a].Delete();sd.Update(ds, "a");ds.AcceptChanges();MessageBox.Show("删除成功!");}catch (Exception ex){MessageBox.Show(ex.Message.ToString());}添加操作代码:(1)DAL.CoachDAO coach = new Coach.DAL.CoachDAO();SqlHelper helper = new SqlHelper();(2) if (string.IsNullOrEmpty(coachnumber) || string.IsNullOrEmpty(seatnumber1) ||string.IsNullOrEmpty(coachholder)){ MessageBox.Show("车牌号,座位数量,负责人均不能为空!");}else{if (coach.Add(coachtype,coachnumber,date2,seatnumber,ishavetv,ishavecon,coachholder)) MessageBox.Show("添加成功!");elseMessageBox.Show("添加失败!");}(3)实体类CoachDAO.cs中:public bool Add(string coachtype,string coachnumber,DateTime date2, int seatnumber,string ishavetv,string ishavecon,string coachholder){bool flag = false;DataTable dt = new DataTable();string cmdText = "dbo.AddCoach";SqlParameter[] paras = new SqlParameter[]{new SqlParameter("@coachtype",coachtype),new SqlParameter("@coachnumber",coachnumber),new SqlParameter("@date2",date2),new SqlParameter("@seatnumber",seatnumber),new SqlParameter("@ishavetv",ishavetv),new SqlParameter("@ishavecon",ishavecon),new SqlParameter("@coachholder",coachholder)};int res = helper.ExecuteNonQuery(cmdText, paras, CommandType.StoredProcedure);if (res > 0){flag = true;}return flag;}(4)存储过程:ALTER PROCEDURE dbo.AddCoach@coachtype nvarchar(20),@coachnumber nvarchar(20),@date2 datetime,@seatnumber int,@ishavetv char(10),@ishavecon char(10),@coachholder nvarchar(20)/*(@parameter1 int = 5,@parameter2 datatype OUTPUT)*/AS/* SET NOCOUNT ON */BEGINinsert into Coach (Ctype,Coachnumber,Ctime,Cnum,Ctv,Ccondition,Coachholder) values(@coachtype,@coachnumber,@date2,@seatnumber,@ishavetv,@ishavecon,@coachholder) END搜索操作代码:(1)SqlHelper helper = new SqlHelper();SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Coach;Integrated Security=True");SqlDataAdapter sd; //定义一个数据适配器DataSet ds; //定义一个数据集(2)string str1 = "select Lno as 编号,Ldepart as 起始城市,Larrival as 到达城市,convert(varchar(10),Ltime,108) as 路程时间from Line where Lno =" + lineid + "";dataBind(str1);(3)private void dataBind(string str){try{sd = new SqlDataAdapter(str, conn);ds = new DataSet();sd.Fill(ds, "a");dataGridView1.DataSource = ds;dataGridView1.DataMember = "a";}catch (Exception ex){MessageBox.Show(ex.Message);}}查询操作代码:(1)DAL.PurchaseDAO purchase = new Coach.DAL.PurchaseDAO();SqlHelper helper = new SqlHelper();(2)dataGridView1.DataSource = purchase.Select1(departcity,arrivalcity,date2);(3)实体类PurchaseDAO.cs中:public DataTable Select1(string departcity, string arrivalcity, DateTime date2){DataTable dt = new DataTable();string cmdText = "dbo.SelectPurchase";SqlParameter[] paras = new SqlParameter[]{new SqlParameter("@departcity",departcity),new SqlParameter("@arrivalcity",arrivalcity),new SqlParameter("@date2",date2)};dt = helper.ExecuteQuery(cmdText, paras, CommandType.StoredProcedure);return dt;}(4)存储过程ALTER PROCEDURE dbo.SelectPurchase@departcity nvarchar(20),@arrivalc ity nvarchar(20),@date2 datetime/*(@parameter1 int = 5,@parameter2 datatype OUTPUT)*/AS/* SET NOCOUNT ON */BEGINselect Ldepart as 起始城市,Larrival as 到达城市,convert(varchar(10),Tdate,120) as 出发日期,convert(varchar(10),Ttime,108) as 出发时间,Ctype as 车型,Coachnumber as 车牌号,Ctv as 有无电视,Ccondition as 有无空调,Price as 票价,Cnum as 总票数,LastTicket as 剩余票数from Coach,Line,Ticket where o = o and Line.Lno = Ticket.Lno and Ldepart = @departcity and Larrival =@arrivalc ity and Tdate = @date2END预订/购买操作代码:(1)tno = purchase.Y uding(depart, arrival, coachnum);(2)实体类PurchaseDAO.cs中public int Y uding(string depart, string arrival, string coachnum){int tno;DataTable dt = new DataTable();string cmdText = "dbo.SelectTno";SqlParameter[] paras = new SqlParameter[]{new SqlParameter("@depart",depart),new SqlParameter("@arrival",arrival),new SqlParameter("@coachnum",coachnum)};dt = helper.ExecuteQuery(cmdText, paras, CommandType.StoredProcedure);tno = Convert.ToInt32(dt.Rows[0]["Tno"]);return tno;}(3)if (purchase.UpdateTicket(tno) && purchase.AddG(tno, datetime2, seat))MessageBox.Show("购买成功!您购买的票为:\n" + depart + "---" + arrival + "\n" + "出发时间:" + date + "_" + time + "\n" + "车牌号:" + coachnum + "\n" + "座位号:" + seat);elseMessageBox.Show("购买失败!");(4)public bool UpdateTicket(int tno){bool flag = false;string cmdText = "dbo.UpdateTicket";SqlParameter[] paras = new SqlParameter[]{new SqlParameter("@tno",tno)};int res = helper.ExecuteNonQuery(cmdText, paras, CommandType.StoredProcedure);if (res > 0){flag = true;}return flag;}(5)public bool AddG(int tno, DateTime datetime2, string seat){bool flag = false;string cmdText = "dbo.AddPurchaseYG";SqlParameter[] paras = new SqlParameter[]{new SqlParameter("@tno",tno),new SqlParameter("@datetime2",datetime2),new SqlParameter("@seat",seat)};int res = helper.ExecuteNonQuery(cmdText, paras, CommandType.StoredProcedure);if (res > 0){flag = true;}return flag;}(6)存储过程ALTER PROCEDURE dbo.UpdateTicket@tno int/*(@parameter1 int = 5,@parameter2 datatype OUTPUT)*/AS/* SET NOCOUNT ON */BEGINupdate Ticket set SoldTicket = SoldTicket+1,LastTicket = LastTicket-1 where Tno = @tno END(7)ALTER PROCEDURE dbo.AddPurchase@tno int,@datetime1 datetime,@seat nvarchar(20)/*(@parameter1 int = 5,@parameter2 datatype OUTPUT)*/AS/* SET NOCOUNT ON */BEGINinsert into Purchase(Tno,Ptime,ReserveORBuy,Seat) values (@tno,@datetime1,'预订',@seat) END数据库连接类代码:///<summary>/// SqlCE数据库保持连接类///</summary>public class SqlHelper{public SqlConnection sqlconn = null;private SqlCommand cmd = null;private SqlDataReader sdr = null;///<summary>///构造函数///</summary>public SqlHelper(){string connStr = "Data Source=(local);Initial Catalog=Coach;Integrated Security=True";sqlconn = new SqlConnection(connStr);}private SqlConnection GetConn(){if (sqlconn.State == ConnectionState.Closed){sqlconn.Open();}return sqlconn;}///<summary>///构造函数///</summary>///<param name="fSqlceConnString">数据库连接字符串</param>public SqlHelper(String fSqlceConnString){string connStr = "Data Source=(local);Initial Catalog=Coach;Integrated Security=True";sqlconn = new SqlConnection(connStr);this.sqlconn = new SqlConnection(fSqlceConnString);if (sqlconn.State == ConnectionState.Closed){sqlconn.Open();}}///<summary>///执行不返回结果的SQL语句。