当前位置: 首页 > news >正文

基于C#+SQLServer2016实现(控制台)小型机票订票系统

小型机票订票系统

一、 实验目的:

1、能够正确运用数据库基本理论和知识,复习、巩固、提高数据库方案设计、论证和分析方法。

2、熟悉关系数据库规范化设计理论,根据实验要求设计并建立科学合理的数据库,正确建立数据库中表与表之间的关系。

3、进一步正确理解数据库设计思路,培养分析问题、解决问题的能力,提高查询资料和撰写书面文件的能力。

二、 实验内容:

[系统描述]

小型机票订票系统应具备航班信息管理、旅客信息管理、机票信息查询及订购基本管理功能,具体要求如下:

(1)能对航班信息进行维护:输入、修改、删除航班信息。

(2)能对旅客信息进行维护。

(3)能进行航班信息、余票情况及旅客信息的各种查询。

(4)能进行机票的订购及退订,必须动态刷新库存。

(5)能对每个航班进行按月、季度、年份进行售票统计。

(6)能对每个旅客进行按月、季度、年份进行出行统计。

1.根据上述系统功能需求,使用 ER 图描述该管理信息系统的概念模型。

2.完成该管理信息系统的数据库总体设计方案,明确数据库中表的结构,各表中关键字的设置,表与表之间的关系。

3.根据系统功能需求,以 SQL 语句的形式分类列出系统应涉及的数据操作。

4.选用熟悉的数据库工具,根据设计方案正确建立数据库,并成功实现上述数据操作。

5.完成上述内容,并提交书面实验报告。

三、 实验步骤:

实验平台:windows10,IDEA2016,SQLServer2016

1、 建立关系模型

用 ER 图表示如下:

图3-1-1:实体ER图

图3-1-2:ER图

2、 定义数据库表

a. 航班表

b. 旅客表

c. 机票表

d. 订单表

e. 机票订票系统的数据关系图:

在上述关系中,机票表中 tiket_flight 为航班表中 flight_id 的外键,删除航班表中特定航班时机票表中特定航班的所有机票被删除(级联删除)。订单表中 order_traveller 为旅客表中 traveller_id 的外键,当删除旅客信息时,订单表中所有该旅客的订单被删除。订单表中 order_flight 为航班表中 flight_id 的外键,当删除旅客信息时,订单表中所有该旅航班的订单被删除。

当旅客定票时,机票表中的剩余票数会减少,当旅客退票时,机票表中的剩余票数增加,从而实现动态刷新库存。订单表中的 order_time 和 order_takeofftime 是为了便于按月、按季度、按年份统计航班售票情况和旅客出行情况而设定的。

3、 软件功能实现

4、 相关实现代码说明:

a.主函数里面使用 switch 结构,实现相关功能切换,不同命令执行不同的功能函数,当用户键入“quit”时,退出系统:

public static void main(String[] args) {connect_database();//连接数据库System.out.println("请输入对机票订票系统的操作:\n 1、flight(航班修改);\n 2、traveller(旅客修改);" +"\n 3、query(查询航班,旅客等信息);\n 4、count(统计售票出行);\n " +"5、order(预定机票);\n 6、refund(退机票);\n 7、quit(退出系统);\n");Scanner sc=new Scanner(System.in);//System.in代表标准输入,就是键盘输入sc.useDelimiter("\n");//Scanner默认以空格作为分隔符,这里以回车作为分隔符while(sc.hasNext()){int flag=0;switch (sc.next()){case "flight":flight();break;case "traveller":traveller();break;case "query":query();break;case "order":order();break;case "refund":refund();break;case "count":count();break;case "quit":System.out.println("成功退出系统!");flag=1;break;default:System.out.println("提示:请重新输入正确的主菜单命令!");}if (flag==1)//flag=1,则退出机票订票系统break;}
}

b.连接数据库的操作:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//加载JDBC驱动
con= DriverManager.getConnection(url);//解析url,连接数据库
if (con!=null)
{System.out.println("连接成功.");
}
else
{System.out.println("连接失败!");
}

c.预定机票的操作,将旅客、航班、出发日期等信息输入到订单中:

String order_id=getRandomString(10);
String SQL_order="INSERT INTO 订单(order_id,order_traveller,order_flight,order_takeofftime,order_time)" +"VALUES('"+order_id+"','"+arr[0]+"','"+arr[1]+"','"+arr[2]+"','"+arr[2]+"')";
sql_exe_manipulate(SQL_order);String SQL_ticket_minus="UPDATE 机票 SET ticket_sum=ticket_sum-1" +"WHERE ticket_flight='"+arr[1]+"' AND ticket_time='"+arr[2]+"'";
sql_exe_manipulate(SQL_ticket_minus);
System.out.println("预订机票:"+order_id+"\n");

d.sql_exe_manipulate()和 getRandomString()分别执行数据库 SQL 的更新,查询操作:

public static void sql_exe_manipulate(String SQL) {try {Statement statement = con.createStatement();statement.executeUpdate(SQL);}catch (Exception e){e.printStackTrace();}}
//生成指定长度的随机数
public static String getRandomString(int length) {String base = "abcdefghijklmnopqrstuvwxyz0123456789";Random random = new Random();//构造函数StringBuffer sb = new StringBuffer();//StringBuffer对象改变的是自身,在进行字符串处理时不生成新的对象,所以在内存使用上要优先Stringfor (int i = 0; i < length; i++) {int number = random.nextInt(base.length());//生成[0,base.length)区间的整数sb.append(base.charAt(number));}return sb.toString();
}

e. 查询航班信息:

