简介C# Windows窗体图书信息管理系统是一套基于WinForm与SQL Server三层架构的典型示例面向刚接触C#窗体开发和数据库操作的初学者通过图书信息管理场景完整演示增删查改操作。系统采用表示层、业务逻辑层、数据访问层及实体模型分层设计界面操作、业务处理、数据访问各司其职并给出数据库表结构生成脚本与详细使用说明配上SQL Server即可快速建库运行。整套资源共135个文件压缩包仅901KB其中包括44个C#源文件、13个动态链接库、3个可执行程序、9个资源文件与若干配置/说明文档演示视频链接亦包含在内可对照查看效果。目前已有3087人学习适合初步学习、课程设计或知识点拓展场景调试难度低既能帮助快速上手小型管理系统的完整流程也便于深入理解C#分层编码与数据库基本操作。1. 先别怕这到底是个什么东西很多刚学C#的同学都有同样的困惑语法书翻了大半本控制台程序也能跑几个可一听到“Windows窗体”“数据库”“管理系统”这几个词就发怵感觉像要去碰一块完全陌生的硬件。其实这套“C# Windows窗体图书信息管理系统含数据库”就是专门把这几样东西串起来给人练手的它以Windows窗体做操作界面用SQL Server存放图书和学生数据代码按三层架构拆开实现最常用的增删查改。说人话它不是让你去啃底层原理的《黑匣子》而是给你一个能跑起来的完整小系统。你动手点一点、改一改就能明白窗口程序到底是怎么和数据库配合的。它适合刚学完C#语法、要交课程设计、或者单纯想知道“真正的项目长什么样”的零基础新手。2. 为什么要学三层架构和数据库操作是新手的第一块跳板2.1 三层架构把代码分成三个抽屉先看解决方案里摆着的东西。打开这份资源你会看到几个以BSM开头的项目BSM窗体界面、BSM.BLL业务逻辑、BSM.DAL数据访问、BSM.Models实体模型。这一眼看上去有点密集其实道理很简单。我习惯用“小餐馆”来打比方。顾客在桌上点菜桌上那张点菜单就是Models实体模型上面只写“菜名、价格”这些东西纯粹负责描述数据长什么样。服务员把菜单递给后厨相当于UI界面层只管接收操作和展示结果不负责做菜。后厨拿到菜单后要按照厨房规矩决定先做什么这就是BLL业务层。厨房里的食材从哪来得让采购员去仓库拿这个和仓库打交道的人就是DAL数据访问层它才真正去数据库里取数据、改数据。哪一层出了变动其他层不需要跟着重写这就是拆分的价值。Models里通常就是几个普通的类。比如图书就是一个类里面写着书名、作者、编号这些属性namespace BSM.Models { public class BookInfo { public int BookID { get; set; } // 图书编号主键 public string BookName { get; set; } // 书名 public string Author { get; set; } // 作者 } }这段代码没有数据库操作纯粹是“数据模板”。你以后写任何系统第一步都是先想清楚系统里有哪几种东西每种东西有哪些字段然后写成一个类。至于这个类会被哪个窗口用、数据库里怎么存当前阶段都不用操心。再往下一层看DAL。DAL文件里写的才是大家印象里的“数据库操作”连接数据库、写SQL语句、把查出来的每一行数据变成一个个对象。BLL则夹在UI和DAL中间接收UI传来的参数判断一下参数合不合理再决定要不要交给DAL。UI层只做一件事把用户输入的文本收集起来交给BLL再把结果绑定到表格控件上。很多新手第一次看到这种分法会觉得“多此一举”一个功能绕三道弯。但请你设想一下如果所有代码都堆在窗体按钮的点击事件里窗体文件会越来越长今天加一个文本框、明天改一个查询条件要找一行代码得滚动好几屏改的时候又怕碰到别的功能。分层以后改SQL只去DAL找对应方法改界面只去窗体文件出错时错误信息也能直接告诉我们问题出在哪一段。这份资源正好拿完整的三层结构当例子你一边运行一边观察“我刚点的按钮到底调了哪个文件”比看干巴巴的架构图有用得多。2.2 增删查改几乎所有管理系统的通用动作接下来是这个系统最核心的功能增删查改。四个字的顺序不重要重要的是它们覆盖了绝大多数后台管理系统的全部操作。一个卖书的网站后台要管书一个班级管理系统要管学生一个仓库系统要管库存本质上都是对某一种对象做增、删、查、改区别只是界面长得不一样、字段不一样而已。数据库层面增删查改对应四句SQL。这份资源包里的图书信息管理模块核心动作就是这几类学生信息管理模块套路也完全一样。以一张最简单的图书表为例-- 查询找出书名里带 C# 的图书 SELECT * FROM BookInfo WHERE BookName LIKE %C#%; -- 新增往表里加一本书 INSERT INTO BookInfo(BookName, Author) VALUES(C#入门笔记, 某作者); -- 修改把编号为 1 的图书作者改掉 UPDATE BookInfo SET Author 新的作者 WHERE BookID 1; -- 删除把编号为 1 的图书移除 DELETE FROM BookInfo WHERE BookID 1;这四条语句里SELECT负责找数据后面带WHERE说明筛选条件LIKE %C#%是模糊匹配INSERT指明要往哪张表、哪几个字段里放值UPDATE后面先写要改哪个字段再写WHERE指定改哪一行DELETE则相对危险因为只要写错WHERE可能把符合条件的行全删掉。把这四句SQL放进三层架构里就变成了四个对应的函数DAL里有SelectBook、InsertBook、UpdateBook、DeleteBookBLL里做一下校验再往上抛UI里的按钮调用对应方法。你会发现整个系统折腾半天最后就是这四个动作换来换去。用它做入门项目能让你以最小成本把“程序操作数据库”这件事打通。2.3 学完这套系统你能收获什么对零基础的人来说我建议把它当作“第一个完整项目”来看待而不是追求读完所有代码。完整地跟完一遍你能得到三样东西。第一你能看懂一个C#项目是怎么组织的。以前你写的控制台程序只有一个Program.cs以后你再打开别人写的项目看到一堆文件夹不会慌能顺着UI→BLL→DAL→Models的路径理清楚了。第二你能把控制台里写的逻辑搬进界面。学语法时写的排序、判断、循环都是黑窗口里的输出现在它们变成了按钮里的代码。你会体会到算法逻辑没变只是输入从命令行变成了文本框输出从控制台变成了表格和标签。第三你能自信地去接下一个类似的小项目。比如某次课程设计要做“学生宿舍管理系统”“会议室预约系统”你会发现它们的骨架跟这个图书管理系统几乎一模一样区别只是表和界面。数据库连接、三层划分、增删查改的路子完全复制粘贴就能用。到那时你已经不是那个面对窗口程序发怵的新手了。3. 万事开头难搭建环境并把数据库还原出来3.1 软件准备Visual Studio 和 SQL Server 怎么装跑这套系统需要两样东西写代码的Visual Studio和存数据的SQL Server。Visual Studio装社区版就够了免费且功能完整。安装时在“工作负载”页面勾选“.NET 桌面开发”其他选项保持默认等它下载安装就行。如果你机器上已经装了VS但没有勾这个组件可以通过“工具→获取工具和功能”补装不需要重装整个软件。SQL Server这边新手最容易纠结装哪个版本。这里建议装SQL Server Express或Developer版安装过程一直点下一步选默认实例即可。Express版轻量、适合练习Developer版功能更全、也是免费的。两个版本对跑通这个项目都没有区别。装好之后还会附带一个图形化管理工具SSMSSQL Server Management Studio用来浏览数据库、执行SQL代码。后文“生成数据库”的每一步都在SSMS里操作。有个经验值得分享如果你只装了VS还没装SQL Server也不要卡在这里。先把VS打开找到解决方案资源管理器里的各个文件阅读代码也不受影响。数据库后面再补装因为数据库一旦装好跑通是几分钟的事。我第一次学的时候花了两天装各种全套服务结果发现根本没用到纯属浪费时间。3.2 生成数据库把表结构代码变成可用数据库这一步就是这个项目“含数据库”三个字的落点。资源包没有提供现成数据库文件而是给了一份表结构代码。原因很直接SQL Server的版本很多不同版本对数据库文件的兼容性不一样直接附加一个.mdf文件很可能因为你电脑上的版本不同而失败。而执行建表SQL是通用的任何版本都能识别。这个设计对新手非常友好你在自己机器上把SQL跑一遍数据库就生成好了不用纠结版本兼容的问题。具体步骤很简单。第一步打开SSMS服务器名称那栏默认填的是本机实例名比如“.\SQLEXPRESS”或计算机名称点“连接”进到主界面。第二步点工具栏上的“新建查询”会弹出一个空白编辑区。第三步把资源包里那份表结构代码整个复制粘贴进去。第四步点菜单栏的“执行”看到“命令已成功完成”之类的提示即可。最后在左侧“数据库”节点上右键刷新就能看到一个新数据库出现了。以后代码就是连到这个数据库上做操作的。包里的表结构代码长什么样大致是下面这种结构。注意不同表的字段会更多这里只是让你对格式有个预期IF DB_ID(BSM_DB) IS NULL BEGIN CREATE DATABASE BSM_DB; END GO USE BSM_DB; GO CREATE TABLE BookInfo ( BookID INT IDENTITY(1,1) PRIMARY KEY, BookName NVARCHAR(100) NOT NULL, Author NVARCHAR(50), PublishDate DATE );第一段先判断数据库是否存在不存在就创建避免你多次执行时报“数据库已存在”的错误。USE BSM_DB相当于告诉SQL Server“接下来都在这个库里建表”。CREATE TABLE是建表语句BookID是整数类型且IDENTITY(1,1)表示从1开始自动增长不用你自己填编号PRIMARY KEY表示它是主键每行唯一NVARCHAR存中文文本后面的数字是长度。把这些字段理解清楚后面在窗格里看到内容才知道每一列是从哪来的。3.3 打开项目整体看一遍代码结构数据库准备好之后回到VS双击解决方案文件后缀是.sln打开项目。第一次打开可能会花一点时间VS底下在还原项目依赖。等右下角的进度条消失左侧“解决方案资源管理器”里就会出现几个项目节点。你会看到BSM开头的几个项目。每个项目的含义用一句话就能说清BSM是窗体主项目放的是登录窗、主窗体这些界面文件BSM.BLL是业务逻辑层BSM.DAL是数据访问层BSM.Models是实体模型。如果某个项目旁边有小三角点开后能看到一堆.cs文件。先别急着逐行读我们只要做三件事。第一件事确认启动项目。在解决方案资源管理器里找到BSM最后不带后缀字母的那个项目右键选择“设为启动项目”。如果不做这一步按F5运行时就可能弹出黑窗口或者干脆报错。第二件事找到连接字符串。一般在UI项目的App.config文件里长成下面这样。这一行的作用就是告诉程序你要连哪台机器上的哪个数据库connectionStrings add nameBSMDB connectionStringServer.\SQLEXPRESS;DatabaseBSM_DB;Integrated SecurityTrue; / /connectionStrings第三件事把连接字符串里的Server部分和SSMS连接时的服务器名对照一下。你SSMS里能连上什么名字这里就该写什么名字两边不一样就是后面数据库连不上的根源。都改好之后按F5编译运行。如果一切顺利你会看到一个登录窗体弹出来这说明环境已经通了接下来就可以进入第一个例子。4. 第一个例子跑通图书信息的增删查改4.1 登录界面程序的入口按下F5如果不出意外你会先看到登录窗体。这是整个程序的入口也是最容易找到“程序到底在哪开始执行”的地方。新手第一反应通常是账号密码是多少一般这套系统里默认账号在代码里写死了我们去把它找出来。打开登录窗体对应的.cs文件一般叫LoginForm.cs或AdminLogin.cs找到按钮点击事件代码多半长这样private void btnLogin_Click(object sender, EventArgs e) { string userName txtUserName.Text.Trim(); string password txtPassword.Text.Trim(); if (userName admin password 123456) { MainForm mainForm new MainForm(); mainForm.Show(); this.Hide(); } else { MessageBox.Show(账号或密码错误); } }注意一个容易被忽略的细节Trim()方法把文本框里可能有的空格去掉。很多人登录失败就是因为手滑多打了一个空格而代码里没有做这个处理。然后if判断账号密码同时正确时创建主窗体对象并Show()出来同时用Hide()把登录窗隐藏如果密码输错了就弹窗提示。手动尝试几次看看不同分支的效果这比读一堆理论更能理解窗体程序设计的第一课。这里补充一句登录账号写在代码里并不是好习惯真实项目里都会放到数据库里验证。但作为入门练习先这样写死反而能让你把注意力集中在“窗体、按钮、事件”这件事上。等把这个系统跑通了你自然知道怎么把登录校验也挪到数据库里去第6章我会给你指这条路径。4.2 从界面到数据库一条查询是怎么走通的登录成功后进入主窗体你会看到表格控件DataGridView以及一排按钮查询、新增、修改、删除。先点一下“查询”表格里应该会显示出数据库里的数据。现在的问题是这一下点击代码是怎么从界面跑到数据库又跑回来的一个典型的三层调用路径是这样的。你在主窗体里填了关键词点“查询”窗体按钮事件把文本框内容取出来叫BLL对应方法处理。BLL再转手交给DALDAL执行SQL拿到结果之后变成对象列表原路返回给窗体窗体把它丢给DataGridView显示。每一层只做一件小事组合起来就是完整流程。代码层面长得像下面这样。UI层的按钮事件代码private void btnSearch_Click(object sender, EventArgs e) { string keyword txtKeyword.Text.Trim(); ListBookInfo books bookBLL.SearchBooks(keyword); dataGridView1.DataSource books; }BLL层的代码是中间转手public ListBookInfo SearchBooks(string keyword) { return bookDAL.SearchBooks(keyword); }DAL层的代码才是真正碰数据库的地方public ListBookInfo SearchBooks(string keyword) { string sql SELECT * FROM BookInfo WHERE BookName LIKE keyword; // 用SqlConnection连接数据库 // 用SqlCommand执行sql参数keyword的值是传来的keyword // 把查询结果一行行封装成BookInfo对象加入List返回 }注意DAL里SQL写的是WHERE BookName LIKE keywordkeyword是一个参数占位符后面执行时再把真正的关键词填进去。这样写可以避免把用户输入的文本直接拼到SQL字符串里防止SQL注入这个习惯值得你从一开始就养成。UI层不碰SQLDAL层不碰界面控件这就是分层的好处每层都能独立调试。4.3 动手改一条代码把按书名改成按作者光看代码还差一步动手改一次才踏实。我们来做一个最简单的改动把“查询”功能从按书名查找改成按作者查找。这个改动会经过UI、BLL、DAL三层正好让你体会改一处功能时到底要动哪些地方。第一步改UI层。在主窗体设计界面上找到查询文本框旁边的标签文字把“书名”改成“作者”。至于文本框和按钮的名字不一定要改因为它们只是内部名称对功能没有影响。改完之后运行一次你会发现查询结果和原来一样因为真正决定查询条件的SQL还没有变界面的显示文字只是“外包装”。第二步改DAL层。打开DAL里对应的查询方法把SQL语句里的WHERE BookName LIKE keyword改成WHERE Author LIKE keyword这一行才是核心。因为BookInfo表里本来就有Author字段所以其他代码都不需要动。第三步重新生成解决方案快捷键CtrlShiftB再按F5运行输入一个作者名试试表格里就会显示出该作者的书了。这次几十秒的改动会让你很有成就感你刚刚完成了一个跨三层的功能修改而且知道了改功能时“哪层才管业务字段、哪层只是传话”的真实分工。以后遇到“想改字段但找不到地方”的情况就按这条链路一层层追界面文字在窗体SQL字段在DAL中间BLL多半只是过一下手。这个排查思路比背架构图好用得多。5. 新手避坑最常见的几个翻车现场第4章的例子跑通之后你大概已经感受到这套系统的套路了。下面这几处几乎每个初学这个项目的人都会碰到我把现象、原因、解决思路按顺序写清楚你遇到时直接对照着查。5.1 数据库连不上连接字符串背了大部分锅现象按F5启动程序运行到需要读数据的地方弹出“无法连接数据库”或“用户登录失败”的报错程序直接卡住。原因要么SQL Server服务没启动要么连接字符串里的服务器名和数据库名跟本机对不上。初学者最容易踩的是后者。网上有五花八门的写法连不上也不清楚该信谁。解决先打开SSMS看看左上角显示的服务器名是什么然后用这个名字去替换连接字符串里的Server部分。数据库名要看你在哪个库上执行了建表SQL名字要对上。如果SSMS也连不上打开“运行”输入services.msc找到SQL Server开头的服务右键启动然后再回VS试一次。连接字符串放在App.config里改一次保存重启程序生效。如果你还是不确定连不通的环节在哪可以在代码里写一小段测试直接跨过UI层验证数据库using (SqlConnection conn new SqlConnection(connStr)) { conn.Open(); MessageBox.Show(连接成功); }connStr就是App.config里那个连接字符串。能弹出连接成功就说明数据库没问题问题多半出在SQL语法或表名拼写上。5.2 执行建表SQL时报错不是代码问题是执行姿势问题现象粘贴包里的SQL点“执行”结果报“数据库中已存在名为BookInfo的对象”或者“对象名BSM_DB无效”。原因前者是重复执行了两次建表语句造成的后者是没有切换到正确的数据库。大部分人是因为建库语句和建表语句混在一起直接全选执行结果执行顺序错乱。解决先看清代码开头的IF DB_ID判断有判断就放心点执行。如果报“已存在”可以只选从CREATE TABLE开始的部分执行前在SSMS工具栏的数据库下拉框里选中目标库再执行。多执行几次没关系表结构创建不成功会一直报错成功之后反而安静了。5.3 登录永远登不进去空格和大小写在作怪现象明明输入的账号密码看起来是对的但程序一直提示“账号或密码错误”。原因大多数情况下是账号或密码里带了空格或者大小写不一致而代码里的判断没有处理。还有一种容易忽略的情况是文本框里不小心切到了全角输入法输入的字符和代码里写死的半角字符长得一样但不是同一个字符。解决把登录按钮事件里的两个文本框都加上Trim()方法去掉首尾空格。如果资源里的代码本身没有Trim自己加上就行这属于允许的修改。实在找不出原因就在VS里给if那行按F9打个断点再把鼠标悬停在userName和password上把实际值复制出来对比一下问题一眼就能看出来。5.4 按F5出现黑窗口或者没有主窗体现象运行起来根本没有窗体只有黑底白字的控制台窗口或者一闪而过。原因启动项目选错了。解决方案资源管理器里有好几个项目VS默认启动的可能不是放窗体的那一个于是程序从控制台入口跑了。解决右键BSM主项目选择“设为启动项目”再按F5。如果项目列表里能看到Program.cs但没有窗体检查一下它在解决方案里的角色。这个错误在刚接触多项目解决方案时特别常见遇到先检查启动项目总没错。5.5 明明改了SQL查出来还是老数据现象DAL里把WHERE BookName改成了别的字段生成也成功了运行还是原样。原因两个可能。一是改了代码但没有重新“生成解决方案”跑的还是旧编译产物二是数据库里数据没变但页面没有手动刷新DataGridView不会自己重新查询。解决养成习惯改代码之后先CtrlShiftB生成一次看到“生成成功”再F5。如果改动的是SQL语句还要确认数据库本身那条记录的实际值。界面上的数据老样子先开SSMS去看一眼原表用两条简单的SELECT对比一下别急着怀疑代码没生效。6. 下一步学什么把图书系统带向更远的地方做到这一步你已经不只是“能跑起来”了而是拥有了一条解决问题的路径。接下来我建议做四个循序渐进的练习把学到的东西内化成自己的本领。第一个练习把登录校验从写死改成查数据库。新建一张管理员表DAL里写一条按账号查密码的方法BLL判断查出来的结果是否为空UI层再根据BLL的返回值决定放行还是弹窗。这个练习会逼你完整走一遍你已经熟悉的四层调用。第二个练习给新增功能加上必填校验。在UI层判断文本框为空就提示在BLL层再做一次校验体验“两层校验”各自的意义。第三个练习把图书查询改成模糊匹配加下拉筛选你会开始接触更复杂的SQL。第四个练习把表格里的数据导出成Excel或打印这能让你顺便了解C#操作Office文件的基本姿势。再往后学习路径建议是先把手写SqlConnection这套ADO.NET的东西吃透再去学Dapper和Entity Framework Core。原因很简单框架都是对这些基础操作的封装你见过底层的模样用框架时才知道它在替你做什么。界面技术方面WinForm学会后可以顺路看看WPF界面更现代但增删查改的三层思想完全通用。数据库层面把SQL Server基础命令过一遍掌握多表查询后再回来扩展这个系统也不迟。最后说一个我自己的习惯。我第一次学这个系统的时候第5章里的每一个坑几乎都踩了一遍尤其是“改了代码没反应”那种憋屈一度让我怀疑自己根本不适合编程。后来我给自己立了个规矩每次动手改代码前先CtrlShiftB生成一遍再改改完再生成最后才运行每次改完SQL先去数据库里看一眼原始数据。从那以后翻车的概率小了很多遇到问题也能快速定位到具体某一层。这套流程听起来笨但对零基础阶段非常有用。希望帮到你。本文还有配套的精品资源点击获取