基于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对象改变的是自身,在进行字符串处理时不生成新的对象,所以在内存使用上要优先String
    for (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、 总之,这次数据库实验历时一周,数据库结构的设计、数据的填充,提高了我系统设计的能力,软件功能的实现也让我的编程能力得到了锻炼。对于开发一个系统也有了初步的认识,以后还要多写程序多实践来提高自己的编程和设计能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神仙别闹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值