简介:面向数据库课程设计的人事管理系统完整资料包,适合计算机专业学生及SQL Server、Java GUI初学者。资源以SQL Server数据库为核心,构建员工、部门、职位等表结构,并配套Java图形界面实现员工信息的增删改查与查询统计,有助于掌握关系型数据库在企业系统中的应用。压缩包共197个文件,包含Java源码、class文件、界面图片、依赖jar包、SQL建表脚本、Word实习报告及PPT演示稿等,解压后约18.06MB,目录结构清晰,便于按模块对照学习,方便不同阶段的读者快速定位所需内容。目前已有1403人学习、下载,经过大量用户验证。借助完整项目文件,可快速搭建数据库环境,理解Java GUI布局与事件处理逻辑,同时通过实习报告与答辩PPT梳理需求分析、数据库建模过程及常见排错思路,为独立完成课程设计或二次开发提供有力支撑。
1. SQL Server 数据库课程设计-人事管理系统:先别急着找源码,先看这门课想考你什么
如果你拿到的课设题目是“SQL Server数据库课程设计-人事管理系统”,先别急着搜整套源码。题目里的 Sever 是常见笔误,你实际要面对的是 SQL Server 引擎和人事管理这个经典业务场景。数据库课程设计考核的关键从来不是界面做得多漂亮,而是表结构设计是否合理、约束是否到位、查询和存储过程能不能写清楚、以及程序能不能稳定地连上数据库完成一次完整演示。人事管理系统恰好把这几个考点全占了:员工增删改查是对单表 CRUD 的考察,部门与员工是多表关联,薪资统计是聚合查询,登录功能是存储过程与权限控制。这篇按最稳妥的落地顺序走一遍,从需求拆表到建库脚本,再到能答辩的 T-SQL 和连接代码,最后把几个让现场翻车的坑提前排掉。适合第一次做课设的学生,也适合想快速搭一个内部人事 Demo 的从业者。
2. 从需求到建库:人事管理系统 7 张核心表的设计顺序与建表脚本
2.1 课程设计要交付的内容边界:哪些功能该做,哪些做了也白做
人事管理系统听起来包罗万象,真做起来最容易犯的毛病是照着一套商业版人事软件的菜单来,考勤、请假、绩效、招聘全塞进去,结果每张表都是空的,答辩时讲不清业务关系。给个参考边界:核心完成员工信息维护、部门管理、薪资记录查询、登录权限四个模块。这四个模块覆盖了数据库课程设计的必考技能点:单表增删改查、一对多关联、聚合统计、约束和存储过程。招聘流程、绩效评分、排班这类功能要么是第三方系统的事,要么数据建模复杂、演示价值低。
我一般会把考勤做成一张签到记录表,只记录上下班时间和异常标志,不做薪酬计算。请假也同理,只保留请假类型和起止日期。这样系统功能看起来完整,又不至于把课设做成一场小型 ERP。课程设计答辩时老师问得最多的永远是“这张表为什么这么设计”“删除部门时员工怎么办”,而不是“排班算法怎么实现”。把边界划清楚,等于先把最容易丢分的部分控制住。
2.2 从需求到表:人事系统的 7 张核心表与字段取舍
把上面划分的功能模块落到物理表,常见做法是建 7 张表。先列一张表清单:
| 表名 | 用途 | 核心字段 |
|---|---|---|
| dept | 部门信息 | dept_id, dept_name, remark |
| emp | 员工信息 | emp_id, name, gender, dept_id, hire_date, status |
| salary | 月度薪资 | emp_id, salary_month, base_salary, bonus |
| sys_user | 登录账号 | username, password_hash, emp_id |
| attendance | 考勤签到 | emp_id, work_date, in_time, out_time |
| position | 岗位字典 | position_id, position_name |
| leave | 请假记录 | leave_id, emp_id, leave_type, start_date, end_date |
字段上有两个选择值得说清楚。第一,员工表主键不要用自增 INT,要用 NVARCHAR(20) 存工号。人事系统从 Excel 导入员工数据时,工号经常带前导零,比如“00123”,用 INT 会直接把零丢掉,主键就错了。第二,薪资字段必须用 DECIMAL(10,2),别用 FLOAT。FLOAT 是浮点类型,统计工资时可能出现 0.30000000000000004 这种没法解释的输出,答辩现场很难看。
设计表的前后顺序有一个原则:先建被引用方,再建引用方。dept 被 emp 引用,先建;emp 被 salary 和 sys_user 引用,再建;salary 和 sys_user 放最后。部门负责人这个字段很容易踩坑:dept 表里如果要加 leader_id 引用 emp,而 emp 又引用 dept,就形成了循环引用,建表时怎么都建不上。常见做法是 dept 表先不设计 leader_id,等所有表建完后再用 ALTER TABLE 补上可空外键。
2.3 建表脚本:先建部门再建员工,外键这样设计才不会卡住
下面是一段可以直接在 SSMS 新建查询里执行的脚本,覆盖了 dept、emp、salary、sys_user 四张核心表。脚本用了可重复执行的写法,课设期间改表结构重跑不会报错。
USE master; GO IF DB_ID('HRMS_DB') IS NULL CREATE DATABASE HRMS_DB; GO USE HRMS_DB; GO CREATE TABLE dbo.dept ( dept_id INT IDENTITY(1,1) PRIMARY KEY, dept_name NVARCHAR(50) NOT NULL UNIQUE, remark NVARCHAR(200) NULL ); GO CREATE TABLE dbo.emp ( emp_id NVARCHAR(20) PRIMARY KEY, name NVARCHAR(50) NOT NULL, gender NCHAR(1) NOT NULL CHECK (gender IN (N'男', N'女')), birth_date DATE NULL, dept_id INT NOT NULL REFERENCES dbo.dept(dept_id), position NVARCHAR(50) NULL, hire_date DATE NOT NULL DEFAULT CAST(GETDATE() AS DATE), status TINYINT NOT NULL DEFAULT 1, phone NVARCHAR(20) NULL ); GO CREATE TABLE dbo.salary ( salary_id INT IDENTITY(1,1) PRIMARY KEY, emp_id NVARCHAR(20) NOT NULL REFERENCES dbo.emp(emp_id), salary_month CHAR(6) NOT NULL, base_salary DECIMAL(10,2) NOT NULL, bonus DECIMAL(10,2) NULL, CONSTRAINT uq_salary_emp_month UNIQUE (emp_id, salary_month) ); GO CREATE TABLE dbo.sys_user ( user_id INT IDENTITY(1,1) PRIMARY KEY, username NVARCHAR(50) NOT NULL UNIQUE, password_hash NVARCHAR(128) NOT NULL, emp_id NVARCHAR(20) NULL REFERENCES dbo.emp(emp_id) ); GO这段脚本的逻辑是按依赖顺序分四个批次执行。USE master 只是为了保证创建数据库时处于一个安全的上下文;IF DB_ID('HRMS_DB') IS NULL 是防御性写法,脚本重复执行时不会报“数据库已存在”。CREATE TABLE 的顺序严格从 dept 到 emp,再到 salary、sys_user,确保外键引用的对象在创建时已经存在。CHECK 约束限定性别只能取“男/女”,UNIQUE 约束保证同一员工同一月份只能有一条薪资记录,这是非常典型的业务规则落库。
参数上需要注意:emp_id 用 NVARCHAR(20) 而不用 INT,是为了容纳前导零工号;gender 用 NCHAR(1) 且加 N 前缀,中文比较才不会因排序规则出问题;base_salary 用 DECIMAL(10,2),整数部分最多 8 位、小数 2 位,工资一般不会超过这个范围;status 用 TINYINT 而不是 BIT,是为了以后扩展状态值,比如 0 离职、1 在职、2 停薪留职。sys_user 的 password_hash 预留 128 位,是为后面存哈希字符串留的空间。
3. 拿得出手的 T-SQL:登录校验、员工查询与薪资统计的存储过程和视图写法
3.1 三个必写查询:模糊搜索、多表 join 与分组统计
课程设计里查询是最容易得分也最容易失分的部分。三个必写的查询建议提前写好:员工模糊搜索体现 LIKE 与参数化,员工-部门联查体现 JOIN,部门薪资统计体现聚合函数与 GROUP BY。下面这段 SQL 直接覆盖这三种能力:
-- 1) 按姓名/工号模糊搜索员工 DECLARE @kw NVARCHAR(50) = N'张'; SELECT e.emp_id, e.name, d.dept_name, e.position, e.hire_date FROM dbo.emp AS e INNER JOIN dbo.dept AS d ON e.dept_id = d.dept_id WHERE e.name LIKE N'%' + @kw + N'%' OR e.emp_id LIKE @kw + N'%'; GO -- 2) 按部门统计平均工资 SELECT d.dept_name, COUNT(e.emp_id) AS emp_count, ROUND(AVG(s.base_salary + ISNULL(s.bonus, 0)), 2) AS avg_income FROM dbo.emp AS e INNER JOIN dbo.dept AS d ON e.dept_id = d.dept_id LEFT JOIN dbo.salary AS s ON e.emp_id = s.emp_id WHERE s.salary_month = '202506' GROUP BY d.dept_name ORDER BY avg_income DESC; GO第一个查询演示了参数化 LIKE。@kw 是变量,姓名和工号都走同一个条件,注意工号模糊匹配没有在右侧也加百分号,因为工号前缀匹配更符合实际使用习惯。第二个查询是重点:LEFT JOIN 保证即使某员工当月没薪资记录,统计部门人数时也不会被过滤掉;ISNULL(s.bonus, 0) 把奖金为空的情况按 0 处理,避免求和或平均时出现 NULL;ROUND(..., 2) 控制小数位数。GROUP BY 后面的部门名是业务维度,排序列用聚合结果 avg_income,这在 SQL Server 里允许直接引用别名。
3.2 登录校验存储过程:从拼 SQL 到参数化的分界线
很多课设在登录功能上直接在前端拼字符串查数据库,这是最容易被老师追问的地方。改用存储过程做登录校验,能把参数化和密码哈希一次讲清楚。
CREATE PROCEDURE dbo.usp_Login @username NVARCHAR(50), @password NVARCHAR(50) AS BEGIN SET NOCOUNT ON; DECLARE @pwd_hash NVARCHAR(128); SET @pwd_hash = CONVERT(NVARCHAR(128), HASHBYTES('SHA2_256', @password), 2); IF EXISTS (SELECT 1 FROM dbo.sys_user WHERE username = @username AND password_hash = @pwd_hash) SELECT 1 AS login_result, username FROM dbo.sys_user WHERE username = @username; ELSE SELECT 0 AS login_result, NULL AS username; END GO逻辑上这个存储过程先计算传入密码的 SHA2_256 哈希值,再与 sys_user 表里的 password_hash 比对,返回一个结果集给前端程序解析。HASHBYTES 返回的是 varbinary 类型,CONVERT(..., 2) 把它转成十六进制字符串,这样 password_hash 列里固定存 64 个字符,读写都稳定。用 EXISTS 判断而不是把整个用户记录 SELECT 出来,是为了避免把密码哈希暴露给应用层。前端拿到 login_result 为 1 就知道登录成功,为 0 就是账号或密码错误。
参数上注意 @username 和 @password 都用 NVARCHAR(50),避免类型或长度不匹配导致索引失效。这个存储过程比前端拼 SQL 的方式安全得多,也更好答辩:老师问“怎么防止 SQL 注入”,你只需要说“查询逻辑全部封装在存储过程里,前端不拼接 SQL 文本”。
3.3 一个“员工薪资总览”视图,把复杂查询封装成一张业务表
视图是数据库课程设计里性价比最高的对象。它能简化前端代码,也能体现你对“逻辑数据独立性”的理解。下面这个视图把员工、部门、薪资三张表拼成一张业务宽表:
CREATE VIEW dbo.v_emp_salary AS SELECT e.emp_id, e.name, d.dept_name, e.position, s.salary_month, s.base_salary, ISNULL(s.bonus, 0) AS bonus, s.base_salary + ISNULL(s.bonus, 0) AS total_income FROM dbo.emp AS e INNER JOIN dbo.dept AS d ON e.dept_id = d.dept_id LEFT JOIN dbo.salary AS s ON e.emp_id = s.emp_id; GO视图的意义在于把复杂 JOIN 封装成一张平坦表,前端程序只需要 SELECT * FROM dbo.v_emp_salary WHERE dept_name = '研发部',不需要关心底层有几张表。ISNULL(s.bonus, 0) 在视图中处理空值,total_income 列把基本工资和奖金合并,报表查询直接用这一列。注意视图里没有 ORDER BY,因为 SQL Server 对普通视图的排序有严格限制,排序交给查询视图的语句完成,这是符合规范的写法。
3.4 造测试数据:别在界面上一条条录入
课设演示时如果界面上只有三五条手工录入的数据,观感会差很多。用脚本批量插入,既省时间又显得专业。下面是一段最小测试数据脚本:
INSERT INTO dbo.dept (dept_name) VALUES (N'研发部'), (N'人事部'); GO INSERT INTO dbo.emp (emp_id, name, gender, dept_id, position, hire_date) VALUES (N'001', N'张工', N'男', 1, N'开发工程师', '2022-03-01'), (N'002', N'李工', N'女', 2, N'HR专员', '2023-07-15'); GO INSERT INTO dbo.salary (emp_id, salary_month, base_salary, bonus) VALUES (N'001', '202506', 12000.00, 1500.00); GO批量插入用 VALUES 多行列表,一次提交多条记录,比单条循环插入快得多。注意 emp 表插入时没有给 status 和 hire_date 指定值,status 走默认值 1,hire_date 如果没有显式给值会取当天日期。这里显式给了日期,是为了测试数据稳定,不会因为演示时间变化而影响结果。salary 表每行对应一个员工一个月份,如果要造多个月的数据,把月份换掉继续插即可。测试数据量建议至少每个部门 5 人,才能让分组统计和报表看起来有说服力。
4. 演示跑起来最关键一步:C# 连接 SQL Server 的字符串与三个连接参数
4.1 先确认能连:SSMS 都连不上时,别急着写代码
数据库开发里最玄幻的事就是“代码里看着没问题但连不上”。如果 SSMS 里都连不上本机数据库,那 C# 代码一定也连不上。所以连接层的第一步不是在 Visual Studio 里写代码,而是打开 SSMS 用 Windows 认证方式登录本机。登录成功后,在对象资源管理器里看左上角显示的“服务器名称”,例如“YOUR_PC\SQLEXPRESS”或“localhost”。这个字符串就是 C# 连接串里 Server 参数要填的东西。
很多同学不知道自己装的是默认实例还是命名实例。默认实例的连接写法是“.”或“localhost”,命名实例的写法是“计算机名\实例名”,LocalDB 的写法又不一样。SSMS 登录框里默认带出来的服务器名,就是你本机真实可用的名字。把这个名字抄下来,后续所有代码都用它。如果 SSMS 也连不上,先打开系统服务管理器检查 SQL Server 服务是否已启动,服务名一般是“SQL Server (SQLEXPRESS)”或“SQL Server (MSSQLSERVER)”,启动类型建议改成“自动”。
4.2 C# 连接串与最小查询代码:只读数据就够演示
课程设计的界面部分不一定非要上重型框架,一个 WinForms 或控制台程序能读能写就算达标。下面是一段最小的 C# 连接与查询代码,可以直接放进控制台项目里验证连通性:
string connStr = @"Server=YOUR_PC\SQLEXPRESS;Database=HRMS_DB;Integrated Security=True;TrustServerCertificate=True;"; using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); string sql = "SELECT e.emp_id, e.name, d.dept_name " + "FROM dbo.emp e JOIN dbo.dept d ON e.dept_id = d.dept_id"; using (SqlCommand cmd = new SqlCommand(sql, conn)) using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine($"{reader["emp_id"]} - {reader["name"]} - {reader["dept_name"]}"); } } }逻辑上这段代码做了三件事:用 SqlConnection 建立连接,用 SqlCommand 执行查询,用 SqlDataReader 逐行读取结果。using 语法保证连接和读取器在结束后自动释放,避免本地连接句柄泄露。查询语句里用了 JOIN 而不是 SELECT *,这样返回的列是明确的,前端展示也省事。
连接串里三个参数要重点解释。Server 必须与 SSMS 左上角显示完全一致,这是连接失败的第一大原因。Database=HRMS_DB 是库名,如果脚本里建库名改了这里也要改。Integrated Security=True 表示用当前 Windows 账号登录数据库,不需要在代码里写密码,这是本机演示最稳的方式。TrustServerCertificate=True 解决本地自签名证书导致的 SSL 报错,加了之后在开发机上基本不会出现证书相关异常。
4.3 三种连接方式怎么选:Windows 认证、SQL 认证、LocalDB 的区别
课程设计现场最怕的就是“在我电脑上明明好的,换台机器就不行”。连接方式的选型能提前规避一半风险。三种常见方式对比如下:
| 连接方式 | Server 写法示例 | 适合场景 | 主要坑 |
|---|---|---|---|
| Windows 认证 | Server=. | 本机演示、机房环境 | 换机器需要重新配置 Windows 用户权限 |
| SQL Server 身份验证 | Server=.;User ID=your_login;Password=**** | 需要跨机器或跨系统访问 | 数据库必须先开启混合认证模式 |
| LocalDB | Server=(localdb)\MSSQLLocalDB | 开发环境快速调试 | 服务按需启动,演示现场容易被策略或权限限制 |
我一般建议课设答辩优先用 Windows 认证,因为机房机器经常不允许你改 SQL Server 的认证模式,而 Windows 认证只要当前账号有权限就能登录。如果确实要用 SQL Server 身份验证,需要在 SSMS 里提前把服务器属性里的“SQL Server 和 Windows 身份验证模式”打开,否则连接串带用户名密码也报错。LocalDB 适合日常开发,但不在答辩现场用,它属于按需启动的实例,演示时杀毒软件或临时进程异常都可能让它起不来。
如果你用的是 Java 做前端,JDBC 连接串对应写法是 jdbc:sqlserver://localhost:1433;databaseName=HRMS_DB;encrypt=true;trustServerCertificate=true,1433 是 SQL Server 默认端口,本机演示一般不修改。连接参数的含义和 C# 基本一致,只是关键字略有不同。
5. SQL Server 人事管理系统避坑:5 个让课设翻车的数据库坑
5.1 建库脚本与数据阶段的坑:附加权限、重复执行、中文字符集
坑一:附加数据库报错“操作系统错误 5”。现象是双击 .mdf 文件无法附加,SSMS 提示无法打开物理文件。原因是 SQL Server 服务账号没有目标文件夹的读写权限,很多同学把数据库文件放在桌面、U盘或某个隐私目录,服务账号根本进不去。解决方法是把 .mdf 和 .ldf 文件移动到 SQL Server 默认的 Data 目录下,一般路径是 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA,或者用脚本 CREATE DATABASE 而不是附加文件。课程设计里尽量别用附加方式,用第 2 章的建库脚本最省心。
坑二:脚本重复执行报“数据库中已存在名为 X 的对象”。现象是第一次跑没事,第二次跑直接报错。原因是 CREATE TABLE 没有做对象存在性判断,重复执行时表已经存在。解决方法是把第 2 章脚本里 IF DB_ID 的防御性写法扩展到所有对象,或者开发阶段直接先 DROP TABLE 再 CREATE。这里提醒一下:如果表之间有外键约束,DROP 的顺序要从子表开始,先 DROP dbo.salary、dbo.sys_user,最后 DROP dbo.dept,否则外键会挡住删除。
坑三:插入中文变成“???”或乱码。现象是界面或查询结果里中文全部变成问号。原因有两层:列类型用了 VARCHAR 而没加 N 前缀,SQL Server 会按非 Unicode 处理,中文字符在部分排序规则下直接丢失;另一个原因是 SQL 脚本文件本身是 GBK 编码,SSMS 打开后中文已经坏了。解决方法是所有字符串列统一用 NVARCHAR/NCHAR,字符常量统一加 N 前缀,比如 N'研发部'。数据库排序规则建议在创建库时指定 Chinese_PRC_CI_AS,这样排序和比较都按中文习惯来。
5.2 连接和演示阶段的坑:实例名匹配、外键删除冲突、界面乱码
坑四:连接报“在建立与服务器的连接时出错”。现象是程序一跑就抛 SqlException,提示服务器找不到或无法访问。原因一般是三种:SQL Server 服务没启动、连接串 Server 名写错、本地防火墙挡了 1433 端口。解决方法是按顺序排查:先用 SSMS 试连,确认服务名;再检查服务管理器里 SQL Server 服务是否运行;最后看连接串 Server 是否和 SSMS 显示完全一致。课程设计现场最常见的就是把默认实例和命名实例搞混,代码里写 localhost 但实际安装的是 SQLEXPRESS,这种问题改成 Server=.\SQLEXPRESS 就通了。
坑五:删除部门时程序报外键约束冲突。现象是删除某个部门时,SQL Server 抛出“DELETE 语句与 REFERENCE 约束冲突”,并提示冲突对象是 emp 表。原因是该部门下还有在职员工,外键约束禁止你删掉被引用的部门。这是课设里最容易现场翻车的操作,也是老师最喜欢问的问题。解决方法是先处理员工再删部门:要么把该部门员工批量调整到其他部门,要么把这些员工标记为离职状态,让 emp 表里不再有记录引用这个部门。可以在前端把删除按钮做成两步操作,先显示该部门人数,提醒“请先调整员工部门”,这比硬删看起来专业得多。
如果演示现场真的连不上,按一个固定顺序救场:先开服务管理器确认 SQL Server 服务是运行状态,再核对连接串 Server 与 SSMS 实例名,最后检查防火墙入站规则是否放行 1433 端口。这三步走完,百分之八十的连接问题已经解决。剩下的可能性是数据库账号权限不足,重新用 Windows 认证方式试一次基本能定位。
6. 答辩前还能补的三个小动作:数据完整性、备份还原与数据字典
6.1 用约束替前端拦截脏数据
课程设计评分时,约束是最好的“设计证明”。在已有表上补几个 CHECK 约束和默认值,几分钟就能完成,效果却很明显。比如给 emp 表加一个约束,保证离职日期不早于入职日期;给 salary 表加约束,保证基本工资大于 0;给 attendance 表加约束,保证下班时间晚于上班时间。这些约束写在数据库里,比前端校验更让老师认可。可以这样加:
ALTER TABLE dbo.emp ADD CONSTRAINT ck_emp_status CHECK (status IN (0, 1, 2)); ALTER TABLE dbo.salary ADD CONSTRAINT ck_salary_base CHECK (base_salary > 0);顺手把默认值补上,比如新员工默认在职,新账号默认创建时间取当前时间,这样插入数据时代码更简洁,也不容易出现空值。
6.2 现场演示备份还原:一个文件足够
备份还原是数据库管理能力最直观的展示,也是很多课设忽略的加分项。在 SSMS 里右键数据库,任务中选择“备份”,生成一个 .bak 文件。答辩现场如果时间充裕,直接把备份文件展示出来,再执行一条还原语句,证明这个库可以被完整迁移:
BACKUP DATABASE HRMS_DB TO DISK = N'D:\backup\HRMS_DB.bak' WITH INIT; RESTORE DATABASE HRMS_DB FROM DISK = N'D:\backup\HRMS_DB.bak' WITH REPLACE;注意备份路径所在的文件夹要对 SQL Server 服务账号开放写权限,否则 BACKUP 命令会报权限错误。答辩前把备份文件提前放到 U盘或桌面一份,现场出问题还能用还原操作救场。
6.3 把数据字典导出成文档
最后一个值得花时间的小技巧是数据字典。很多同学写完表结构就忘了文档,答辩时被问到字段类型只能翻屏幕。用一条 INFORMATION_SCHEMA 查询,把核心表所有字段导出成表格,放到课设报告里,既完整又省事:
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME IN ('emp', 'dept', 'salary', 'sys_user') ORDER BY TABLE_NAME, ORDINAL_POSITION;这条查询返回的每一行对应一个字段,列名、类型、长度、是否为空、默认值都在里面,复制到 Word 或 Excel 稍作排版就是数据字典。答辩时老师如果问“你的 phone 字段为什么允许为空”,你直接说“员工电话可能未登记,允许 NULL 但业务层做了校验”,这就是设计意识。
我当年做课设时吃过一个亏:数据库文件放在桌面,答辩前换了个账号登录系统,结果整张库附加不上,现场一通折腾。从那以后我就养成了习惯,凡是课程设计或演示系统,建库脚本、测试数据、备份文件三样全部放进一个目录随身带。这个系统的建库脚本和查询代码都遵循同一逻辑,你把这些内容跑通之后,也可以按同样的方式整理自己的交付包。希望帮到你。
本文还有配套的精品资源,点击获取