数据库实验6数据库系统设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
学院:计信学院专业:网络工程班级: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 20
8 Ctime购买时间datetime 8
9 Cnum座位数量整型 4 不
10 Ctv有无电视char 10
11 Ccondition有无空调char 10
12 Coachholder 负责人nvarchar 20 不
13 Lno线路编号整型 4 Line表主键不
14 Ldepart起始城市nvarchar 20 不
15 Larrival到达城市nvarchar 20 不
16 Ltime 路程时间datetime 8
17 Tno 车票编号整型 4 Ticket表主键不
18 Price 车票价格整型 4 不
19 SoldTicket 已卖票数整型 4 不
20 LastTicket 剩余票数整型 4 不
21 Tdate 出发日期datetime 8 不
22 Ttime 出发时间datetime 8 不
23 Ptime 购买时间datetime 8
24 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图
售票员
汽车
线路
购买
员工编号
姓名
密码
身份
汽车编号
汽车型号
购买时间
座位数量
有无电视
有无空调
线路编号
起始城市
到达城市
路程时间
车票编号
车票价格
剩余票数
购买日期
车牌号
负责人
已卖票数
出发时间
预定或购买
座位号
站点
站点编号
站点名称
系统管理员
管理
管理
车票
管理
包含
包含
员工编号
姓名
密码
身份
出发日期m
n
n
m
1
p
1
m
m n
p
m
(四)关系模型:
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 */
BEGIN
select * from Userinfo
END
修改/删除操作代码:
(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("添加成功!");
else
MessageBox.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 */
BEGIN
insert 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 */
BEGIN
select 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 = @date2
END
预订/购买操作代码:
(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);
else
MessageBox.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 */
BEGIN
update 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 */
BEGIN
insert 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语句。

比如:Insert,Delete,Update
///</summary>
///<param name="cmdText">要执行的SQL语句</param>
///<returns>返回影响记录的条数</returns>
public int ExecuteNonQuery(String cmdText)
{
SqlCommand cmd = this.sqlconn.CreateCommand();
mandText = cmdText;
mandType = CommandType.Text;
return (cmd.ExecuteNonQuery());
}
///<summary>
///执行带参数的增删改SQL语句或存储过程
///</summary>
///<param name="cmdText">增删改SQL语句或存储过程</param>
///<param name="ct">命令类型</param>
///<returns></returns>
public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct) {
int res;
using (cmd = new SqlCommand(cmdText, GetConn()))
{
mandType = ct;
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
return res;
}
///<summary>
///执行返回SqlCeDataReader结果集的SQL语句。

比如:Select
///</summary>
///<param name="cmdText">要执行的SQL语句</param>
///<returns>返回的SqlCeDataReader</returns>
public SqlDataReader ExecuteReader(string cmdText, CommandType ct)
{
SqlDataReader reader;
try
{
cmd = new SqlCommand(cmdText, GetConn());
mandType = ct;
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception e2)
{
throw new Exception(e2.Message.ToString());
}
return reader;
}
///<summary>
///执行带参数的查询SQL语句或存储过程
///</summary>
///<param name="cmdText">查询SQL语句或存储过程</param>
///<param name="paras">参数集合</param>
///<param name="ct">命令类型</param>
///<returns></returns>
public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdText, GetConn());
mandType = ct;
cmd.Parameters.AddRange(paras);
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
}
购买成功界面:
实验总结
这次课程设计使我巩固了数据库和C#的知识,通过实践,我学到了很多课本上学不到的知识。

在这次车站售票管理系统的开发过程中,我也遇到了许多的问题,例如:数据库连接错误,学习写存储过程,数据如何绑定等等,经过认真思考并在老师和同学的帮助下我顺利完成了本次设计。

首先我需要对车站售票管理系统进行系统分析:如需求分析和开发工具选择,功能分配等等。

考虑要实现整个程序大致需要的几个模块画数据流图和数据字典。

然后在概念模型设计中,将各局部应用涉及的数据分别从数据字典中抽取出来,参照数据流图,标定各局部应用中的实体、实体的属性,标识实体的码,确定实体之间的联系及其类型,设计E-R图。

在逻辑结构设计阶段,把概念结构设计阶段设计好的基本
E-R图转换为关系模型。

接着进行数据库的建立还有代码的书写:这是一个至关重要而且需要反复修改的环节,在此环节中又发现总体设计和模块思想会存在很多问题,需要不断改进。

如何实现各模块功能,达到预期效果也将是一项繁复的工作。

最后还要进行测试系统,发现所有可能出现的问题。






见签名:年月日注:各学院可根据教学需要对以上栏目进行增减。

表格内容可根据内容扩充。

相关文档
最新文档