C# WinForms 航班预订系统开发实战:登录、查询与预订全流程

竹里
竹里
发布时间:2026-10-15| 6人浏览过
原创

基于 C# 语言和 WinForms 框架,利用 ADO.NET 技术栈实现对 SQL Server 数据库的读写操作。文章通过拆解登录模块、航班查询界面及订单生成逻辑,展示了一个小型航班预订系统的完整实现路径,适合 C# 初学者了解桌面端应用程序的数据驱动开发模式。

系统核心架构与数据库准备

本项目的核心在于前后端的数据交互。为了保持代码整洁与复用性,首先创建一个独立的 DBHelper 类来管理数据库连接字符串以及连接的打开与关闭状态。该类封装了 SqlConnection 对象的生命周期,确保在多次执行 SQL 操作时连接的稳定性。

using System.Data;
using System.Data.SqlClient;

namespace MyTickets
{
    public class DBHelper
    {
        // 数据库连接字符串配置
        public string connString = @"Data Source=.;Initial Catalog=MyTicket;Trusted_Connection=Yes;Connect Timeout=90";
        private SqlConnection connection;

        public SqlConnection Connection
        {
            get
            {
                if (connection == null)
                {
                    connection = new SqlConnection(connString);
                }
                return connection;
            }
        }

        public void OpenConnection()
        {
            if (connection.State == ConnectionState.Closed)
            {
                Connection.Open();
            }
            else if (connection.State == ConnectionState.Broken)
            {
                Connection.Close();
                Connection.Open();
            }
        }

        public void CloseConnection()
        {
            if(connection.State==ConnectionState.Open|| connection.State == ConnectionState.Broken)
            {
                Connection.Close();
            }
        }
    }
}

准备工作: 需要在本地或服务器端创建名为 MyTicket 的数据库,并预设以下表结构以支持程序运行:

  • cityInfo: 存储城市信息,包含 id 和 cityName。
  • airwaysInfo: 存储航空公司信息,用于关联航班详情。
  • flightInfo: 存储航班时刻表,包括航班号、起飞时间、落地时间、价格及关联的出发/到达城市ID。
  • orderInfo: 存储用户预订记录。
  • LoginIn: 存储用户账户信息及密码(注:生产环境中建议对密码进行哈希加密存储)。

第一步:构建登录与初始化界面

系统启动后进入登录界面,主要负责用户身份验证、新用户的注册引导以及界面的视觉美化(如航空公司Logo轮播)。这一部分涉及多线程UI更新和基本的表单校验。

第1步:实现基础登录与注册逻辑

目的: 允许合法用户进入主系统,并为新用户开通账户。

操作细节: 监听登录按钮点击事件,获取用户名和密码输入框的值。若为空则提示错误;若非空,构造 SQL 查询语句在 LoginIn 表中检索是否存在匹配项。成功则跳转至主界面(机票预订),失败则提示“用户名或密码错误”。注册功能则相对简单,直接执行 INSERT 语句将新用户信息写入数据库。

// 登录按钮点击事件核心逻辑
private void 登录btn_Click(object sender, EventArgs e)
{
    string userid = this.用户名TEXT.Text;
    string psword = this.passwordtxt.Text;
    
    if (userid.Equals("") || psword.Equals(""))
    {
        MessageBox.Show("用户名或密码不能为空");
        return;
    }

    string sql = string.Format(@"select useId,psword from LoginIn where useId = '{0}' and psWord = '{1}'", userid, psword);
    DBHelper dbHelper = new DBHelper();
    SqlCommand cmd = new SqlCommand(sql, dbHelper.Connection);
    dbHelper.OpenConnection();
    SqlDataReader sdr = cmd.ExecuteReader();

    if (sdr.Read())
    {
        MessageBox.Show("信息验证成功");
        // 跳转到主页面,传递用户名
        机票预订 f2 = new 机票预订(userid);
        this.Hide();
        f2.ShowDialog();
    }
    else
    {
        MessageBox.Show("用户名或密码错误");
    }
    dbHelper.CloseConnection();
}

第2步:添加 UI 交互效果

目的: 提升用户体验,增加界面美观度。

操作细节:

  1. 窗体拖拽: 重写 MouseDown、MouseMove 和 MouseUp 事件,实现无边框窗口的自由移动。
  2. 图片轮播: 使用 Thread 创建后台线程,每隔固定时间(如2000毫秒)切换背景图片或 Logo 显示,模拟航空公司宣传效果。

