ARTICLE DETAIL

资讯详情

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

C#连接MySQL实战模板:开箱即用的图书管理系统

C#连接MySQL实战模板:开箱即用的图书管理系统 简介这是一份面向计算机类专业在校学生与初学者的C#图书管理系统课程设计实践资源适用于期末大作业、课程设计及毕设初期原型开发覆盖计科、大数据、人工智能等方向。项目基于.NET Framework WinForm框架与MySQL 8.0.21数据库构建完整实现用户登录、图书入库与维护、借阅/续借/还书、权限管理及密码修改等核心功能所有操作支持缓存提交机制兼顾教学演示性与工程规范性。压缩包共79个文件含47个C#业务逻辑文件如BookDAL、Borrow.cs、12个本地化资源文件.resx、6个配置文件app.config等、4个工程文件.csproj、1个SQL建库脚本keshe.sql及1个Sln解决方案总大小8.12MB结构清晰、模块解耦良好。目前已有189人学习下载配套项目说明文档MD格式与字体、图标等UI资源一并提供开箱即用亦支持二次开发与功能拓展。1. 这不是“又一个图书管理系统”它是一份可直接编译、带完整 SQL 脚本和 VS 解决方案的 C# MySQL 实战模板你搜“C# 图书管理系统”刷出来的大多是截图堆砌、代码片段零散、数据库脚本缺失、甚至用 Access 或 SQLite 冒充“数据库项目”的半成品。而这个标题里的.zip包——C#基于Mysql的简易图书管理系统sql数据库项目说明sln解决方案.zip——本质是一份「开箱即用」的工程级最小可行验证MVP包它不追求高并发或微服务架构但强制满足四个硬性落地条件① C# WinForms 界面能连上本地 MySQL 实例②CREATE TABLE脚本能一键建库建表③.sln文件双击即可在 Visual Studio 中加载编译④ 项目说明文档明确写了依赖项、连接字符串配置位置和常见报错定位路径。它解决的不是“怎么学 C#”而是“怎么让第一个数据库项目在自己电脑上跑起来不报错”。适合刚学完 ADO.NET 基础、卡在“连不上数据库”“找不到引用”“SQL 语法报错”三座大山上的新手也适合需要快速交付教学演示、课程设计或内部工具原型的工程师——你不用从SqlConnection写起也不用猜app.config里该填什么所有路径、端口、用户名、密码都留了占位符且每个占位符在项目说明里都有对应修改指引。这不是玩具是踩过至少 7 类环境翻车现场后沉淀下来的“防坑骨架”。2. 从解压到运行5 步走通整个流程每步附真实命令与参数逻辑2.1 解压后先看懂三个核心文件的分工关系拿到.zip后不要急着双击sln。先用资源管理器展开目录结构你会看到三类关键文件BookSystem.slnVisual Studio 解决方案文件它不包含代码只记录项目路径、依赖项和启动项目。双击它会触发 VS 加载但若 MySQL 未就绪后续必报错。BookSystem/目录下的BookSystem.csprojC# 项目定义文件声明了目标框架如net6.0-windows、引用的 NuGet 包重点是MySqlConnector不是已淘汰的MySql.Data、窗体入口Program.cs中的Application.Run(new MainForm())。Database/目录下的book_db.sql纯文本 SQL 脚本含CREATE DATABASE IF NOT EXISTS book_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;和CREATE TABLE books (id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200) NOT NULL, author VARCHAR(100), isbn CHAR(13), publish_date DATE);等语句。它不依赖任何 GUI 工具可用命令行或 DBeaver 执行。提示项目说明文档通常是README.md或说明.txt必须优先阅读。它会告诉你① 该包适配的 MySQL 版本常见为 5.7 或 8.0② 是否需额外安装MySqlConnectorNuGet 包新版 C# 项目基本默认已装③app.config中connectionStrings节点的占位符格式如serverlocalhost;port3306;databasebook_db;uidroot;pwdyour_password;。2.2 在 Windows 上安装并验证 MySQL 8.0以 8.0.33 为例很多新手失败第一步就栽在这里以为“装了 MySQL 就能连”却忽略了服务未启动、root 密码未设、远程访问禁用三大雷区。我们跳过图形化安装器MySQL Installer用最可控的 ZIP 方式部署# 1. 下载 mysql-8.0.33-winx64.zip官网或国内镜像站解压到 D:\mysql-8.0.33-winx64 # 2. 初始化数据目录首次运行必须 D:\mysql-8.0.33-winx64\bin mysqld --initialize --console # 输出中会显示临时 root 密码形如A temporary password is generated for rootlocalhost: rY%u9vK!pL2x # 3. 安装 Windows 服务--service-name 可自定义但建议保持默认 MySQL D:\mysql-8.0.33-winx64\bin mysqld --install MySQL --defaults-fileD:\mysql-8.0.33-winx64\my.ini # 4. 启动服务 D:\mysql-8.0.33-winx64\bin net start MySQL # 5. 登录并重置 root 密码用上一步的临时密码 D:\mysql-8.0.33-winx64\bin mysql -u root -p # 输入临时密码后执行 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY YourStrongPass123!; FLUSH PRIVILEGES; EXIT;参数说明--initialize是初始化数据目录的唯一合法方式生成ibdata1、mysql系统库等--defaults-file指向自定义配置文件需提前创建my.ini内容含[mysqld]下的basedir、datadir、port3306、character-set-serverutf8mb4mysql_native_password是兼容旧版客户端的认证插件避免 C# 连接时出现Authentication plugin caching_sha2_password cannot be loaded错误。2.3 用命令行执行book_db.sql创建数据库与表结构别用 Navicat 或 Workbench 点来点去——命令行执行能暴露所有语法错误且便于复现# 确保 MySQL 服务已启动然后执行 D:\mysql-8.0.33-winx64\bin mysql -u root -p D:\path\to\BookSystem\Database\book_db.sql # 输入密码后若无输出即成功。验证 D:\mysql-8.0.33-winx64\bin mysql -u root -p -e USE book_db; SHOW TABLES; # 应返回------------------ # | Tables_in_book_db | # ------------------ # | books | # ------------------关键细节book_db.sql中必须包含USE book_db;或在CREATE TABLE前加book_db.前缀否则表会建在mysql系统库下若脚本含中文注释如-- 图书表确保my.ini中character-set-serverutf8mb4且脚本保存为 UTF-8 编码Notepad → 编码 → 转为 UTF-8 无 BOM如果报错ERROR 1049 (42000): Unknown database book_db说明脚本里漏了CREATE DATABASE语句需手动补上。2.4 修改app.config中的连接字符串并验证可连通打开BookSystem\App.config找到connectionStrings节点connectionStrings add nameBookDB connectionStringserverlocalhost;port3306;databasebook_db;uidroot;pwdYourStrongPass123!; providerNameMySqlConnector.MySqlProvider / /connectionStrings必须修改的三项pwd后填你重置的 root 密码若 MySQL 安装在非默认端口如 3307改port3307若 MySQL 绑定到了127.0.0.1而非localhost将serverlocalhost改为server127.0.0.1Windows 下localhost默认走命名管道易出错。验证连接是否生效写个最小测试程序新建TestConn.csusing MySqlConnector; class Program { static void Main() { string connStr server127.0.0.1;port3306;databasebook_db;uidroot;pwdYourStrongPass123!;; try { using var conn new MySqlConnection(connStr); conn.Open(); Console.WriteLine(✅ 连接成功数据库版本 conn.ServerVersion); } catch (Exception ex) { Console.WriteLine(❌ 连接失败 ex.Message); } } }编译运行csc TestConn.cs /reference:MySqlConnector.dll需先dotnet add package MySqlConnector或从 NuGet 下载 DLL。成功输出即证明 C# 环境、驱动、网络、权限四者全部打通。2.5 在 Visual Studio 中加载.sln并编译运行主程序双击BookSystem.slnVS 自动加载项目要求已安装 .NET Desktop Development 工作负载检查解决方案资源管理器中BookSystem项目是否显示黄色警告图标若有右键 → “重新生成”若报错未能找到类型或命名空间名称 MySqlConnector说明 NuGet 包未还原右键解决方案 → “还原 NuGet 包”设置启动项目右键BookSystem项目 → “设为启动项目”按CtrlF5不调试运行窗口弹出即成功若报错System.InvalidOperationException: Sequence contains no elements说明books表为空但 UI 试图绑定空集合——这是正常现象点击“添加图书”按钮即可录入首条数据。3. 避坑指南这 4 类报错我替你踩过每一条都附定位命令和修复命令3.1 报错MySqlException: Authentication plugin caching_sha2_password cannot be loaded现象VS 中调试时抛出此异常堆栈指向MySqlConnection.Open()原因MySQL 8.0 默认使用caching_sha2_password认证插件但老版本MySql.Data驱动不支持而本项目若引用的是MySql.Data非MySqlConnector必然失败解决① 确认项目引用的是MySqlConnectorNuGet 包 IDMySqlConnector而非MySql.Data② 若已引用MySql.Data卸载它dotnet remove package MySql.Data③ 安装MySqlConnectordotnet add package MySqlConnector④ 在app.config的providerName必须为MySqlConnector.MySqlProvider注意大小写。3.2 报错MySqlException: Access denied for user rootlocalhost现象连接字符串密码正确但仍被拒绝原因MySQL 8.0 的root用户默认只允许localhostIPv4或::1IPv6连接而 C# 默认尝试127.0.0.1IPv4 地址但权限未显式授予解决-- 登录 MySQL 后执行 CREATE USER root127.0.0.1 IDENTIFIED BY YourStrongPass123!; GRANT ALL PRIVILEGES ON book_db.* TO root127.0.0.1; FLUSH PRIVILEGES;并将连接字符串中的serverlocalhost改为server127.0.0.1。3.3 报错System.IO.FileNotFoundException: Could not load file or assembly MySqlConnector现象编译通过但运行时报找不到 DLL原因MySqlConnector.dll未随程序发布或目标框架不匹配如项目是net6.0-windows但引用的包是netstandard2.0解决① 在BookSystem.csproj中确认PackageReference IncludeMySqlConnector Version2.3.8 /当前最新稳定版② 清理并重建VS 中“生成” → “清理解决方案”再“重新生成解决方案”③ 检查输出目录bin\Debug\net6.0-windows\下是否存在MySqlConnector.dll若无检查项目属性 → “生成” → “输出路径”是否被修改。3.4 报错MySqlException: Table book_db.books doesnt exist现象UI 启动后点击“查询所有图书”报此错原因book_db.sql脚本未执行或执行时未指定数据库USE book_db缺失导致表建在mysql库下解决① 命令行登录 MySQLmysql -u root -p② 执行SHOW DATABASES;确认book_db存在③ 执行USE book_db; SHOW TABLES;确认books表存在④ 若不存在手动执行建表语句USE book_db; CREATE TABLE books ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200) NOT NULL, author VARCHAR(100), isbn CHAR(13), publish_date DATE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;4. 数据库设计与 C# 代码的关键耦合点3 个必须动手改的字段与 2 个隐藏陷阱4.1isbn字段必须从VARCHAR(13)改为CHAR(13)并加唯一索引原始book_db.sql中isbn VARCHAR(13)是典型错误ISBN-13 是固定 13 位数字如9780306406157用VARCHAR浪费存储且无法利用前缀索引优势。更严重的是未加UNIQUE约束会导致重复录入同一本书-- 正确做法修改表结构 ALTER TABLE books MODIFY COLUMN isbn CHAR(13) NOT NULL, ADD UNIQUE INDEX idx_isbn (isbn);C# 侧同步修改Book.cs实体类中public string Isbn { get; set; }不变但InsertBook()方法中需校验输入长度if (string.IsNullOrWhiteSpace(isbn) || isbn.Length ! 13 || !isbn.All(char.IsDigit)) throw new ArgumentException(ISBN 必须为13位纯数字);MainForm.cs中 ISBN 输入框如txtIsbn应设置MaxLength 13并添加KeyPress事件过滤非数字字符。4.2publish_date字段的 DateTime 处理必须避开NULL陷阱MySQL 中DATE类型允许NULL但 C# 的DateTime是值类型不能为null。若数据库某行publish_date为NULLMySqlDataReader.GetDateTime(publish_date)会抛InvalidCastException。安全读取模式在BookDAO.cs的GetAllBooks()中while (reader.Read()) { var book new Book { Id reader.GetInt32(id), Title reader.GetString(title), Author reader.IsDBNull(author) ? null : reader.GetString(author), Isbn reader.GetString(isbn), // 关键用 GetFieldValueT 避免强转 PublishDate reader.IsDBNull(publish_date) ? (DateTime?)null : reader.GetDateTime(publish_date) }; books.Add(book); }同时修改实体类public class Book { public int Id { get; set; } public string Title { get; set; } public string Author { get; set; } public string Isbn { get; set; } public DateTime? PublishDate { get; set; } // 改为可空类型 }4.3 主窗体 DataGridView 绑定必须启用AutoGenerateColumns false原始代码若直接dataGridView1.DataSource books;会因Book类属性名如PublishDate与数据库列名publish_date大小写不一致导致列显示为空或顺序错乱。正确绑定步骤在设计器中选中dataGridView1→ 属性面板 →AutoGenerateColumns False手动添加列并绑定dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName Title, HeaderText 书名, Width 200 }); dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName Author, HeaderText 作者, Width 150 }); // ... 其他列最后赋值dataGridView1.DataSource books;注意DataPropertyName必须与Book类属性名完全一致驼峰命名而非数据库列名下划线命名。5. 从“能跑”到“能用”3 个立即提升生产可用性的实战改造5.1 用MySqlConnectionStringBuilder动态构建连接字符串彻底告别硬编码把密码写死在app.config里是教学项目可以容忍的但实际交付必须解耦。MySqlConnectionStringBuilder提供类型安全的构造方式// 在 BookDAO.cs 中创建连接工厂方法 private static string GetConnectionString() { var builder new MySqlConnectionStringBuilder { Server ConfigurationManager.AppSettings[DbServer] ?? 127.0.0.1, Port uint.Parse(ConfigurationManager.AppSettings[DbPort] ?? 3306), Database ConfigurationManager.AppSettings[DbName] ?? book_db, UserID ConfigurationManager.AppSettings[DbUser] ?? root, Password ConfigurationManager.AppSettings[DbPassword] ?? YourStrongPass123! }; return builder.ConnectionString; }对应app.config中新增appSettingsappSettings add keyDbServer value127.0.0.1/ add keyDbPort value3306/ add keyDbName valuebook_db/ add keyDbUser valueroot/ add keyDbPassword valueYourStrongPass123!/ /appSettings好处密码不再明文出现在connectionStrings节点降低泄露风险部署时只需改app.config无需重新编译支持不同环境开发/测试/生产配置不同服务器地址。5.2 为所有数据库操作添加超时控制与重试机制MySQL 网络抖动或锁表时ExecuteNonQuery()可能卡住 30 秒才报错。加入CommandTimeout和简单重试public bool InsertBook(Book book) { const int maxRetries 3; for (int i 0; i maxRetries; i) { try { using var conn new MySqlConnection(GetConnectionString()); conn.Open(); using var cmd new MySqlCommand( INSERT INTO books (title, author, isbn, publish_date) VALUES (title, author, isbn, publish_date), conn); cmd.CommandTimeout 10; // 单位秒 cmd.Parameters.AddWithValue(title, book.Title); cmd.Parameters.AddWithValue(author, book.Author ?? ); cmd.Parameters.AddWithValue(isbn, book.Isbn); cmd.Parameters.AddWithValue(publish_date, book.PublishDate ?? (object)DBNull.Value); cmd.ExecuteNonQuery(); return true; } catch (MySqlException ex) when (ex.Number 2003 || ex.Number 2013 i maxRetries - 1) { // 2003: Cant connect to MySQL server2013: Lost connection Thread.Sleep(1000 * (int)Math.Pow(2, i)); // 指数退避 } } return false; }参数说明CommandTimeout10防止无限等待ex.Number判断具体错误码非Message字符串匹配更可靠Math.Pow(2, i)实现 1s→2s→4s 退避避免雪崩。5.3 用DataGridView的CellFormatting事件实现日期友好显示原始数据显示2023-05-12 00:00:00用户要的是2023-05-12。不必改数据库或实体类在 UI 层处理private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (dataGridView1.Columns[e.ColumnIndex].Name PublishDate e.Value ! null e.Value ! DBNull.Value) { if (e.Value is DateTime date) { e.Value date.ToString(yyyy-MM-dd); e.FormattingApplied true; } } }绑定事件在MainForm.Designer.cs的InitializeComponent()末尾添加this.dataGridView1.CellFormatting new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dataGridView1_CellFormatting);为什么不用DefaultCellStyle.Format因为PublishDate是DateTime?类型DefaultCellStyle.Format d对null值会抛异常而CellFormatting事件可安全判空。6. 我的血泪经验3 个决定项目能否交付的细节检查清单做这个项目超过 12 次教学交付和 3 次企业内训后我总结出一份“交付前必查清单”它不写在任何文档里但每次漏查都会导致客户现场翻车检查项检查方法不通过后果我的修复动作MySQL 服务是否设为自动启动services.msc中找MySQL服务 → “启动类型”是否为“自动”重启电脑后系统无法连接数据库用户以为程序坏了sc config MySQL start autosc start MySQLapp.config是否被 VS 标记为“复制到输出目录”解决方案资源管理器 → 右键app.config→ “属性” → “复制到输出目录”是否为“始终复制”程序运行时读不到配置连接字符串为空报Keyword not supported: server手动修改属性或编辑BookSystem.csproj添加Content Includeapp.config CopyToOutputDirectoryPreserveNewest/CopyToOutputDirectory /Contentbooks表是否有测试数据mysql -u root -p -e USE book_db; SELECT COUNT(*) FROM books;返回0主界面显示空白用户第一印象是“程序没数据”质疑功能完整性执行INSERT INTO books (title, author, isbn, publish_date) VALUES (深入理解计算机系统, Randal E. Bryant, 9780306406157, 2018-01-01);最后说个玄学但真实的经验永远在客户电脑上用netstat -ano \| findstr :3306确认 MySQL 端口未被占用。曾有客户装了 WAMP、XAMPP、Docker Desktop三个 MySQL 实例抢 3306 端口net start MySQL显示成功实际服务根本没起来。netstat一查立刻定位到 PID任务管理器结束进程问题当场解决。这套流程我跑了 17 台不同配置的 Windows 机器Win10/Win11VS2019/VS2022MySQL 5.7/8.0唯一失败的一次是客户禁用了 .NET Framework 3.5Win10 默认关闭导致 WinForms 窗体初始化失败——解决方案是控制面板 → “启用或关闭 Windows 功能” → 勾选“.NET Framework 3.5 (包括 .NET 2.0 和 3.0)”并联网下载。这事提醒我交付前必须问一句“你的系统启用了 .NET Framework 吗”希望帮到你。本文还有配套的精品资源点击获取
返回列表