ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C#与MySQL实战:房屋租赁管理系统课设开发指南

C#与MySQL实战:房屋租赁管理系统课设开发指南 简介这份资源是面向计算机相关专业在校学生的MySQL数据库课程设计完整交付包以C# WinForm实现房屋租赁管理系统适合作为课设、大作业或毕设参考。包内共71个文件约12.83MB涵盖25个cs源码文件、11个resx与11个resources界面资源、1个sql数据库脚本、1个sln解决方案与csproj工程文件另附设计报告doc/docx、ER图与数据流图png、MySQL连接组件msi及可执行程序结构完整。系统围绕房源信息、租赁信息、账单、财务、用户与管理员等模块展开配套MySqlHelper数据库访问类便于理解三层结构与数据库连接封装。已有303人学习下载。读者可据此掌握从建库建表到界面交互的完整实现思路并参考报告与图表完成文档撰写也可在此基础上二次开发扩展功能。1. 从一份房屋租赁管理系统课设说起C# 与 MySQL 到底怎么配合每年毕业季房屋租赁管理系统都是数据库课设里出现频率极高的题目。原因很直接业务实体清晰房东、租客、房源、合同、账单表关系不复杂但足够练手增删改查、事务、视图、存储过程都能塞进去。但真正动手时很多人卡在同一个地方——C# 窗体或控制台怎么和 MySQL 稳定地连起来数据怎么在两边正确流转而不是写完一堆 SQL 却跑不通。这份课设通常包含三块C# 源码、MySQL 数据库脚本、设计报告。源码负责界面和业务逻辑数据库负责持久化报告负责把 ER 图、表结构、功能模块讲清楚。适合正在做课设的学生也适合想用一个小项目把 C# 数据库编程串一遍的初学者。下面按实际落地顺序拆开讲从环境到建表、从连接池到事务、从踩坑到验收尽量让每一步都能照着复现。2. 环境与选型为什么是 C# 配 MySQL 而不是别的组合2.1 课设场景下的技术选型逻辑房屋租赁管理系统的核心诉求是「本地能跑、数据能存、界面能看」。C# 在 Windows 上做桌面端有天然优势Visual Studio 的窗体设计器拖控件就能出界面调试也方便。MySQL 免费、安装简单、社区资料多Navicat 或 MySQL Workbench 都能可视化操作。两者通过 MySql.Data 或 MySqlConnector 驱动连接属于课设里最省心的组合。如果换成 SQL Server虽然和 C# 同属微软系但安装包大、配置繁琐课设机器不一定扛得住。SQLite 更轻但不支持多用户并发体现不出数据库课设该有的连接池、事务、权限这些点。所以 C# MySQL 是平衡了「工作量」和「知识点覆盖」之后的选择。2.2 环境搭建的具体步骤先装 MySQL。官网下载社区版安装时记住 root 密码字符集选 utf8mb4排序规则用 utf8mb4_general_ci。装完用命令行验证mysql -u root -p # 输入密码后进入 mysql 提示符即成功 SHOW VARIABLES LIKE character_set_server; # 确认输出为 utf8mb4再装 Visual Studio工作负载勾选「.NET 桌面开发」。新建 Windows 窗体应用.NET Framework 4.7.2 或 .NET 6/8 都行课设一般用 Framework 兼容性好。然后通过 NuGet 装驱动# 在 Visual Studio 的「程序包管理器控制台」执行 Install-Package MySql.Data -Version 8.0.33参数说明MySql.Data 是 Oracle 官方驱动和 MySQL 8.x 配合稳定如果遇到 SSL 连接报错可以在连接字符串里加SslModeNone临时绕过但生产环境不建议。版本号不必死磕选一个和本机 MySQL 大版本接近的即可。2.3 数据库脚本的导入与验证课设压缩包里一般有一个 .sql 文件包含建库、建表、插入测试数据。导入方式mysql -u root -p house_rental.sql # 或者进入 mysql 后 source D:/course/house_rental.sql;导入后检查表是否齐全USE house_rental; SHOW TABLES; -- 预期看到 landlord、tenant、house、contract、bill 等表 SELECT COUNT(*) FROM house; -- 确认测试数据已插入如果导入报错「Unknown character set」说明脚本里用了旧字符集把文件开头的utf8改成utf8mb4再导。这一步不做后面 C# 读中文会出乱码。3. 数据库设计五张核心表怎么定字段和关系3.1 实体关系与表结构房屋租赁管理系统的 ER 关系不复杂一个房东有多套房一套房有多份合同历史续租一份合同对应多条账单。核心表如下表名作用关键字段关联landlord房东信息landlord_id(PK), name, phone被 house 引用tenant租客信息tenant_id(PK), name, id_card, phone被 contract 引用house房源信息house_id(PK), address, area, rent, status, landlord_id(FK)引用 landlordcontract租赁合同contract_id(PK), house_id(FK), tenant_id(FK), start_date, end_date, deposit引用 house、tenantbill账单记录bill_id(PK), contract_id(FK), amount, bill_month, paid引用 contract字段类型上金额用DECIMAL(10,2)而不是FLOAT避免精度丢失日期用DATE状态用TINYINT或ENUM。主键统一用INT AUTO_INCREMENT外键加索引。3.2 建表 SQL 与约束设置CREATE TABLE house ( house_id INT PRIMARY KEY AUTO_INCREMENT, address VARCHAR(200) NOT NULL, area DECIMAL(8,2) NOT NULL, rent DECIMAL(10,2) NOT NULL DEFAULT 0, status TINYINT NOT NULL DEFAULT 0 COMMENT 0待租 1已租 2维修, landlord_id INT NOT NULL, CONSTRAINT fk_house_landlord FOREIGN KEY (landlord_id) REFERENCES landlord(landlord_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;逻辑说明status用 TINYINT 而不是字符串查询和更新都更快外键约束保证不会出现「房源挂在不存在的房东名下」DEFAULT 0让租金有默认值插入时少传一个字段也不报错。参数上DECIMAL(8,2)表示总面积最大 999999.99够用如果做商业项目可以放大到DECIMAL(10,2)。3.3 视图和存储过程要不要加课设报告里如果只写增删改查分数一般。加一个视图统计每套房当前租客和租金CREATE VIEW v_house_rental AS SELECT h.house_id, h.address, h.rent, t.name AS tenant_name, c.start_date, c.end_date FROM house h LEFT JOIN contract c ON h.house_id c.house_id AND c.end_date CURDATE() LEFT JOIN tenant t ON c.tenant_id t.tenant_id;再加一个存储过程根据合同 ID 生成当月账单DELIMITER // CREATE PROCEDURE sp_generate_bill(IN p_contract_id INT, IN p_month DATE) BEGIN INSERT INTO bill(contract_id, amount, bill_month, paid) SELECT contract_id, h.rent, p_month, 0 FROM contract c JOIN house h ON c.house_id h.house_id WHERE c.contract_id p_contract_id; END // DELIMITER ;这两块在答辩时是加分项说明你理解数据库不只是存数据还能做计算和封装。注意存储过程在 C# 里调用要用CommandType.StoredProcedure参数用MySqlParameter传别拼字符串。4. C# 端实现连接、增删改查与事务的完整写法4.1 连接字符串与连接池配置连接字符串放在 App.config 或 appsettings.json 里不要硬编码在代码里。典型写法connectionStrings add nameHouseRental connectionStringServerlocalhost;Databasehouse_rental;Uidroot;Pwdyourpassword;CharSetutf8mb4;Poolingtrue;Min Pool Size2;Max Pool Size20; providerNameMySql.Data.MySqlClient/ /connectionStrings参数说明Poolingtrue开启连接池避免每次操作都新建物理连接Min Pool Size2保持两个常驻连接减少首次请求延迟Max Pool Size20课设够用太大反而占资源CharSetutf8mb4保证中文不乱码。如果连接报「Authentication method caching_sha2_password not supported」把 MySQL 用户认证插件改成mysql_native_password或者升级驱动版本。4.2 封装一个可复用的数据库访问类不要在每个窗体里写重复的MySqlConnection。封装一个 DbHelperpublic class DbHelper { private static readonly string connStr ConfigurationManager.ConnectionStrings[HouseRental].ConnectionString; // 执行增删改返回受影响行数 public static int ExecuteNonQuery(string sql, params MySqlParameter[] paras) { using (var conn new MySqlConnection(connStr)) using (var cmd new MySqlCommand(sql, conn)) { if (paras ! null) cmd.Parameters.AddRange(paras); conn.Open(); return cmd.ExecuteNonQuery(); } } // 执行查询返回 DataTable public static DataTable ExecuteQuery(string sql, params MySqlParameter[] paras) { using (var conn new MySqlConnection(connStr)) using (var cmd new MySqlCommand(sql, conn)) { if (paras ! null) cmd.Parameters.AddRange(paras); var adapter new MySqlDataAdapter(cmd); var dt new DataTable(); adapter.Fill(dt); return dt; } } }逻辑说明using保证连接和命令对象用完即释放连接池会自动回收物理连接params MySqlParameter[]支持可变参数调用时不用手动建数组查询返回 DataTable直接绑定到 DataGridView 就能显示。参数化查询是防 SQL 注入的关键下面会展开。4.3 参数化查询与事务处理登录和查询必须用参数化不要拼字符串string sql SELECT * FROM landlord WHERE namename AND phonephone; var dt DbHelper.ExecuteQuery(sql, new MySqlParameter(name, txtName.Text), new MySqlParameter(phone, txtPhone.Text));签合同涉及多表写入必须用事务public static bool SignContract(int houseId, int tenantId, DateTime start, DateTime end, decimal deposit) { using (var conn new MySqlConnection(connStr)) { conn.Open(); using (var tran conn.BeginTransaction()) { try { string sql1 INSERT INTO contract(house_id,tenant_id,start_date,end_date,deposit) VALUES(h,t,s,e,d); using (var cmd1 new MySqlCommand(sql1, conn, tran)) { cmd1.Parameters.AddWithValue(h, houseId); cmd1.Parameters.AddWithValue(t, tenantId); cmd1.Parameters.AddWithValue(s, start); cmd1.Parameters.AddWithValue(e, end); cmd1.Parameters.AddWithValue(d, deposit); cmd1.ExecuteNonQuery(); } string sql2 UPDATE house SET status1 WHERE house_idh; using (var cmd2 new MySqlCommand(sql2, conn, tran)) { cmd2.Parameters.AddWithValue(h, houseId); cmd2.ExecuteNonQuery(); } tran.Commit(); return true; } catch { tran.Rollback(); return false; } } } }逻辑说明两条 SQL 要么都成功要么都回滚不会出现「合同插入了但房源状态没改」的脏数据。参数用AddWithValue自动推断类型简单场景够用如果字段类型严格建议显式指定MySqlDbType。事务对象必须和命令对象绑定同一个连接否则事务不生效。5. 避坑与排查课设里最容易翻车的五个地方5.1 中文乱码现象是界面显示问号原因是字符集不统一现象DataGridView 里房东姓名显示成???或乱码。原因MySQL 服务端、数据库、表、连接字符串四层字符集不一致。解决服务端my.ini里设character-set-serverutf8mb4建库建表用DEFAULT CHARSETutf8mb4连接字符串加CharSetutf8mb4。四层都对齐后重启 MySQL 服务。5.2 连接池耗尽现象是程序跑一会儿就卡死原因是连接没释放现象反复打开窗体查询后程序报「Timeout expired」或直接无响应。原因MySqlConnection没有using或没有Close()物理连接被占满。解决所有连接对象用using包裹或者try/finally里显式Close()。连接池的Max Pool Size只是上限不是让你不释放的理由。5.3 外键约束报错现象是删除房东失败原因是还有房源引用他现象删除 landlord 记录时提示「Cannot delete or update a parent row」。原因house 表有外键指向 landlord。解决要么先删关联房源要么在建表时设ON DELETE CASCADE课设里不建议容易误删。更合理的做法是在业务层先检查有没有关联数据给用户提示。5.4 日期格式不匹配现象是插入合同报错原因是 C# 的 DateTime 和 MySQL 的 DATE 格式差异现象start_date插入时报「Incorrect date value」。原因C# 的DateTime带时分秒MySQL 的DATE只接受日期部分。解决参数传start.Date只取日期或者把字段改成DATETIME。如果是从 TextBox 读字符串用DateTime.ParseExact按yyyy-MM-dd解析别直接传。5.5 驱动版本冲突现象是编译通过但运行报「Could not load file or assembly」现象项目引用了 MySql.Data运行时提示找不到程序集或版本不匹配。原因NuGet 装的版本和项目目标框架不兼容或者多个项目引用了不同版本。解决统一所有项目的 MySql.Data 版本在app.config里加bindingRedirect。如果用的是 .NET 6改用 MySqlConnector 驱动兼容性更好。6. 验收与进阶怎么证明这套系统真的能跑以及还能加什么课设验收时老师不会只看界面。准备一套可复现的验证流程先导入 SQL 脚本确认五张表和测试数据都在然后打开程序依次演示房东录入、房源上架、签合同、生成账单、标记缴费。每一步都截图或录屏重点展示数据库里的数据变化而不是只看窗体提示「成功」。一个具体的验证技巧在 MySQL 里开一个会话程序操作前后各查一次SELECT * FROM contract ORDER BY contract_id DESC LIMIT 1; SELECT status FROM house WHERE house_id 1;对比程序操作和数据库实际状态是否一致。如果程序说成功但数据库没变说明事务没提交或者连接用错了库。进阶方向有三个。第一把账单生成做成定时任务用 MySQL 的EVENT每月自动执行存储过程C# 端只负责查询和展示。第二加一个简单的权限表区分管理员和普通用户登录后根据角色显示不同菜单。第三把 DataGridView 的查询改成分页用LIMIT offset, size数据量大了不会卡。我自己做这类课设时最大的教训是别一上来就写界面。先把表建好用命令行把增删改查跑通确认数据没问题再回到 Visual Studio 拖控件。界面是皮数据库是骨骨头不正皮再好看也站不住。希望帮到你。本文还有配套的精品资源点击获取
返回列表