简介:基于C#与MySQL开发的房屋租赁管理系统,面向计算机、软件工程、通信工程等专业学生,适合课程设计或毕业设计参考。项目包含完整的WinForm界面、ADO.NET数据库访问、面向对象的实体类设计以及SQL脚本,覆盖租户、房源、租赁合同等核心业务,可帮助理解C#与关系型数据库的交互方式和软件工程落地流程。压缩包共69个文件,以cs源码、resources/resx资源文件为主,另含sql数据库脚本、exe可执行程序、课程设计报告docx以及ER图和数据流图png,整体约12.81MB,结构便于直接导入运行和对照学习。已有276人学习下载。通过研究该项目,可掌握UI设计、数据绑定、增删改查、异常处理等关键技能,也能参考报告撰写与数据库建模思路,是较为完整的课程设计范例。
1. 一套能直接跑的 C# + MySQL 房屋租赁管理系统:课程设计的完整样本
每年到这个季节,都会有人拿着一堆压缩包问我哪个能用来做课程设计。这套基于 C# + MySQL 的房屋租赁管理系统,是我拆过最省心的样本之一:Visual Studio 打开 sln 就能编译,MySQL 导入 sql 脚本就能连上,ER 图、数据流图、课程设计报告一件不缺。作者是大三学生写的,典型的 WinForms + ADO.NET 结构,没有过度设计,正好适合计算机、软件工程、通信工程专业的学生拿来当课程设计底子,或者给毕业设计做架构参考。这篇文章按打开压缩包的顺序拆:先看文档怎么帮你省时间,再导数据库、配连接串、跑通功能,最后讲那些最容易翻车的坑。
2. 解压之后先别急着开代码:看懂文件结构和 ER 图能省一半时间
2.1 压缩包里每一份文件是干什么的
这个包的根目录里躺着一批命名很直白的文件,很多人一打开就直奔 .sln,其实顺序反了。介绍.txt是作者自己写的项目说明,我的数据库课程设计报告.docx是完整的课程设计文档,ER图.png和数据流图.png是数据库设计和系统流程的可视化产物,roomrentsystem.sql是 MySQL 数据库脚本,mysql-connector-net-6.9.6.msi是 MySQL 官方提供的 .NET 连接器安装包。
核心代码全在RoomRentSystem目录下,RoomRentSystem.sln就是 Visual Studio 的解决方案文件,双击它打开整个工程。RoomRentSystem.suo是用户配置文件,里面记录的是你上次打开时的窗口布局和断点之类的信息,换台机器这个文件基本没用,删了也不影响编译。那个c-Mysql----master是 Git 仓库克隆下来的目录名,master 代表主分支,里面其实就是这套代码的完整副本。
整个项目说白了就是一套 WinForms 桌面程序,数据落在 MySQL 里,通过 ADO.NET 交互。这种结构在课程设计里是最安全的选择:没有 Web 部署的麻烦,也没有前后端分离的复杂度,打开就能跑,跑起来就能演示。
2.2 ER 图里藏着数据库设计的标准答案
ER图.png建议在写报告和改代码之前先看一遍。这张图里通常会有四个核心实体:房屋信息、租客信息、租赁合同、系统用户。房屋和租客之间没有直接外键,而是通过租赁合同作为中间实体把两者关联起来,一个房屋可以有多份历史合同,一个租客也可以有多份合同,这就是一对多的标准建模方式。
从 ER 图里能反推出数据库表的字段设计思路。房屋表一般有房屋编号、楼栋、户型、面积、租金、押金、状态这些字段;租客表有姓名、电话、身份证号;合同表把房屋主键和租客主键作为外键引用,再加上起止日期、月租金、押金金额。看懂了 ER 图,你就知道改代码的时候应该碰哪些字段,写报告的时候数据模型这一章也可以直接画出逻辑。
数据流图.png描述的是系统的数据走向:管理员登录系统,维护房屋信息,登记租客,签订合同,退租时更新房屋状态。整套流程下来,数据流图帮你把系统的功能边界框死了——别想着往里加付款模块、维修工单之类的功能,课程设计的评分标准是"完整闭环",不是"功能越多越好"。
2.3 课程设计报告的作用:不只是用来交作业
那份.docx报告值得认真读一遍,它不是凑数的。报告里通常包含需求分析、系统设计、数据库设计、核心代码说明、测试结果这几章,正好对应课程设计答辩时老师会问的几个问题。很多学生答辩翻车,就是因为代码是自己写的但报告不是自己写的,老师一问"你这个表为什么这么设计"就答不上来。
我的建议是:拿到压缩包先花半小时把报告翻一遍,把作者的设计思路复述成自己的话,再对照 ER 图和数据流图检查代码实现是否一致。这套流程走完,你对该项目代码的理解已经超过大多数直接抄代码的同学了。
提示:
.suo文件和.vs隐藏目录在拷贝项目给别人的时候可以直接删掉,压缩包会小很多,别人打开也不会产生路径错乱的问题。
3. 数据库从脚本到连接串:让系统真正跑起来的关键步骤
3.1 读懂 SQL 脚本里的表结构和初始化数据
roomrentsystem.sql是这个系统的心脏。用文本编辑器打开看一眼,你会发现它不仅建了表,还插入了初始数据——管理员账号、几套测试房源、一些租客记录。这说明作者在交付前自己跑过一遍,不是交了半成品。
从脚本里能提取出表之间的依赖关系。一般先建用户表,再建房屋表,再建租客表,最后建合同表,因为合同表的外键引用前面几张表。脚本里的DROP TABLE IF EXISTS语句保证了重复执行不会报错,这是课程设计级别数据库脚本的及格线。
如果你要改表结构,比如给合同表加一个"备注"字段,建议直接改 SQL 脚本而不是用可视化工具改完再导出。原因很简单:你的课程设计报告里要粘贴建表语句,报告里的脚本和实际数据库必须一致,否则答辩时老师让你现场跑一遍脚本就会露馅。
3.2 SQL 脚本导入 MySQL 的几种方式
最常见的方式是命令行导入。打开终端进入 MySQL 的 bin 目录,或者直接使用系统 PATH 里的 mysql 命令:
mysql -u root -p < roomrentsystem.sql执行后会提示输入密码,输入 root 用户的密码回车即可。如果脚本文件路径不在当前目录,需要写绝对路径,Windows 下注意路径分隔符。执行完后登录 MySQL 验证一下表是否建好了:
mysql -u root -p USE roomrentsystem; SHOW TABLES;看到四张以上的表就说明导入成功。另一种方式是使用 Navicat 或 MySQL Workbench 这类可视化工具,右键数据库选择"运行 SQL 文件",然后选中roomrentsystem.sql。这种方式适合不习惯命令行的同学,效果完全一样。
导入时如果报错,先看是不是编码问题,脚本里如果有中文注释,导入时终端字符集不对就会乱码或报错。命令行可以加--default-character-set=utf8mb4参数重试。
3.3 连接字符串配置:WinForms 连接 MySQL 的桥梁
C# 程序要和 MySQL 通信,先要安装压缩包里的mysql-connector-net-6.9.6.msi。双击安装完,打开 Visual Studio 的项目,在"引用"里检查是否已经引用了MySql.Data.dll。如果项目引用是黄色的感叹号,说明路径断了,删掉引用重新添加,在安装目录的 Assemblies 文件夹里能找到对应版本的 dll。
连接字符串是整个系统里最容易出问题的地方。代码里通常会有一个全局变量或者独立的配置文件保存连接信息,找个关键词Server=就能定位:
string connStr = "Server=127.0.0.1;Port=3306;Database=roomrentsystem;Uid=root;Pwd=123456;CharSet=utf8mb4;SslMode=None;";参数Server写127.0.0.1比localhost稳妥,避免某些环境把 localhost 解析成 IPv6 导致连接超时。Port默认 3306,如果你安装 MySQL 时改过端口,这里必须同步改。Pwd填你本机 MySQL root 用户的密码,这一步是大多数新手连接失败的原因——代码里写的是作者电脑的密码。CharSet=utf8mb4是防中文乱码的关键,SslMode=None则是为了避免老版本连接器做 SSL 握手时报错。
注意:如果你本机装的是 MySQL 8.0 及以上版本,包里自带的这个 6.9.6 连接器可能连不上,具体原因和处理方法在第 5 章避坑部分会详细讲。
4. 核心功能拆解:从登录到合同登记的实现逻辑
4.1 登录模块:参数化查询与密码校验
几乎所有课程设计系统都以登录模块开头。这个项目的登录窗体核心逻辑是:读取用户输入,拼接 SQL 查询用户表,匹配则进入主界面。代码用到了MySqlCommand和MySqlDataReader,这是 ADO.NET 最基础的一对组合。
string sql = "SELECT UserId, UserName FROM Users WHERE LoginName=@name AND PassWord=@pwd"; using (MySqlConnection conn = new MySqlConnection(connStr)) { conn.Open(); using (MySqlCommand cmd = new MySqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@name", txtUser.Text.Trim()); cmd.Parameters.AddWithValue("@pwd", Md5Hash(txtPwd.Text)); using (MySqlDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { MessageBox.Show("登录成功,欢迎 " + reader["UserName"].ToString()); } else { MessageBox.Show("用户名或密码错误"); } } } }这段代码有两个值得学的点。第一个是Parameters.AddWithValue参数化查询,它避免了字符串拼接 SQL 的注入风险,这是课程设计答辩时老师一定会问的知识点。第二个是密码用Md5Hash加密后比对,而不是明文存储,说明作者有基本的安全意识。虽然 MD5 现在已经被认为不够安全,但在课程设计层面这个设计是及格的。
using语句的作用是确保连接和数据读取器在用完以后自动释放,GC 压力小,这是 C# 开发者的标准写法。reader["UserName"]通过列名取值,比下标取值可读性好得多。
4.2 房屋管理:DataGridView 数据绑定与增删改查
主界面的房屋管理窗体是这个系统的核心页面。它用一个DataGridView展示房屋列表,配合"新增""修改""删除""查询"四个按钮完成所有操作。加载数据的逻辑写在一个独立方法里,每次操作结束后都会调用这个方法刷新列表:
private void LoadHouseData() { string sql = "SELECT HouseID, HouseNo, Building, RoomType, Area, RentPrice, Status FROM Houses"; DataTable dt = new DataTable(); using (MySqlConnection conn = new MySqlConnection(connStr)) { MySqlDataAdapter adapter = new MySqlDataAdapter(sql, conn); adapter.Fill(dt); } dgvHouses.DataSource = dt; }这段代码用了MySqlDataAdapter的Fill方法,它先把查询结果填充到内存里的DataTable,再整体赋给DataGridView.DataSource。这种两层结构的好处是:数据库连接在Fill之后就可以关闭,界面展示的是内存数据,数据库连接占用时间最短。
新增和修改房屋的信息采集一般放在一个弹出窗体里,保存按钮的核心逻辑是 INSERT 或 UPDATE 语句。以新增为例:
string sql = @"INSERT INTO Houses (HouseNo, Building, RoomType, Area, RentPrice, Status) VALUES (@no, @building, @type, @area, @price, @status)"; cmd.Parameters.AddWithValue("@no", txtHouseNo.Text.Trim()); cmd.Parameters.AddWithValue("@building", txtBuilding.Text.Trim()); cmd.Parameters.AddWithValue("@type", cobRoomType.SelectedItem.ToString()); cmd.Parameters.AddWithValue("@area", Convert.ToDecimal(txtArea.Text)); cmd.Parameters.AddWithValue("@price", Convert.ToDecimal(txtRentPrice.Text)); cmd.Parameters.AddWithValue("@status", "待租");Convert.ToDecimal把文本框里的字符串转成 decimal 类型,SQL 才能正确比较和存储数字。如果用户输入了非数字内容,程序会抛异常,所以更稳妥的写法是用decimal.TryParse先做校验,这是课程设计里可以标注为"改进点"的地方。AddWithValue的第二个参数都是Trim()过的用户输入,避免用户手误多打了个空格导致数据带空白。
模糊查询用的是 LIKE 配合%通配符。用户输入一个关键字,同时匹配房屋编号和楼栋字段:
string keyword = txtKeyword.Text.Trim(); string sql = "SELECT * FROM Houses WHERE HouseNo LIKE @kw OR Building LIKE @kw"; cmd.Parameters.AddWithValue("@kw", "%" + keyword + "%");这里把%拼在参数值里而不是拼在 SQL 字符串里,是一个容易被人忽略但很关键的细节。原因还是参数化:参数里带通配符没有问题,SQL 语句本身保持静态,注入无从谈起。
4.3 合同登记:事务保证数据一致性
合同登记是整个系统里最有技术含量的功能,它要同时操作两张表:向合同表插入一条租赁记录,同时把房屋状态从"待租"改成"已出租"。这两条 SQL 必须保证要么都成功、要么都失败,否则会出现房屋已经出租但合同没记录的数据不一致问题。
using (MySqlConnection conn = new MySqlConnection(connStr)) { conn.Open(); MySqlTransaction tran = conn.BeginTransaction(); try { string sql1 = "INSERT INTO Contracts (ContractNo, HouseID, TenantID, StartDate, EndDate, MonthlyRent) VALUES (@cno, @hid, @tid, @start, @end, @rent)"; string sql2 = "UPDATE Houses SET Status='已出租' WHERE HouseID=@hid"; // 执行 sql1 和 sql2,参数赋值略 tran.Commit(); MessageBox.Show("合同登记成功"); } catch (Exception ex) { tran.Rollback(); MessageBox.Show("登记失败:" + ex.Message); } }BeginTransaction开启一个数据库事务,事务里的多条语句在Commit之前对数据库的修改都是临时的,只要中途有任何一条语句抛出异常,Rollback会把之前的所有修改全部撤销。这是数据库一致性的核心机制,也是答辩时老师最喜欢追问的点:"如果房子刚被租出去还没登记,另一个操作员同时点了登记怎么办?"——标准答案就是事务加唯一约束。
4.4 退租和续租:状态流转的业务设计
系统还应该处理退租和续租场景。退租的逻辑是:找到当前有效合同,把房屋状态改回"待租",合同状态改成"已退租",同时计算实际居住日期。续租更简单,把合同的结束日期往后延长。这部分代码没有新增技术点,都是 UPDATE 语句配合时间参数,但体现了业务闭环。如果你的课程设计要求里有"业务完整性"评分项,这个功能是加分点。
5. 常见问题排查:连接器、中文乱码与 MySQL 8.0 兼容性
5.1 运行时提示找不到 MySql.Data.dll
现象:编译通过,一运行就报"未能加载文件或程序集 MySql.Data"。
原因:项目引用的MySql.Data.dll路径在换机器后失效,或者引用的是安装版 GAC 里的程序集,而目标机器没有安装连接器。
解决:先安装压缩包里的mysql-connector-net-6.9.6.msi,然后在 Visual Studio 里删掉引用,重新添加。添加时选择"浏览",定位到安装目录下的Assemblies文件夹,选对应 .NET Framework 版本的MySql.Data.dll。同时右键项目属性,把"目标平台"设为 x86 或 AnyCPU,确保和 dll 的位数一致,这个配置不对也会加载失败。
5.2 界面上的中文全部变成问号或乱码
现象:房屋地址、租客姓名、合同备注等中文数据在界面上显示成一串???,或者数据库中查出来正常但界面上是乱码。
原因:字符集三处不一致——数据库、表、连接字符串。最典型的情况是数据库和表建的时候用了latin1,连接字符串又没有指定字符集。
解决:连接字符串加CharSet=utf8mb4,这是第一步。然后检查数据库的默认字符集:
ALTER DATABASE roomrentsystem CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE Houses CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;这两条语句把数据库和现有表的字符集都改成 utf8mb4。改完重新运行程序,乱码问题基本消失。注意 utf8mb4 是 utf8 的超集,可以直接覆盖 emoji 字符,MySQL 5.5.3 以上版本都支持。
5.3 连接 MySQL 8.0 报验证插件错误
现象:安装了最新版 MySQL 8.0,导入 sql 脚本成功,但程序运行时报Authentication method 'caching_sha2_password' not supported by any of the available plugins。
原因:MySQL 8.0 默认使用caching_sha2_password认证插件,而包里带的 mysql-connector-net 6.9.6 是 2015 年的版本,只认识老的mysql_native_password认证方式。
解决:两个方案二选一。方案一是把 root 用户切回老认证方式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;方案二是下载新版的 MySQL Connector/NET 替换 6.9.6,然后重新引用 dll。我建议课程设计直接用方案一,改一行 SQL 就能解决,不用动引用。生产环境才会建议升级驱动。
5.4 程序能跑但换台电脑就连不上数据库
现象:在自己电脑上一切正常,拷到实验室或室友电脑上运行报 "Unable to connect to any of the specified MySQL hosts"。
原因:目标电脑的 MySQL 服务没有启动,或者 MySQL 只允许 localhost 连接,防火墙拦了 3306 端口。
解决:先检查目标电脑的 MySQL 服务状态,Windows 下services.msc里找 MySQL 服务并启动。然后确认连接串里写的 IP 是数据库所在机器的地址,不是127.0.0.1。远程连接还需要数据库用户有远程访问权限:
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;最后放行防火墙的 3306 端口,Windows 防火墙里新建入站规则,允许 TCP 3306。这三个条件缺任何一个都连不上。
5.5 DataGridView 修改数据后界面不刷新
现象:在数据库里手工改了某条数据,回到程序界面发现还是旧数据,重启程序就正常了。
原因:LoadHouseData()方法里的DataTable是内存数据,绑定到DataGridView之后,界面显示的就是这一份快照。数据库变了,内存里的 DataTable 不会自动同步。
解决:每次增删改操作完成后,手动调用LoadHouseData()重新执行查询和绑定。如果你要让用户直接在 DataGridView 里编辑并保存,还需要监听CellValueChanged事件并手动写 UPDATE 语句,课程设计不建议做这种交互,功能演示容易翻车。
提示:遇到过"代码在作者电脑上能跑,在我电脑上报错"的情况,九成是连接串里密码不对或者连接器版本不一致,先把这两项排查完再去看代码逻辑。
6. 进阶改造:三层架构拆分与毕业设计答辩加分技巧
如果拿这套系统做毕业设计,光跑通原版是不够的。答辩老师看过太多课程设计,你要在原有功能之上做出可描述的"改进点"。我最推荐的三项改造按性价比排序如下。
第一项是三层架构重构。现在代码里 SQL 直接写在窗体事件里,也就是所谓的两层结构——界面直连数据库。你把它拆成DAL(数据访问层)、BLL(业务逻辑层)、UI(界面层)三个项目,窗体只调 BLL 的方法,BLL 内部调 DAL,所有 SQL 集中在 DAL。这个改动不增加任何功能,但答辩时你可以直接说"我用了三层架构解耦",老师一听就知道你理解分层思想。
第二项是给主界面加一个数据可视化。WinForms 自带的Chart控件不依赖第三方包,用十几行代码就能画出本月合同数、各户型出租率、租金收入走势这些统计图。绑定数据源时复用现有的DataTable即可,注意 Chart 的Series和ChartArea要先在窗体设计器里创建好,代码里只需要设置Points.DataBindXY。
第三项是把密码从 MD5 升级为 SHA256 加盐。这个改动在Md5Hash方法里做替换,把原有的 MD5 改成一个带随机盐值的 SHA256 实现,用户表的密码字段需要重新初始化。虽然改动不大,但属于可以写进报告的安全改进点。
改造完成后建议跑一遍完整的"功能回归清单",按这个顺序逐项验证:管理员登录、房屋新增修改删除、租客登记、合同签订、退租修改房屋状态、模糊查询、数据统计。每项操作后打开 MySQL 客户端查一次对应表的数据,确认界面和数据库状态一致。这套验证方法在写测试报告时能直接用。
我自己吃过大亏。以前拿别人的课设代码,上来就改窗体颜色、加按钮,结果数据库脚本没导入,连接串密码不对,折腾一晚上连登录界面都过不去。从那以后我每次接到课程设计代码,都强制自己先走一遍"看 ER 图 → 导 SQL → 配连接串 → 跑通原版 → 再改功能"的流程,顺序反了就是给自己挖坑。希望这篇拆解能帮你少走同样的弯路。
本文还有配套的精品资源,点击获取