public static void iflight() {try{String  SQL="SELECT flight_id AS 航班编号,flight_src AS 起飞城市,flight_dst AS 目标城市 FROM 航班";ResultSet resultSet=sql_exe_query(SQL);System.out.println("  航班编号   起飞城市   目的城市");while (resultSet.next()) {System.out.println(resultSet.getString(1) + "    " + resultSet.getString(2)+"     "+ resultSet.getString(3));}}catch (Exception e){e.printStackTrace();}}

f. 按季度统计旅客出行情况

public static void count_traveller_season(String traveller_id) {System.out.println("请输入你要查询的季度,例:2016年春/夏/秋/冬“2016 spring/summer/autumn/winter”\n");Scanner scanner = new Scanner(System.in);scanner.useDelimiter("\n");String season_s = scanner.next();String[] arr = season_s.split(" ");String time_start = arr[0] + "-01-01";String time_stop = arr[0] + "-03-31";switch (arr[1]){case "spring":time_start = arr[0] + "-01-01";time_stop = arr[0] + "-03-31";break;case "summer":time_start = arr[0] + "-04-01";time_stop = arr[0] + "-06-30";break;case "autumn":time_start = arr[0] + "-07-01";time_stop = arr[0] + "-09-30";break;case "winter":time_start = arr[0] + "-10-01";time_stop = arr[0] + "-12-31";break;}try {String SQL_season = "SELECT COUNT(*)" +"FROM 订单" +" WHERE order_traveller='" + traveller_id + "'" +" AND order_takeofftime >='" + time_start + "' AND order_takeofftime <='" +time_stop + "'";ResultSet season_resultSet = sql_exe_query(SQL_season);while (season_resultSet.next()) {System.out.println(traveller_id + "旅客" + arr[0] + "年" + arr[1] + "季度共计出行: "+ season_resultSet.getString(1) + " 次");}} catch (Exception e) {e.printStackTrace();}
}

四、 实验系统演示:

1、 增加、删除航班:

图4-1-1:插入航班的命令

图4-1-2:删除航班的命令

4-1-3:未插入航班前           4-1-4:新增航班后

2、 旅客注册:

图4-2-1:增加旅客信息

图4-2-2:删除旅客信息

图4-2-3:增加旅客后的旅客表

3、 查询信息:

图4-3-1:查询航班信息

图 4-3-2:查询旅客信息

图 4-3-3:查询机票信息

图 4-3-4:查询订单信息

4、 订票:

图4-4-1:机票预订成功

图4-4-2:预订机票生成的订单

图 4-4-3:机票库存动态刷新

5、 退票:

图4-5-1:退票

图4-5-2:相应订单被删除

图4-5-3:机票库存被刷新

6、 统计航班售票情况:

图 4-6-1:航班 XMAIR00008 在 2016 年 11 月售票 1 张

图 4-6-2:航班 XMAIR00008 在 2016 年冬季售票 2 张

图 4-6-3:航班 XMAIR00008 在 2016 年售票 8 张

7、 旅客出行情况统计:

图 4-7-1:旅客 622826199505241535 在 2016 年 12 月出行 1 次

图 4-7-2:旅客 622826199505241535 在 2016 年秋季出行 2 次

图4-7-3:旅客622826199505241535在2016年出行8次

8、 退出系统:

图4-8-1:quit命令退出机票订票系统

五、 实验总结:

1、 以前的许多程序实验都是直接从程序中调用数据,用链表数组等将其存储。像这样连接数据库系统将数据和程序如此分离的程序实验,我还是第一次做,不过其基本功能类似。

2、 本系统实现的功能有:航班信息的修改,旅客信息的修改,订票、退票功能,信息查询功能,售票出行情况统计功能。

3、 该系统也存在很大的不足之处,由于我对于 GUI 编程并不是非常熟悉,所以采用了命令行的方式来实现交互,使得系统不好用。另一方面,该系统的容错能力也非常有限,很多情况下并没有对用户输入做检查,有时候可能导致秩序崩溃。

4、 总之,这次数据库实验历时一周,数据库结构的设计、数据的填充,提高了我系统设计的能力,软件功能的实现也让我的编程能力得到了锻炼。对于开发一个系统也有了初步的认识,以后还要多写程序多实践来提高自己的编程和设计能力。

相关文章:

  • 【Bluedroid】蓝牙启动之 GAP_Init 流程源码解析
  • Spring AOP与代理模式
  • 《单调队列》题集
  • HTTP全攻略:从入门到精通
  • 经济系统的「资源死锁」与「架构重构」:从通缩陷阱到可持续模型设计
  • 线性三角波连续调频毫米波雷达目标识别
  • 开源组件hive页面安全问题
  • 【面板数据】中国与世界各国新能源汽车进出口数据-分类别与不分类别(2017-2024年)
  • 【AI图像生成网站Golang】部署图像生成服务(阿里云ACK+GPU实例)
  • python打卡day53
  • ​​信息系统项目管理师-信息系统工程 知识点总结与例题分析​​
  • MultiTalk 是一种音频驱动的多人对话视频生成模型
  • 设计模式(二)
  • 上传IPA到App Store的步骤
  • Java线程异常处理与多线程编程实践
  • 当Python遇上多线程:ThreadPoolExecutor的实用指南
  • stl学习
  • 迁移学习基础
  • unity学习摘要
  • 利用pycharm搭建模型步骤
  • 昆山企业网站制作公司/十大最靠谱培训机构
  • 青岛网站备案/发稿网
  • 做酒的网站/推广策略
  • semcms外贸网站管理系统/百度百科推广费用
  • 公司网站可以自己建立吗/关键词搜索排名怎么查看
  • 大良网站建设市场/关键词收录