以下是登录界面完成后的效果展示:

第二步:实现航班查询与预订功能

这是系统的核心业务层。用户选择出发地和目的地后,系统需即时响应并从数据库中筛选符合条件的航班,最后在用户确认后生成订单。

第3步:绑定城市下拉列表

目的: 为前端提供可选的城市列表。

操作细节: 在窗体加载(Load)事件中,调用 BindCbo 方法。查询 cityInfo 表填充数据,并在首位强制插入一行 {-1, "请选择"} 作为默认选项,防止未选择城市即触发查询导致的逻辑异常。

private void BindCbo()
{
    DBHelper dbHelper = new DBHelper();
    string sql = "select * from cityInfo";
    SqlDataAdapter adapter = new SqlDataAdapter(sql, dbHelper.Connection);
    DataSet ds = new DataSet();
    adapter.FillSchema(ds, SchemaType.Source, "cityInfo");
    adapter.Fill(ds, "cityInfo");
    
    // 插入默认选择项
    DataRow row = ds.Tables["cityInfo"].NewRow();
    row[0] = -1;
    row[1] = "请选择";
    ds.Tables["cityInfo"].Rows.InsertAt(row, 0);
    
    DataView dv = new DataView(ds.Tables["cityInfo"]);
    this.cboDestinationCity.DataSource = dv;
    this.cboDestinationCity.DisplayMember = "cityName";
    this.cboDestinationCity.ValueMember = "id";
    // ... 同理绑定出发地 cboLeaveCity
}

第4步:执行航班搜索与结果展示

目的: 根据用户选择展示可用的航班列表。

操作细节: 当用户点击“查询”按钮时,检查两个城市下拉框是否均非“请选择”。若是,则拼接 SQL 语句,关联 flightInfo 和 airwaysInfo 表,按照城市 ID 过滤,并将结果集绑定到 DataGridView 控件中显示。

第5步:确认订单并保存

目的: 将用户的购买意向转化为持久化的订单数据。

操作细节:

  1. 参数校验: 确保选择了航班且出发日期晚于当前时间。
  2. 数据收集: 读取网格选中的行数据(航班号、价格等)以及用户填写的数量和日期。
  3. 生成订单: 生成随机订单编号,构造 INSERT INTO orderInfo 语句,包含用户ID、航班信息及预订状态。
  4. 安全提醒: 原文示例直接使用字符串拼接 SQL(string.Format),这在生产环境中存在严重的 SQL 注入风险。实际开发务必替换为 SqlParameter 进行参数化查询。
// 预订按钮核心逻辑(精简示意)
private void button1_Click(object sender, EventArgs e)
{
    if(!ValidateInput()) return;

    int orderId = new Random().Next(100000, 9999999);
    string sql = string.Format(@"insert into orderInfo(orderId,flightNo,leaveDate,...) 
                                values('{0}','{1}',...)", orderId, flightNo);
    // ... 执行 ExecuteNonQuery 并提交事务
}

航班查询界面的效果如下:

第三步:订单管理与后续维护

为了方便用户查看历史消费,系统提供了订单查询功能。该界面在登录后也可通过特定入口访问,仅展示当前登录用户(useId)名下的所有订单记录。

第6步:个人中心数据渲染

目的: 向用户展示其已预订的行程。

操作细节: 在 订单查询 窗体加载时,截取当前会话的用户名,构造简单的查询:SELECT ... FROM orderInfo WHERE useId = '...' 。将查询结果直接填入表格控件即可。此模块同样复用了窗体拖拽代码以保持 UI 体验一致。

最终的个人中心订单展示效果:

总结与注意事项

上述步骤完整演示了如何利用 C# WinForms 快速搭建一个简单的 B/S 模式的桌面应用原型。该系统实现了从鉴权、查库、动态 UI 更新到数据写入的闭环。值得注意的是,由于篇幅限制,代码中省略了大量的资源释放检查和事务管理,且 SQL 语句拼接方式不适合高并发场景。如需应用于实际业务,请务必重构数据库访问层,引入 Entity Framework 等 ORM 工具,并强化安全性策略。

以上就是C#实现航班预订系统的具体代码详细内容,更多关于C#开发教程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。