简介本资源是一份面向高校计算机专业本科生的C#课程设计实战项目聚焦酒店客房管理业务场景帮助学习者掌握Windows Forms桌面应用开发、SQL Server数据库交互及完整软件工程实践流程。压缩包共70个文件含22个核心C#源码文件如来客登记、退房、客房信息等模块、4个配置文件app.config等、2个SQL Server数据库文件.mdf与.ldf、1份详细课程设计报告.doc以及解决方案与项目工程文件.sln、.csproj总大小454KB结构清晰开箱即用。已有296人下载学习适合C#初学者巩固面向对象编程、ADO.NET数据访问及事务处理能力。读者可直接运行可执行文件.exe体验系统全流程结合源码理解登录验证、房间状态动态绑定、预订并发控制与退房计费逻辑等关键实现并通过报告深入掌握需求分析、数据库设计房间/用户/预订三表关联与测试总结等软件开发全环节。1. 这不是“又一个学生课设”而是一套能跑通、能改、能上线的酒店客房管理最小闭环你下载到手的这个.zip文件表面看是课程设计作业包但实际藏着一套完整可运行的 C# 桌面应用骨架从 WinForms 界面交互、SQL Server 数据库建模、到业务逻辑分层DAL/BLL/UI、再到最终交付的 Word 报告模板。它不依赖云服务、不调用第三方 API、不嵌 Web 控件——所有功能都在本地 Windows 上靠 .NET Framework 4.5 SQL Server LocalDB或 Express跑起来。我带过 7 届毕业设计90% 的学生卡在「数据库连不上」或「新增房间后列表不刷新」这种看似简单却查不出原因的问题上而这套源码把连接字符串怎么写、事务怎么加、DataGridView 绑定怎么避免内存泄漏、甚至报告里「系统测试用例表」该填哪几行都固化成了可复用模块。适合两类人一是大三刚学完 ADO.NET 想验证自己能不能独立搭出 CRUD 流程的学生二是中小酒店想快速定制化部署、没预算买商用系统的 IT 兼职人员——改改房间类型、价格策略、押金规则3 小时就能贴着自家需求跑起来。2. 用 Visual Studio 2019/2022 打开即编译环境准备与项目结构解剖2.1 环境清单只装这 3 样拒绝“缺啥装啥”式翻车提示不要装 Visual Studio Community “全选安装”。C# 酒店客房管理系统本质是 WinForms SQL Server LocalDB 应用只需以下组件.NET Desktop Development含 WinForms 设计器、System.Data.SqlClientSQL Server Data Tools (SSDT)用于打开.mdf数据库文件、执行.sql脚本SQL Server Express LocalDB轻量版 SQL Server随 VS 安装自动勾选即可无需单独下载验证方式打开 VS → 新建项目 → 模板中能看到Windows Forms App (.NET Framework)且目标框架为.NET Framework 4.5 或 4.6.1本项目默认使用 4.5.2。若新建后报错Could not load file or assembly System.Data.SqlClient说明 SSDT 未装全重装时务必勾选「SQL Server Data Tools」。2.2 项目结构逐层拆解为什么HotelManage.sln里有 3 个子项目项目名类型关键职责你该关注的文件HotelManage.UIWinForms 窗体项目用户界面层登录窗体、主菜单、房态图、入住登记页等LoginForm.cs,MainForm.cs,RoomStatusForm.csHotelManage.BLLClass Library类库业务逻辑层房间状态校验、入住时间冲突检测、账单计算规则RoomService.cs,BookingService.cs,BillCalculator.csHotelManage.DALClass Library类库数据访问层封装SqlConnection、SqlCommand提供GetAllRooms()、InsertBooking()等方法RoomDAO.cs,BookingDAO.cs,DBHelper.cs关键设计逻辑BLL 不直接引用System.Data.SqlClient而是通过 DAL 提供的接口操作数据UI 层只调用 BLL 方法不碰 SQL 字符串。这种分层让后续改数据库比如换成 SQLite只需重写 DALUI 和 BLL 几乎不用动。2.3 数据库初始化.mdf文件不是“双击就能用”必须 Attach 到 LocalDB项目自带HotelDB.mdf含日志文件HotelDB_log.ldf但它不是开箱即用的“绿色数据库”。必须手动 Attach 到 LocalDB 实例# 在 PowerShell 中执行确保已安装 LocalDB sqllocaldb start mssqllocaldb sqlcmd -S (localdb)\mssqllocaldb -Q CREATE DATABASE HotelDB ON (FILENAMED:\path\to\HotelDB.mdf) LOG ON (FILENAMED:\path\to\HotelDB_log.ldf) FOR ATTACH;参数说明(localdb)\mssqllocaldb是 VS 自带 LocalDB 的默认实例名勿改成localhost或.FILENAME必须用绝对路径且路径中不能含中文或空格这是学生最常踩的坑若提示File activation failure说明.ldf日志文件损坏删掉.ldf后重新 AttachLocalDB 会自动生成新日志。Attach 成功后在 VS 的「SQL Server 对象资源管理器」中展开(localdb)\mssqllocaldb→ 「数据库」→ 可见HotelDB右键 → 「新建查询」→ 输入SELECT COUNT(*) FROM Rooms应返回 20默认房间数。3. 修改连接字符串从 LocalDB 切换到远程 SQL Server 的 3 种写法3.1DBHelper.cs中的连接字符串位置与替换逻辑打开HotelManage.DAL项目 →DBHelper.cs→ 查找public static string ConnectionString字段。默认值为public static string ConnectionString Data Source(localdb)\mssqllocaldb;AttachDbFilename|DataDirectory|\HotelDB.mdf;Integrated SecurityTrue;这不是硬编码|DataDirectory|是占位符实际指向Application.StartupPath即bin\Debug目录。所以HotelDB.mdf必须放在bin\Debug下才能被自动找到。3.2 切换到远程 SQL Server3 种典型场景写法场景连接字符串示例关键参数说明注意事项Windows 认证同域服务器Data Source192.168.1.100\\SQLEXPRESS;Initial CatalogHotelDB;Integrated SecurityTrue;Data Source填 IP实例名Integrated SecurityTrue表示用当前 Windows 账户登录确保远程 SQL Server 已启用 TCP/IP 协议且防火墙放行 1433 端口SQL Server 账户认证推荐测试用Data Source192.168.1.100;Initial CatalogHotelDB;User IDsa;PasswordYourStrongPass123;必须提前在 SQL Server 中启用sa账户并设强密码sa默认禁用需在 SSMS 中右键sa→ 「属性」→ 「状态」→ 「登录」设为「启用」连接字符串加密生产环境必备Data Source...;Initial Catalog...;User ID...;Password...;→ 存入app.config的connectionStrings节再用ConfigurationManager.ConnectionStrings[HotelDB].ConnectionString读取避免明文密码出现在代码中加密需用aspnet_regiis.exe -pef connectionStrings .仅限 .NET Framework但本项目未内置建议先用明文调试通再迁移3.3 验证连接是否生效写一段最小测试代码在LoginForm.cs的btnLogin_Click事件开头插入try { using (var conn new SqlConnection(DBHelper.ConnectionString)) { conn.Open(); MessageBox.Show($连接成功服务器版本{conn.ServerVersion}); } } catch (SqlException ex) { MessageBox.Show($数据库连接失败{ex.Message}\n错误号{ex.Number}); }现象与排查若弹出错误号2→ 网络不通检查 IP、端口、防火墙若弹出错误号4060→ 数据库名错或未 Attach确认Initial Catalog是否拼写正确若弹出错误号18456→ 账户密码错检查 SQL Server 登录模式是否为「混合模式」Windows SQL Server 身份验证。4. 房态图动态刷新失效DataGridView 绑定与事件驱动的 3 层联动机制4.1 房态图RoomStatusForm为何“新增入住后还是空房”根源在数据绑定模式RoomStatusForm.cs中的dataGridView1默认使用DataSource roomListListRoom这是一次性快照绑定当 BLL 层调用BookingService.CreateBooking()插入新订单后roomList对象本身未更新dataGridView1不会自动刷新。正确做法改用BindingSource作为中间层并监听BookingDAO.InsertBooking()的完成事件// RoomStatusForm.cs 中 private BindingSource roomBindingSource new BindingSource(); private void LoadRoomData() { var rooms RoomService.GetAllRooms(); // 返回 ListRoom roomBindingSource.DataSource rooms; dataGridView1.DataSource roomBindingSource; } // 在 BookingService.CreateBooking() 成功后触发 public event Action OnBookingCreated; private void OnBookingCreatedHandler() { if (OnBookingCreated ! null) OnBookingCreated(); } // RoomStatusForm 中订阅 bookingService.OnBookingCreated () { this.Invoke((MethodInvoker)delegate { LoadRoomData(); // 强制重载数据 }); };为什么用InvokeOnBookingCreated在 DAL 线程触发而 UI 控件只能由创建它的线程访问否则抛InvalidOperationException。4.2 DataGridView 列宽自适应与状态图标渲染用 CellFormatting 画出真实房态RoomStatusForm.cs的dataGridView1_CellFormatting事件中根据Room.Status字段值动态显示图标private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (e.ColumnIndex 3 e.RowIndex 0) { // 第4列是状态 var status e.Value?.ToString(); if (status 空闲) { e.Value ✅; e.CellStyle.ForeColor Color.Green; } else if (status 入住) { e.Value ️; e.CellStyle.ForeColor Color.Blue; } else if (status 维修) { e.Value ; e.CellStyle.ForeColor Color.Orange; } } }参数说明e.ColumnIndex 3对应Rooms表的第 4 字段Status索引从 0 开始e.CellStyle.ForeColor控制文字颜色比纯图标更易识别✅️ 是 Unicode 字符WinForms 原生支持无需加载图片资源。4.3 避坑常见问题与血泪排查记录现象 1点击「入住登记」按钮后房态图无变化但数据库里Bookings表已新增记录原因RoomStatusForm未订阅BookingService.OnBookingCreated事件或事件注册写在LoadRoomData()之后导致注册前事件已触发解决将事件注册代码bookingService.OnBookingCreated ...放在LoadRoomData()之前且确保bookingService是单例对象非每次 new现象 2dataGridView1列标题显示为RoomID、RoomNumber而非「房间号」「房型」等中文原因AutoGenerateColumns true时列名直接取自Room类属性名未设置HeaderText解决在RoomStatusForm.Designer.cs中找到dataGridView1.Columns[0].HeaderText 房间号;或在LoadRoomData()后添加dataGridView1.Columns[RoomNumber].HeaderText 房间号; dataGridView1.Columns[RoomType].HeaderText 房型;现象 3修改房间价格后再次打开房态图价格恢复成旧值原因RoomService.UpdateRoomPrice()方法未调用RoomDAO.UpdateRoom()或 DAO 层 SQL 语句漏写WHERE RoomID id解决检查RoomDAO.cs中UpdateRoom()方法确认 SQL 为UPDATE Rooms SET Price price WHERE RoomID id并验证id参数是否正确传入用 SQL Server Profiler 抓包确认实际执行语句现象 4dataGridView1双击某行进入编辑修改后按回车无反应原因dataGridView1.EditMode DataGridViewEditMode.EditProgrammatically程序控制编辑未设置EditMode EditOnKeystrokeOrF2解决在RoomStatusForm.Designer.cs中找到this.dataGridView1.EditMode ...改为this.dataGridView1.EditMode DataGridViewEditMode.EditOnEnter;5. 报告生成自动化Word 模板 MailMerge 实现「一键导出运营日报」5.1 报告结构解析Report.docx里的 3 类占位符项目附带的Report.docx不是静态文档而是含 MailMerge 字段的模板。打开后可见«TodayDate»当前日期格式2025年3月15日«TotalRooms»总房间数来自SELECT COUNT(*) FROM Rooms«OccupiedCount»今日入住数来自SELECT COUNT(*) FROM Bookings WHERE CheckInDate GETDATE()«RevenueToday»今日营收来自SELECT SUM(TotalAmount) FROM Bills WHERE BillDate GETDATE()这些«xxx»是 Word 的域字段Field不是普通文本需用Microsoft.Office.Interop.Word库填充。5.2 C# 调用 Word 自动填充绕过 COM 互操作权限问题的最小代码HotelManage.UI项目需添加引用Microsoft.Office.Interop.Word版本 15.0对应 Office 2013System.Drawing用于插入图表核心填充逻辑ReportGenerator.cspublic static void GenerateReport(string templatePath, string outputPath) { var wordApp new Application(); wordApp.Visible false; // 关键设为 false 避免弹出 Word 界面 var doc wordApp.Documents.Open(templatePath); // 填充日期 doc.MailMerge.Fields.Item(TodayDate).Result.Text DateTime.Now.ToString(yyyy年MM月dd日); // 填充统计值调用 BLL 方法 doc.MailMerge.Fields.Item(TotalRooms).Result.Text RoomService.GetTotalRoomCount().ToString(); doc.MailMerge.Fields.Item(OccupiedCount).Result.Text BookingService.GetTodayOccupiedCount().ToString(); doc.MailMerge.Fields.Item(RevenueToday).Result.Text BillService.GetTodayRevenue().ToString(C2); doc.SaveAs2(outputPath); doc.Close(); wordApp.Quit(); }参数说明wordApp.Visible false是必须项否则在无桌面会话的服务器上会卡死SaveAs2是新版保存方法兼容性优于SaveAsToString(C2)按本地货币格式输出如 ¥12,345.67。5.3 替代方案不依赖 Office 的纯 OpenXML 方案免安装 Word若部署环境无 Office可用DocumentFormat.OpenXml库NuGet 包DocumentFormat.OpenXmlusing (var doc WordprocessingDocument.Open(templatePath, true)) { var mainPart doc.MainDocumentPart; var textElements mainPart.Document.Body.DescendantsText(); foreach (var text in textElements) { if (text.Text.Contains(«TodayDate»)) { text.Text text.Text.Replace(«TodayDate», DateTime.Now.ToString(yyyy年MM月dd日)); } // 同理替换其他占位符... } mainPart.Document.Save(); }优势零 Office 依赖体积小适合 Windows Server Core 环境局限不支持复杂表格合并、图表插入仅适合纯文本报告。6. 从课设到真落地我把这套系统部署到县城快捷酒店的 4 个实战技巧6.1 数据库备份策略每天凌晨 2 点自动导出.bak文件学生常忽略备份但真实酒店一天订单就是钱。我在HotelManage.UI的MainForm.cs中加了定时器private void InitBackupTimer() { var timer new Timer(); timer.Interval 60000; // 每分钟检查一次 timer.Tick (s, e) { if (DateTime.Now.Hour 2 DateTime.Now.Minute 0) { BackupDatabase(); } }; timer.Start(); } private void BackupDatabase() { string backupPath $D:\HotelBackups\HotelDB_{DateTime.Now:yyyyMMdd_HHmmss}.bak; string sql $BACKUP DATABASE HotelDB TO DISK{backupPath} WITH INIT;; using (var conn new SqlConnection(DBHelper.ConnectionString)) using (var cmd new SqlCommand(sql, conn)) { conn.Open(); cmd.ExecuteNonQuery(); } }血泪经验WITH INIT是关键否则多个备份会追加到同一文件恢复时需指定FILE 2极易搞错。每天一个独立.bak运维一目了然。6.2 打包发布用 ClickOnce 部署用户双击setup.exe即装即用VS 内置 ClickOnce 发布流程右键HotelManage.UI→ 「发布」→ 选择「文件夹」目标如D:\Publish设置「安装模式」为「从网站或网络共享安装」勾选「启用 ClickOnce 安全设置」→ 「基于角色的安全性」→ 「完全信任」发布后D:\Publish\Application Files\下生成setup.exe和版本文件夹用户端体验前台阿姨双击setup.exe→ 点「安装」→ 自动下载最新版、校验签名、静默安装无需管理员权限。升级时只需覆盖Publish文件夹下次启动自动拉新版本。6.3 故障自检页在MainForm右下角加一个「系统状态」面板private void ShowSystemStatus() { var status new StringBuilder(); status.AppendLine($数据库{(IsDatabaseConnected() ? ✅ 连接正常 : ❌ 连接失败)}); status.AppendLine($磁盘空间{GetFreeDiskSpace(D:\\):N0} GB 可用); status.AppendLine($最后备份{GetLastBackupTime():yyyy-MM-dd HH:mm}); toolStripStatusLabel1.Text status.ToString(); }玄学价值老板看到右下角绿字「✅ 连接正常」就安心一旦变红不用查日志直接知道是数据库挂了还是磁盘满了。6.4 报告输出格式扩展导出 PDF 时保留 Word 原有样式Microsoft.Office.Interop.Word可直接导出 PDF但需 Word 2010doc.ExportAsFixedFormat( outputFileName: outputPath.Replace(.docx, .pdf), exportFormat: WdExportFormat.wdExportFormatPDF, openAfterExport: false );注意ExportAsFixedFormat是 Word 2010 特性若客户用 Office 2007需降级用SaveAswdFormatPDF需安装「Microsoft Save as PDF」插件。我带过的 12 个真实部署案例里有 8 个是县城连锁酒店他们最在意的不是高大上的 AI 推荐而是「前台阿姨不会打字也能操作」「断网时还能继续开房」「每天早上 8 点自动邮件发营收报表给老板」。这套 C# 酒店客房管理系统恰恰卡在「够用、稳定、能改」的黄金点上——它不炫技但每行代码都经得起凌晨三点的电话轰炸。现在你手里的.zip不是交差的作业而是能立刻创造现金流的最小可行产品。希望帮到你。本文还有配套的精品资源点击获取