C# WinForms 航班预订系统开发实战:登录、查询与预订全流程
基于 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 交互效果
目的: 提升用户体验,增加界面美观度。
操作细节:
- 窗体拖拽: 重写
MouseDown、MouseMove和MouseUp事件,实现无边框窗口的自由移动。 - 图片轮播: 使用
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步:确认订单并保存
目的: 将用户的购买意向转化为持久化的订单数据。
操作细节:
- 参数校验: 确保选择了航班且出发日期晚于当前时间。
- 数据收集: 读取网格选中的行数据(航班号、价格等)以及用户填写的数量和日期。
- 生成订单: 生成随机订单编号,构造
INSERT INTO orderInfo语句,包含用户ID、航班信息及预订状态。 - 安全提醒: 原文示例直接使用字符串拼接 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#开发教程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









