
简介一份适合Access课程实验与期末复习的《数据库及其应用》实验报告面向高校数据库初学者及备考学生覆盖从数据库设计到查询、数据交换的完整实操链条。文档以“教学管理”系统为例详细展示了E-R模型构建、关系模型转换以及学生、专业、学院、课程、成绩等表的创建过程包含主键设置、参照完整性、字段显示格式、输入掩码与查阅控件等完整性约束配置方法查询与SQL部分归纳了SELECT、INSERT、UPDATE、DELETE及参数查询、动作查询的核心用法并说明参数查询在运行时提示输入条件的交互方式。数据交换部分则梳理了Access与文本文件、Excel之间导入导出的操作路径以及链接与导入两种外部数据使用方法的区别。压缩包共1个文件类型为doc文档大小约1.45MB内容结构清晰适合对照Access 2003/2010等环境逐步练习。目前已有111人学习下载对于正在完成数据库作业或准备上机考试的同学可借助每一步的操作说明与字段设置示例快速验证操作结果理解数据库设计从概念模型到物理实现的全过程。1. 数据库作业.doc 是什么先看清作业要求再动手很多人在拿到“数据库作业数据库作业.doc”这类文件名时第一反应是头疼——文件名带着.doc后缀内容却可能是一份数据库课程设计、实验报告、建库脚本说明甚至只是老师随手存的一个任务清单。我处理过不少这类文件坦白说它通常不是一份需要“读”的文档而是一份需要“交”的作业。核心诉求永远是那几个建一个数据库、写几个增删改查、跑通一个前端页面最后把过程写进 Word 里交上去。这篇笔记就是给你一条从零到交付的路径覆盖选型、建表、CRUD、文档排版和验收避坑适合正在做数据库课程设计、期末大作业或者被临时塞了一个“数据库作业.doc”的从业者。2. 环境选型与建库准备Access、SQLite 还是 SQL Server2.1 先判断作业要求单机版还是服务器版拿到“数据库作业数据库作业.doc”先别急着装软件。翻一下文档里有没有出现“C/S 结构”“B/S 结构”“连接字符串”“ODBC”这些词。如果只要求“做一个学生管理系统”那单机数据库完全够用如果要求“多人同时访问”“远程连接”那必须上服务器版数据库。常见的课程设计配置是SQL Server C# 或 Java或者 MySQL Python。因为这个文档本身是.doc大概率是文科系或经管类专业的选修课作业对并发和性能要求不高我更推荐 SQLite 或 Access——零配置、单文件、交作业方便。但如果老师点名要求“数据库管理系统必须为 SQL Server 或 MySQL”那就老老实实装别用 SQLite 糊弄。2.2 SQLite 的最小建库方案三个文件搞定SQLite 是最适合“数据库作业.doc”这类场景的。不需要安装服务不需要配置账号密码一个.db文件就是整个数据库。我用 Python 内置的sqlite3模块就能完成建库、建表、插入、查询全部操作。import sqlite3 import os db_path student_management.db # 如果文件不存在sqlite3.connect 会自动创建 conn sqlite3.connect(db_path) cursor conn.cursor() cursor.execute( CREATE TABLE IF NOT EXISTS student ( id INTEGER PRIMARY KEY AUTOINCREMENT, student_no TEXT NOT NULL UNIQUE, name TEXT NOT NULL, gender TEXT DEFAULT 男, age INTEGER CHECK(age 0 AND age 60), class_name TEXT, enroll_date DATE DEFAULT CURRENT_DATE ) ) conn.commit() # 插入三条测试数据 test_data [ (2024001, 张伟, 男, 20, 计算机2401), (2024002, 李娜, 女, 19, 计算机2401), (2024003, 王强, 男, 21, 软件2402), ] cursor.executemany( INSERT INTO student (student_no, name, gender, age, class_name) VALUES (?, ?, ?, ?, ?), test_data ) conn.commit() print(数据库创建成功表结构如下) for row in cursor.execute(PRAGMA table_info(student)): print(row) conn.close()这段代码的关键点在于sqlite3.connect如果传入的文件路径不存在会自动创建新文件所以这个脚本本身就是“建库 建表 初始化数据”三合一。用PRAGMA table_info可以查看表结构在写入作业文档时可以直接复制输出结果。executemany比循环执行execute快得多而且能避免重复提交事务的开销。2.3 如果老师要求 MySQL连接池与编码的坑很多学校指定 MySQL那你就绕不开Navicat或命令行建库。MySQL 跟 SQLite 最大的差别是有用户权限体系、有端口监听、有字符集设置。我第一次用 Python 连 MySQL 写作业时卡在中文乱码上整整一个下午——建库时没指定utf8mb4插入的数据全是问号。CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE student_db; CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL UNIQUE, name VARCHAR(50) NOT NULL, gender ENUM(男, 女) DEFAULT 男, age INT CHECK (age 0 AND age 60) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;建库语句里的CHARACTER SET utf8mb4是重点MySQL 8.0 默认字符集已经是utf8mb4但 5.7 及以下版本默认是latin1你不指定的话插入中文必乱码。ENGINEInnoDB也要写上这是为了后面演示事务和死锁时用得上。MySQL 的连接池参数一般写在代码里比如 Java 的 Druid 或 Python 的 SQLAlchemy但课程设计阶段不需要真的配连接池——直接pymysql.connect就够了。2.4 选型决策表照着选不纠结场景推荐方案理由代价纯交作业老师只看文档SQLite Python零配置、单文件、五分钟跑通不适合演示“并发”老师要求 MySQL / SQL ServerMySQL Navicat市场主流演示截图好看需要安装服务、处理权限C/S 结构课程设计SQL Server C#配合 Visual Studio 的向导最顺体积大、配置多B/S 结构课程设计MySQL Java Spring Boot前后端分离好写文档学习成本最高我个人建议能选 SQLite 就选 SQLite。数据库作业的核心是“表设计是否合理、SQL 是否写对、文档是否完整”不是“你用的是什么数据库”。把省下来的时间花在 E-R 图和关系模式上得分反而更高。3. 数据库增删改查的最小实现从建表到跑通3.1 增删改查是作业的骨架别在这省事“数据库作业数据库作业.doc”这份文档里老师最看重的一定是数据操作的部分。增删改查四件事看起来简单但很多人栽在细节上插入时没处理重复数据、删除时没带WHERE条件导致全表清空、更新时没加事务导致数据不一致。我用下面这套代码把四个操作全部覆盖注释里标出了每个操作对应作业文档里的哪个章节你可以直接照搬结构。import sqlite3 from contextlib import contextmanager db_path student_management.db contextmanager def get_conn(): conn sqlite3.connect(db_path) conn.row_factory sqlite3.Row # 让查询结果可以用列名访问 try: yield conn conn.commit() except Exception: conn.rollback() raise finally: conn.close() # 增插入新学生 def add_student(student_no, name, gender, age, class_name): with get_conn() as conn: cursor conn.execute( INSERT INTO student (student_no, name, gender, age, class_name) VALUES (?, ?, ?, ?, ?), (student_no, name, gender, age, class_name) ) return cursor.lastrowid # 删按学号删除 def delete_student(student_no): with get_conn() as conn: cursor conn.execute(DELETE FROM student WHERE student_no ?, (student_no,)) return cursor.rowcount # 返回受影响行数 # 改更新学生信息 def update_student(student_no, nameNone, genderNone, ageNone, class_nameNone): set_clause [] values [] if name: set_clause.append(name ?) values.append(name) if gender: set_clause.append(gender ?) values.append(gender) if age: set_clause.append(age ?) values.append(age) if class_name: set_clause.append(class_name ?) values.append(class_name) values.append(student_no) with get_conn() as conn: cursor conn.execute( fUPDATE student SET {, .join(set_clause)} WHERE student_no ?, values ) return cursor.rowcount # 查支持模糊查询 def query_student(keywordNone): with get_conn() as conn: if keyword: cursor conn.execute( SELECT id, student_no, name, gender, age, class_name FROM student WHERE name LIKE ? OR student_no LIKE ?, (f%{keyword}%, f%{keyword}%) ) else: cursor conn.execute(SELECT id, student_no, name, gender, age, class_name FROM student) return [dict(row) for row in cursor.fetchall()] # 自测 if __name__ __main__: new_id add_student(2024004, 赵敏, 女, 22, 信息2401) print(f新增成功自增ID为 {new_id}) print(query_student(赵)) delete_student(2024004) print(query_student())这段代码用了一个contextmanager装饰器把“连接、提交、回滚、关闭”封装成了上下文管理器这是作业里能写进“设计亮点”的部分。四个函数分别对应增删改查返回值分别是lastrowid自增主键、rowcount受影响行数这些值打印出来可以直接截图放进 Word 里当验证证据。模糊查询的%通配符是必考知识点一定要在文档里解释清楚。3.2 事务与并发为什么你的作业里必须有一段事务代码老师看到你用了事务基本就会认定你理解了数据库的核心机制。哪怕只是模拟一个“转账”或者“选课”的操作把事务写出来文档的深度立刻提升一个档次。这里我给一个选课场景的事务示例同时演示了悲观锁的用法。import sqlite3 import threading import time # 选课表模拟course_student # CREATE TABLE course_student ( # id INTEGER PRIMARY KEY AUTOINCREMENT, # course_id INTEGER NOT NULL, # student_no TEXT NOT NULL, # UNIQUE(course_id, student_no) # ) def select_course(course_id, student_no): conn sqlite3.connect(student_management.db, timeout10) conn.execute(BEGIN IMMEDIATE) # 获取写锁 try: # 检查是否已选过 existing conn.execute( SELECT id FROM course_student WHERE course_id ? AND student_no ?, (course_id, student_no) ).fetchone() if existing: raise ValueError(重复选课) # 检查课程容量 count conn.execute( SELECT COUNT(*) FROM course_student WHERE course_id ?, (course_id,) ).fetchone()[0] if count 30: raise ValueError(课程已满) conn.execute( INSERT INTO course_student (course_id, student_no) VALUES (?, ?), (course_id, student_no) ) conn.commit() return True except Exception as e: conn.rollback() raise finally: conn.close() # 模拟并发选课 threads [] for i in range(5): t threading.Thread(targetselect_course, args(1, f20240{i:02d})) threads.append(t) for t in threads: t.start() for t in threads: t.join()BEGIN IMMEDIATE是 SQLite 里获取写锁的语法换成 MySQL 就是SELECT ... FOR UPDATE。这段代码展示了两个经典问题重复插入怎么防UNIQUE约束 事务内检查、超容量怎么防先查后插。在作业文档里写“本项目支持并发选课通过事务和唯一约束防止重复选课”比写一百行 CRUD 都有说服力。3.3 必调参数SQLite 的 journal 模式和 busy_timeoutSQLite 有两个隐藏参数调了之后能减少大量莫名的报错。一个是在connect时加timeout10另一个是设置PRAGMA journal_modeWAL。这两个参数在作业里可能用不到但如果你要用 SQLite 演示并发不设置的话很容易出现“database is locked”的错误。conn sqlite3.connect(student_management.db, timeout10) conn.execute(PRAGMA journal_modeWAL) conn.execute(PRAGMA synchronousNORMAL)journal_modeWAL把写入操作从“直接改主数据库文件”改成“先写日志文件”这样读写可以并行避免锁冲突。synchronousNORMAL则降低 fsync 频率提高写入速度代价是断电时可能丢失最近几笔事务——这在作业场景里完全可接受。把这两个参数写进文档的“性能优化”章节既是知识点又是加分项。4. 把数据库增删改查写进 doc文档结构与演示截图4.1 doc 文档的黄金结构一页目录让老师知道你没跑题“数据库作业数据库作业.doc”这个文件名直接暴露了一个信息这是用 Word 写的作业交付件大概率老师要求的是“打印版”或“电子版”文档。作业文档的排版跟技术博客完全不同它需要的是“确定性”——让老师一眼看到你做了哪些功能、截图证据在哪、代码是完整可跑的。我给一个经过多次验证的模板结构照着填充就能用章节内容要求页数建议1 绪论项目背景、开发环境、工具版本1-2 页2 需求分析与概念结构设计E-R 图、数据字典3-5 页3 逻辑结构设计关系模式、建表 SQL、表结构截图3-4 页4 功能实现增删改查代码片段 运行截图5-8 页5 总结遇到的问题、解决方案、收获1 页最关键的是第 4 章。每写一个功能必须配三样东西代码片段、运行前截图、运行后截图。比如你写“新增学生”就要放add_student函数的代码然后放“输入学号 2024004”的截图再放“查询结果出现 2024004”的截图。老师不可能逐行读你的代码但他一定看截图。4.2 Excel 导入数据与 Navicat 导出脚本作业演示的加速技巧很多人的作业数据是手动一条条插进去的既慢又容易错。更聪明的做法是先用 Excel 整理好测试数据再用 Navicat 或 Python 批量导入。这个操作本身也可以作为文档里的一个“功能亮点”来写你的系统支持从 Excel 批量导入学生数据。下面是用 Python 读取 Excel 并写入 SQLite 的代码。import sqlite3 import pandas as pd # 读取Excel文件 df pd.read_excel(student_data.xlsx, sheet_name学生信息) print(读取到 %d 条记录 % len(df)) conn sqlite3.connect(student_management.db) cursor conn.cursor() # 按行写入数据库 inserted 0 for idx, row in df.iterrows(): try: cursor.execute( INSERT INTO student (student_no, name, gender, age, class_name) VALUES (?, ?, ?, ?, ?), (row[学号], row[姓名], row[性别], int(row[年龄]), row[班级]) ) inserted 1 except sqlite3.IntegrityError as e: print(f第 {idx2} 行插入失败{e}学号可能重复) conn.commit() conn.close() print(f成功导入 {inserted} 条跳过 {len(df) - inserted} 条)这段代码的亮点在IntegrityError的捕获。UNIQUE约束触发的重复学号插不进去你打印一行跳过记录继续跑不会因为一条脏数据中断整个导入。在文档里写“本系统支持 Excel 批量导入具备容错机制”又踩中一个加分点。4.3 数据库同步与备份作业里的隐藏加分项“数据库同步”这个概念如果你能写进去作业的完整度直接高一个档次。哪怕只是做“导出 SQL 脚本”和“数据库文件备份”两个按钮也值得写进系统功能里。你可以提供一个 Python 脚本一键导出当前数据库的全部建表和插入语句生成一个.sql文件这在学校机房演示时是救命稻草——电脑蓝屏了、数据库文件坏了有这个脚本就能马上重建。import sqlite3 def export_sql(db_path, sql_path): conn sqlite3.connect(db_path) with open(sql_path, w, encodingutf-8) as f: for line in conn.iterdump(): f.write(line \n) print(f已导出到 {sql_path}) if __name__ __main__: export_sql(student_management.db, backup_20250101.sql)iterdump()是 SQLite 自带的导出方法生成的 SQL 文件可以用source命令在 sqlite3 命令行里直接重建整个数据库。把这段代码放进“系统设计”章节标注“支持数据库同步导出与故障恢复”就是答辩时能讲半分钟的真东西。5. 避坑数据库课程设计最常见的 5 个翻车点5.1 翻车点一连接字符串写成绝对路径现象在你自己电脑上运行正常的程序拷贝到老师电脑上打开就报“数据库文件不存在”。原因你在代码里写了类似conn sqlite3.connect(C:/Users/你的名字/Desktop/student_management.db)的绝对路径换一台电脑路径就失效了。解决用相对路径或者根据程序所在位置动态拼接路径。Python 里可以用os.path.join(os.path.dirname(__file__), student_management.db)。这是最容易踩、也最容易被扣分的点。5.2 翻车点二忘了处理空结果现象查询一个不存在的学号程序直接崩溃。原因fetchone()返回的是None你直接拿它做row[name]肯定报TypeError。解决每次查询后先判断是否为空再决定后续操作。在文档里写上“本系统对空查询结果做了防御性处理”这个细节老师一眼就能看到。5.3 翻车点三中文乱码的玄学问题现象SQLite 里中文显示正常但导出到.sql文件后用命令行导入 MySQL中文全部变成问号。原因SQLite 和 MySQL 的字符集处理机制不同导出时没加SET NAMES utf8mb4之类的声明。解决导出导入时显式指定字符集。SQLite 用iterdump导出的文件本身是 UTF-8MySQL 导入前先执行SET NAMES utf8mb4;。这个坑不遇到一次根本想不到。5.4 翻车点四数据库死锁演示变灾难现象写并发选课代码时5 个线程一起跑结果程序卡死或者抛“database is locked”。原因SQLite 对并发写的支持有限多个线程同时获取写锁时默认等待时间不够。解决把连接超时调大比如timeout30同时用BEGIN IMMEDIATE减少锁升级的次数。在文档里务必备注一句话“本项目基于 SQLite 的 WAL 模式验证了并发场景”不然你的死锁演示就是事故现场。5.5 翻车点五作业文档里的代码和实际运行代码不一致现象答辩时按文档里的代码复制运行报错实际能跑的是你自己电脑上的另一个版本。原因改完代码忘记更新 Word 里的代码块。解决定稿前把文档里每一段代码直接复制出来跑一遍跑通了再导出 PDF。这一步叫“文档代码回归测试”花 20 分钟救回 10 分。6. 收尾前必做给自己当一次答辩老师交“数据库作业数据库作业.doc”之前我每次都会做三件事第一把数据库文件删掉重新跑一遍建库脚本确认从零能复现第二把 Word 文档里的每个功能截图和代码对一遍确保就是当前版本的第三用PRAGMA integrity_check验证数据库文件完整性——如果你在文档里写了“本系统的数据库文件可正常打开”那这个检查就一定要做。import sqlite3 conn sqlite3.connect(student_management.db) result conn.execute(PRAGMA integrity_check).fetchone() print(数据库完整性检查结果:, result[0]) # 应为 ok conn.close()三条都过这份作业基本就稳了。我见过太多人倒在一件小事上数据库文件拷到 U 盘时损坏了打开全是乱码或者 Word 里的截图是旧的跟代码输出对不上。这些都不是技术问题而是交付前没演练。每个学期帮学生改作业我最后都会强调一句数据库作业的价值不在“功能有多炫”而在“文档能不能证明你确实做出来了”。你把验证路径走一遍答辩时心里才有底。希望这篇笔记能帮你少熬一个通宵一次过验收。本文还有配套的精品资源点击获取