简介:面向数据库课程设计的C#房屋租赁管理系统完整项目,专为初次接触WinForm窗体与数据库联调的小白用户打造,解决了课程设计从零搭建房屋租赁业务模块、报表统计与界面交互的常见难题。资源共71个文件,zip压缩包约12.86MB,核心包含25个C#源代码文件、1份SQL建库脚本、doc与docx格式课程设计报告以及2张数据设计图(ER图、数据流图),同时附可运行exe程序、dll依赖与完整工程文件,便于直接编译调试。报告内含需求分析、数据库表结构、功能模块说明与详细设计,代码按窗体层、业务层、数据层组织,目录结构清晰,读者可对照报告理清租赁管理、客户信息、费用结算等功能的实现脉络,快速完成课程设计并掌握数据库在桌面应用中的实际用法。已有146人学习下载,适合高校学生与自学者参考复用。
1. 一份能直接跑的 C# 房屋租赁管理系统:课设源码该看什么
数据库课程设计的通病是:代码能跑,一换机器就翻车。这套用 C# 写的房屋租赁管理系统,把源码、数据库脚本、课程设计报告、ER 图和数据流图打包在一起,属于「拿到手就能照着复现」的课设成品。压缩包里 RoomRentSystem.sln 是主工程,roomrentsystem.sql 负责建库建表,mysql-connector-net-6.9.6.msi 是连接 MySQL 的驱动,报告文档里连封皮都是现成的。
它解决的核心问题很直接:你要交一份「数据库设计 + 增删改查 + 界面操作」完整的课程设计,但不想从零写上万行业务代码。适合对 C# 刚入门、正被数据库课设逼得没头绪的同学;也适合手里已有系统、但报告写不满页数的人——把 ER 图、数据流图和表结构理解直接搬进自己的报告里就行。
下面我按拆包顺序走一遍:先看数据库设计,再把运行环境跑通,最后说几个常见翻车点和答辩前最值得改的小地方。
2. 数据库设计是这套源码的灵魂:五张表、ER 图与数据流图
先别急着双击 .sln。任何数据库课程设计的源码包,第一眼该看的是 SQL 脚本和 ER 图。房屋租赁管理系统听起来功能多,剥开业务外壳之后就是「房源、租客、合同、缴费」四类实体加一个管理员登录。这套资源里的 ER 图已经把实体关系画好,数据流图描述数据在系统里的流动方向,两章图在报告里各占一页,答辩时老师大概率会指着它们问「为什么合同表要单独建一张」,所以把表结构吃透很关键。
2.1 核心业务拆解:房源、租客、合同、缴费四类数据
打开 ER 图,第一眼是五张表。房屋信息是核心资产,必须留一个出租状态字段;租客信息记录姓名、电话、证件号;合同表关联房屋和租客,是整段业务关系的中间环节;缴费表记录每一笔租金流水;外加一张管理员表负责登录鉴权。五张表的关系可以归纳成一张表:
| 表名 | 记录什么 | 关键字段或关系 |
|---|---|---|
| t_user | 登录账号 | user_name / password |
| t_house | 房源信息 | house_no / rent_price / status |
| t_tenant | 租客信息 | tenant_name / phone / id_card |
| t_contract | 租赁合同 | 关联 house 与 tenant,存租金和租期 |
| t_payment | 缴费记录 | 关联 contract,存金额和支付日期 |
为什么合同要单独建一张表,而不是在房屋表里加一个「当前租客ID」字段?因为一套房源在生命周期内会被不同租客先后承租。如果只在房屋表里覆盖租客ID,历史租赁数据就全丢了。合同表独立出来之后,一份合同对应一个房源、一个租客,将来退租、续租、查历史记录都有依据。这是数据库课设里「设计合理性」的核心得分点,答辩老师很爱问。
2.2 五张表字段怎么设计:照着 ER 图建库
roomrentsystem.sql 里就是完整的建库建表语句,结构和我下面这个版本基本一致。可以把它当成对照清单,逐个核对原脚本:
CREATE DATABASE IF NOT EXISTS roomrent DEFAULT CHARACTER SET utf8; USE roomrent; CREATE TABLE t_user ( user_id INT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(30) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL, role TINYINT DEFAULT 1 COMMENT '1-管理员' ) ENGINE=InnoDB; CREATE TABLE t_house ( house_id INT AUTO_INCREMENT PRIMARY KEY, house_no VARCHAR(20) NOT NULL COMMENT '房间编号', building VARCHAR(20) COMMENT '所属楼栋', unit VARCHAR(20) COMMENT '单元/楼层', area DECIMAL(8,2) COMMENT '建筑面积(平米)', rent_price DECIMAL(10,2) NOT NULL COMMENT '月租金(元)', status TINYINT DEFAULT 0 COMMENT '0-空置 1-已租 2-维修', remark VARCHAR(255) ) ENGINE=InnoDB; CREATE TABLE t_tenant ( tenant_id INT AUTO_INCREMENT PRIMARY KEY, tenant_name VARCHAR(30) NOT NULL, phone VARCHAR(20), id_card VARCHAR(18), address VARCHAR(255), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB; CREATE TABLE t_contract ( contract_id INT AUTO_INCREMENT PRIMARY KEY, contract_no VARCHAR(30) NOT NULL, house_id INT NOT NULL, tenant_id INT NOT NULL, start_date DATE NOT NULL, end_date DATE NOT NULL, monthly_rent DECIMAL(10,2) NOT NULL, deposit DECIMAL(10,2), create_time DATETIME DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_contract_house FOREIGN KEY (house_id) REFERENCES t_house(house_id), CONSTRAINT fk_contract_tenant FOREIGN KEY (tenant_id) REFERENCES t_tenant(tenant_id) ) ENGINE=InnoDB; CREATE TABLE t_payment ( payment_id INT AUTO_INCREMENT PRIMARY KEY, contract_id INT NOT NULL, pay_date DATE NOT NULL, pay_amount DECIMAL(10,2) NOT NULL, pay_type VARCHAR(20) COMMENT '现金/转账/微信', remark VARCHAR(255), CONSTRAINT fk_payment_contract FOREIGN KEY (contract_id) REFERENCES t_contract(contract_id) ) ENGINE=InnoDB;字段设计里有几个点值得你答辩前背下来。面积和租金用 DECIMAL 而不是 FLOAT,因为浮点数计算金额会尾巴,比如 29.999999 这种,虽然界面看不出来,但老师会扣分。contract 表里单独存了一份 monthly_rent,不从 house 表实时取,原因是合同签定后租金可能调整,历史合同必须保留签约时的租金水平,直接关联房屋表价格一旦被改,历史账目就对不上了。外键约束要建在 InnoDB 引擎上,如果你打开原 SQL 脚本发现某张表是 MyISAM,建议改成 InnoDB,否则外键实际不生效。
导入之后马上验证一下:SHOW TABLES;看五张表是否齐全,然后SELECT * FROM t_user;看看初始账号。很多课设资源里 t_user 会预置一条 admin 记录,密码要么是 admin 要么是 123456,这条信息不提前确认,后面登录那一步会卡住。
2.3 ER 图和数据流图放进报告的正确姿势
ER 图描述静态结构,数据流图描述动态过程。报告里两张图不能干巴巴地放上去,下面这段说明文字可以直接抄进「概念结构设计」和「数据分析」章节:
管理员登录系统后维护房源与租客信息;租客信息登记完成后,管理员可签订租赁合同;合同生效后,每次收租生成一条缴费记录,缴费记录归属于对应合同。因此,合同表是房源与租客之间的关联实体,缴费记录依赖合同存在,均采用 1:N 关系设计,保证历史数据可追溯。
这句话把五张表之间的因果讲清楚了,比写「该系统功能完善、界面友好」这种空话有用得多。如果数据流图是分层画的,报告里至少放两张:一张顶层图描述管理员与系统的交互,一张 0 层图展开「签订合同」「收租记账」这两个核心加工过程。
3. 从压缩包到跑起来:MySQL 环境、连接字符串与首次登录
资源能不能用,取决于环境搭得对不对。我拿到压缩包后先看了一遍 README,但 README 通常写得很简略,所以核心还是自己把环境过一遍。这里要注意一个版本问题:连接器是 6.9.6,MySQL 建议装 5.7 系列,不少同学电脑上装的是 MySQL 8.0,后面会单独讲这个坑。整体操作顺序建议是:装 MySQL → 装连接器 → 导入 SQL 脚本 → 打开工程改连接字符串 → 编译运行。
3.1 版本匹配是玄学但可以算清楚
mysql-connector-net-6.9.6 是 2016 年前后的 .NET 连接器,只完整支持 MySQL 5.x 的认证协议。MySQL 从 8.0 开始默认把 root 认证插件换成了 caching_sha2_password,两边协议对不上就会直接报错。版本组合先看这张表:
| 环境组合 | 结果 | 对策 |
|---|---|---|
| MySQL 5.7 + 连接器 6.9.6 | 正常 | 装完直接跑 |
| MySQL 8.0 + 连接器 6.9.6 | 报 caching_sha2_password 错误 | 换 8.0.x 连接器,或改 root 认证插件 |
| MySQL 8.0 + 连接器 8.0.x | 可运行 | 需要重新引用 MySql.Data.dll |
Visual Studio 版本倒不用太担心。这个 .sln 是 WinForms 老项目,VS2015、VS2017、VS2019 都能打开,VS2022 打开时会提示升级一次,升级后一般无碍。真正容易出问题的是 .suo 文件——它是 Visual Studio 的用户选项缓存,打不开解决方案时删掉它往往立刻恢复,这一点在第 4 章会细说。
3.2 先导数据库还是先开项目:建议顺序
我的习惯是先让数据库跑起来,再开 Visual Studio。原因很简单:程序点击登录的第一件事就是连数据库,数据库没起来,程序直接弹超时异常,这时候你很难判断是代码问题还是环境问题。反过来,先用命令行把 SQL 脚本导入成功,至少证明数据库侧一切正常,后面报错就只可能是连接字符串或代码层面的问题,排查范围小一半。
另一个细节:mysql-connector-net-6.9.6.msi 安装时,安装向导会让你选择把程序集装到哪,建议勾选安装到 GAC。装完之后,在 Visual Studio 里右键项目 → 添加引用 → 搜索 MySql.Data,能找到就说明装好了。如果找不到,也可以直接到安装目录里手动选择 MySql.Data.dll。
3.3 导入 SQL 脚本的两种姿势
在 Windows 下打开命令行,进入 roomrentsystem.sql 所在目录,执行:
mysql -u root -p < roomrentsystem.sql-u root指定账号,-p表示随后交互式输入密码,<把本地 SQL 文件内容重定向给 mysql 客户端执行。如果脚本里已经包含了 CREATE DATABASE(这套脚本大概率有),就不用手动建库;如果没有,需要先执行CREATE DATABASE roomrent DEFAULT CHARACTER SET utf8;再USE roomrent;。命令执行完没有报错,就说明建表语句整体通过,接着用SHOW TABLES;确认五张表都建出来了。
注意:如果提示
ERROR 1049 (42000): Unknown database,说明脚本里没有自动建库,手动补一条 CREATE DATABASE 再重新导入。
懒得用命令行的,用 Navicat 连接本地 MySQL,右键目标数据库 → 运行 SQL 文件 → 选择 roomrentsystem.sql,执行完刷新表列表。两种方式效果一样,Navicat 适合看执行日志,命令行适合快速验证。
3.4 连接字符串:三个地方必须一致
WinForms 项目一般把连接字符串放在 App.config 的 connectionStrings 节点里,也有的课设会直接写在某个公共类里。打开 App.config,你会看到类似这样的配置:
<connectionStrings> <add name="RoomRentDb" connectionString="Server=localhost;Port=3306;Database=roomrent;Uid=root;Pwd=123456;Charset=utf8;" /> </connectionStrings>六个参数逐一说明:Server 填 localhost 或 127.0.0.1 都可以,但必须和 MySQL 实际监听的地址一致;Port 默认 3306,改过端口就要同步改;Database 必须和 SQL 脚本里建出来的库名一致,这是最容易被忽略的——脚本建库叫 roomrent,连接字符串里写 RoomRent 或 room_rent,一运行就是找不到表;Uid 和 Pwd 必须和 MySQL 里真实账号密码对应;Charset=utf8 负责处理中文显示,建议保留。
提示:如果 MySQL 密码里包含分号或特殊字符,连接字符串解析会出问题。排查时建议先把密码临时改成纯数字,验证通过再考虑转义写法。
3.5 编译通过之后的登录验证
环境都就绪后,按 F5 编译运行,进到登录窗体。登录验证的典型代码长这样:
using (MySqlConnection conn = new MySqlConnection(connStr)) { string sql = "SELECT user_id, user_name FROM t_user WHERE user_name=@uname AND password=@pwd"; using (MySqlCommand cmd = new MySqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@uname", txtUserName.Text.Trim()); cmd.Parameters.AddWithValue("@pwd", txtPassword.Text); conn.Open(); using (MySqlDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { MessageBox.Show("登录成功,欢迎 " + reader["user_name"].ToString()); } else { MessageBox.Show("用户名或密码错误"); } } } }这里用到了 using 块,保证连接和命令执行完自动释放,不写这层的话连接对象要等垃圾回收,长时间运行会积累占用。参数化写法是把用户输入作为参数传给 SQL,而不是直接拼进字符串,这是防注入的标准做法。如果原工程的登录代码是用字符串拼接的,建议直接替换成这段,后面第 5 章还会展开讲。
4. 运行环境避坑指南:连接器版本、认证插件与中文乱码
这一章是血泪经验汇总。下面五条坑,每一条都按「现象 → 原因 → 解决」的顺序写,你照着排查就行。第一条是问得最多的。
4.1 MySQL 8.0 配旧连接器报认证插件错误
现象:程序一执行登录就抛异常,错误信息里有Authentication plugin 'caching_sha2_password' cannot be loaded,或者干脆是连接初始化失败。
原因:MySQL 8.0 默认把 root 用户的认证插件改成了 caching_sha2_password,而 mysql-connector-net-6.9.6 只认识老版的 mysql_native_password。两代协议不兼容,连接器还没发握手包就被拒了。
解决:二选一。方案 A,换新连接器——去 MySQL 官网下载 mysql-connector-net 8.0.x,安装后在项目引用里删掉旧版 MySql.Data,重新添加新版。方案 B,不改连接器,把 root 认证方式改回老协议:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;如果 root 的 Host 是%,把'localhost'换成'%'。改完不需要重启 MySQL,重新运行程序就行。很多网上下载的课设源码运行报错都是这个原因,不是代码坏了,是环境版本代沟。
4.2 中文全变成问号或乱码
现象:数据库里字段值是正常的,但 WinForms 界面上显示「???」,或者反过来,界面正常、Navicat 里看是一串乱码。
原因:三层里只要有一层字符集不一致就乱——建库时没指定字符集、连接字符串没写 Charset=utf8、表字段类型是 latin1。最典型的是旧版 SQL 脚本建库语句没有带 DEFAULT CHARACTER SET utf8,MySQL 默认用了 latin1。
解决:统一成 utf8。检查 roomrentsystem.sql 开头的 CREATE DATABASE 语句,缺了字符集就删库重建,或者直接执行第 2 章给的那条带DEFAULT CHARACTER SET utf8的语句;然后确认 App.config 连接字符串里有Charset=utf8;。
注意:连接器 6.9.6 对 utf8mb4 的支持不完整,尽量用 utf8,不要为了存 emoji 把库改成 utf8mb4,否则老连接器可能在特殊字符处翻车。
4.3 双击 .sln 提示需要 Visual Studio 的某个版本
现象:双击 RoomRentSystem.sln,VS 弹窗提示「此项操作需要 Visual Studio 的某个版本」,或者直接报「不支持的格式」。
原因:.sln 文件头里的 Format Version 和当前 VS 不匹配。老的 WinForms 课设一般是 VS2010 到 VS2015 时代生成的,VS2022 打开旧项目时升级流程偶尔会卡住,如果项目目录里还存在损坏的 .suo 文件,问题会更明显。
解决:先把项目目录下的 .suo 文件删掉,它只是用户选项缓存,删了不影响代码编译。再用高版本 VS 打开 .sln,让 VS 自动升级。如果升级后窗体设计器布局变了,备份一份原始 sln 再升,防止改完不满意想回退却没得退。
4.4 DataGridView 数据出来后列宽和中文显示异常
现象:查询结果绑定到 DataGridView 后,列全部挤在左边,列头中文显示半个字,拖动表头还乱跑。
原因:GridView 的 AutoSizeColumnsMode 默认是 None,列宽保持设计器里的初始值,不根据内容自适应。
解决:在设计器里把 AutoSizeColumnsMode 改成 Fill,或者在加载完成后代码里设置:
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; dataGridView1.Columns["house_no"].FillWeight = 15; dataGridView1.Columns["rent_price"].FillWeight = 15;FillWeight 是列宽占比权重,数字越大占得越多。这个改动很小,但对演示观感提升最明显——老师打开界面看到的是整齐的表格,而不是一堆缩在左边的列。
4.5 连不上数据库:服务没启动或 3306 被占用
现象:程序抛MySqlException: Can't connect to MySQL Server on 'localhost',命令行下mysql -u root -p也进不去。
原因:MySQL 服务没启动,或者 3306 端口被另一个 MySQL 实例、MariaDB 占用。很多人电脑上以前装过某个集成环境,比如 phpStudy、XAMPP,里面自带 MySQL 还常驻了服务,和新装的 MySQL 抢端口。
解决:先到 Windows 服务管理器里看 MySQL 服务状态,没启动就手动启动。还在报错就查端口占用:
netstat -ano | findstr 3306记下最后一列的 PID,到任务管理器里看是什么进程。如果是残留的旧 MySQL,把新装 MySQL 的端口改成 3307,并把 App.config 里的 Port 一起改掉,比卸载重装快得多。重装是最后手段,不是第一选择。
5. 给课设加分的小改动:模糊查询、参数化 SQL 与报告素材
课设答辩的差距,往往不在系统大不大,而在几个小细节上。
5.1 一句话让查询代码从「会跑」到「能答」
原工程的房源查询多半是精确匹配,改成模糊查询只动几行代码:
private void txtKeyword_TextChanged(object sender, EventArgs e) { string keyword = txtKeyword.Text.Trim(); string sql = "SELECT house_id, house_no, building, area, rent_price, status FROM t_house " + "WHERE house_no LIKE @kw OR building LIKE @kw OR remark LIKE @kw"; using (MySqlConnection conn = new MySqlConnection(connStr)) using (MySqlCommand cmd = new MySqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@kw", "%" + keyword + "%"); MySqlDataAdapter adapter = new MySqlDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); dataGridView1.DataSource = dt; } }把用户输入作为@kw参数传进 LIKE,而不是拼接字符串,输入内容里就算带引号也不会破坏 SQL 结构。这里用%keyword%实现包含匹配,输入任何字都会实时过滤房源列表,演示效果比重新点一次查询自然得多。原来的拼接写法在答辩时只要被问一句「输入单引号会怎样」,答案基本就崩了。
5.2 报告里最容易被扣分的「系统测试」表格
很多学员的报告只有功能截图,没有测试数据,这一项被扣分最常见。补一张测试表,三行就能撑起整个章节:
| 功能模块 | 测试用例 | 预期结果 | 实测结果 | 是否通过 |
|---|---|---|---|---|
| 管理员登录 | 正确账号 / 错误密码 | 提示密码错误 | 提示密码错误 | 通过 |
| 房源模糊查询 | 输入关键词「A栋」 | 只显示 A 栋房源 | 只显示 A 栋房源 | 通过 |
| 合同录入 | 不选租客直接保存 | 提示选择租客 | 提示选择租客 | 通过 |
把实际操作的截图对应贴到每行后面,这一章就算完整了。
从那以后,我每次拿到一套课设源码,都强制自己先看 SQL 脚本再看 .sln,把连接器版本和端口参数写在便签上再动手,最后才编译。这套 C# 房屋租赁管理系统的完整资源——源码、课程设计报告、SQL 脚本、ER 图和数据流图都在原压缩包里,按这个顺序走一遍,从表结构到界面运行都不会有死角,希望帮到你。
本文还有配套的精品资源,点击获取