简介:资源围绕VB学籍管理系统,以1个doc设计文档形式呈现,面向学习Visual Basic与数据库课程设计、毕业设计的学生,帮助梳理学生信息、成绩、出勤及权限管理等模块从需求分析到实现的整体思路。压缩包内共1个doc文件,约523KB,主体为毕业论文/设计说明,目录覆盖系统需求分析、可行性分析、系统功能与流程图、数据库需求分析、E-R概念结构设计及数据库结构实现,并延伸到主窗体、用户管理、学籍管理、班级管理、课程设置、成绩管理等模块的详细设计。文档还涉及Label、TextBox、Button、DataGridView等控件的数据展示与操作,以及非法输入的错误处理机制,可作为整理VB与Access/SQL Server类项目开发流程、撰写论文结构、拆解功能模块的参考。目前已有436人学习,适合需要课程设计框架、数据库设计范例和窗体实现思路的初、中级开发者查阅。
1. 一份老 VB 学籍管理系统源代码,今天还能怎么用
如果你手头有一份 VB 学籍管理系统源代码.rar,第一反应多半是双击 .vbp 看界面。先别急,这类老工程真正决定能不能跑的是连接串和 ADO 引用,界面反而最不容易出问题。它是一套 VB6.0 + SQL Server 2000 的学籍管理骨架:用户、学生、班级、课程、年级课程、成绩六张表,一个 MDI 主窗体挂各功能子窗体,公共模块里的 ExecuteSQL 把增删改查收口。适合拿来做课程设计对照、补 VB 数据库编程基本功,或者拆解早期 MIS 的分层方式。环境偏老,先跑通再谈改。
2. 拆包先看骨架:六张表、一个 MDI 主窗体和一条 ADO 连接链
老工程最容易犯的错,是把它当成一个“能双击运行的 exe”来看。实际上压缩包里给的是源码工程,工程能不能打开、引用全不全、数据库在不在,是三件独立的事。先看骨架的好处是:你能在改任何一行代码之前,判断这套 VB 学籍管理系统源代码是“缺库”还是“缺控件”,而不是在十几个窗体之间来回猜。
2.1 工程类型:标准 EXE 外面套了一层 MDI
原文的创建过程是先新建 Standard EXE,删掉默认窗体,再添加一个 MDI Form,工程名定为 Student-MIS。这个顺序很关键:它说明主窗体不是普通 Form,而是 MDIForm,各功能窗体作为子窗体挂在主窗体里。菜单点击后设置子窗体的MDIChild = True,再Show,这是 VB6 时代做多模块管理系统的常见做法。
选 MDI 的理由很直接:学籍、班级、课程、成绩、用户管理五个模块,如果每个都开独立窗口,任务栏很快被占满,用户来回切换也乱。MDI 主窗体提供统一菜单和状态栏,子窗体被限制在主窗体客户区内,视觉上更像一个“系统”。代价是子窗体位置、层叠、最大化行为都要自己管,MDI 子窗体还不能用模态方式简单弹出,调试时容易互相遮挡。
操作上,先把压缩包解压到短路径,比如D:\vb_mis\,不要放在桌面深层目录或含中文、空格的路径里。然后用记事本打开.vbp工程文件,看两类行:MDIForm=指向主窗体,Form=指向普通窗体。工程资源管理器里如果主窗体图标带一个内嵌小窗口,基本就是 MDIForm。此时不要急着点运行,先看“工程-引用”和“工程-部件”里有没有带MISSING的项,缺失项才是后面编译失败的根源。
2.2 六张表的分工:学生、班级、课程、成绩各自站在哪一层
原文的数据库设计把对象拆成用户、学生、班级、课程、年级课程、成绩六张表,这个拆分方式不算精细,但层次是清楚的。学生表存基本信息和班号,班级表存年级、班主任、教室,课程表存课程号、名称、类型、描述,年级课程设置表把年级和课程名绑在一起,成绩表再按考试编号、学生、班号、课程、分数记录一次考试结果。用户表独立,负责登录。
| 表名 | 作用 | 关键字段 | 关联与备注 |
|---|---|---|---|
| user_Info | 系统用户 | user_ID、user_PWD、user_Des | 独立表,原文没有角色字段 |
| student_Info | 学生基本信息 | student_ID、student_Name、class_NO | class_NO 对应 class_Info.class_No |
| class_Info | 班级信息 | class_No、grade、director、classroom_No | 年级用文本 grade 表示 |
| course_Info | 课程基本信息 | course_No、course_Name、course_Type | 课程名是文本,不是外键 |
| gradecourse_Info | 年级课程设置 | grade、course_Name | 靠 grade + course_Name 弱关联 |
| result_Info | 学生成绩 | exam_No、student_ID、course_Name、result | 学生、课程都用业务字段关联 |
这张表里最值得注意的不是字段多少,而是“弱关联”三个字。成绩表存的是student_ID和course_Name,不是课程号;年级课程表也用课程名,不用课程号。好处是查询时少一次 join,坏处是课程改名就断链,同一个课程名多一个空格就查不到。原文建表时只写了NOT NULL,没有主键、没有外键,这在早期课程设计里很常见,但后面做删除和修改时很容易留下孤儿记录。
阅读顺序建议按“登录窗体 → 主窗体菜单 → 学籍管理子窗体 → 成绩管理子窗体”走。登录窗体看用户表怎么查,主窗体看菜单怎么挂子窗体,学籍窗体看学生表怎么增删改查,成绩窗体看 result_Info 怎么写。每个窗体里找ExecuteSQL的调用点,基本就能把数据流串起来。不要一上来逐个窗体看控件属性,属性再多也不如一条 SQL 清楚。
2.3 先核对表是否齐全,再回工程里找连接串
在 SQL Server 查询分析器里执行下面这条语句,能快速确认六张用户表在不在。sysobjects是 SQL Server 2000 的系统表,xtype = 'U'表示用户表。表名对不上时,先检查是不是建到了别的数据库,或者大小写、下划线写错。
-- 核对当前数据库中的用户表,确认六张表是否齐全 SELECT name AS table_name FROM sysobjects WHERE xtype = 'U' ORDER BY name;如果查询结果里只有一部分表,不要急着重跑整个脚本,先看是不是CREATE TABLE中途报错停了。常见原因是表名重复、字段名用了保留字、或者char(10)长度不够导致后面插入失败。表齐了之后,回 VB 工程里找ConnectString的定义位置,通常在Module.bas顶部,也可能在登录窗体里临时赋值。找到它,后面第 3 章才有得改。
提示:先让工程能打开、表能查到,再谈功能。老工程排错最怕“边改边猜”,一次只验证一个环节。
3. 把数据库跑起来:SQL Server 2000 建库脚本与连接串改造
这套 VB 学籍管理系统源代码的客户端能不能跑,七成取决于数据库这一侧。原文只给了建表语句,没有给完整的建库、主键和连接串配置,直接照抄会在“数据库不存在”和“登录失败”上卡很久。下面的脚本按原字段补了主键,字段长度先保持原样,方便和源码里的char(10)、char(2)对上。等跑通之后,再按第 5 章改中文长度。
3.1 建库与六张表的可执行 SQL
在查询分析器里逐批执行,不要一次性全选后点运行,出错时不好定位。GO是批处理分隔符,不是 SQL 语句。数据库名这里用StudentMIS,如果源码里写的是别的名字,以源码为准,或者把连接串里的Initial Catalog改成这里建的名字。
-- 创建数据库,名字可按源码里的连接串调整 CREATE DATABASE StudentMIS GO USE StudentMIS GO -- 1. 系统用户表 CREATE TABLE [dbo].[user_Info] ( [user_ID] [char](10) NOT NULL, [user_PWD] [char](10) NULL, [user_Des] [char](10) NULL, CONSTRAINT [PK_user_Info] PRIMARY KEY ([user_ID]) ) GO -- 2. 学生基本信息表 CREATE TABLE [dbo].[student_Info] ( [student_ID] [int] NOT NULL, [student_Name] [char](10) NULL, [student_Sex] [char](2) NULL, [born_Date] [datetime] NULL, [class_NO] [int] NULL, [tele_Number] [char](10) NULL, [ru_Date] [datetime] NULL, [address] [varchar](50) NULL, [comment] [varchar](200) NULL, CONSTRAINT [PK_student_Info] PRIMARY KEY ([student_ID]) ) GO -- 3. 班级基本信息表 CREATE TABLE [dbo].[class_Info] ( [class_No] [int] NOT NULL, [grade] [char](10) NULL, [director] [char](10) NULL, [classroom_No] [char](10) NULL, CONSTRAINT [PK_class_Info] PRIMARY KEY ([class_No]) ) GO -- 4. 课程基本信息表 CREATE TABLE [dbo].[course_Info] ( [course_No] [int] NOT NULL, [course_Name] [char](10) NULL, [course_Type] [char](10) NULL, [course_Des] [char](50) NULL, CONSTRAINT [PK_course_Info] PRIMARY KEY ([course_No]) ) GO -- 5. 年级课程设置表,原文没有主键,这里先不加强制约束 CREATE TABLE [dbo].[gradecourse_Info] ( [grade] [char](10) NULL, [course_Name] [char](10) NULL ) GO -- 6. 学生成绩表 CREATE TABLE [dbo].[result_Info] ( [exam_No] [char](10) NOT NULL, [student_ID] [int] NOT NULL, [student_Name] [char](10) NULL, [class_No] [int] NULL, [course_Name] [char](10) NULL, [result] [float] NULL, CONSTRAINT [PK_result_Info] PRIMARY KEY ([exam_No]) ) GO脚本里保留了原文的char和varchar,没有直接改成nvarchar,是为了让第一次运行和源码里的字段长度一致。这里有个必须提前说的坑:char(10)是 10 个字节,不是 10 个汉字。中文在非 Unicode 字段里通常占 2 个字节,所以student_Name char(10)实际最多放 5 个汉字,course_Name char(10)也一样。课程名“计算机网络技术”有 7 个汉字,直接超长。tele_Number char(10)存 11 位手机号也会截断。第一次跑通可以先用短测试数据,比如姓名“张三”、课程“数学”,等连接和增删改查都正常了,再统一改长度。
注意:建表脚本里没有加外键。不是外键不重要,而是老数据里可能存在班级号对不上、学生号重复的情况,先加外键会让建表或插入直接失败。等数据清洗完再补
FOREIGN KEY更稳。
3.2 连接串的四个参数:Provider、Data Source、Initial Catalog、安全认证
原文的公共函数里只有一句CNn.Open ConnectString,没有展示ConnectString长什么样。常见做法是在Module.bas顶部声明一个全局字符串,在启动时赋值。下面是一个 SQL Server 2000 的 OLE DB 连接串示例,实例名、库名、账号密码都要按自己的环境改,不要原样照抄。
' Module.bas 顶部声明,按自己的实例名和库名修改 Public ConnectString As String Public Sub InitConnectString() ConnectString = "Provider=SQLOLEDB;" & _ "Data Source=127.0.0.1;" & _ "Initial Catalog=StudentMIS;" & _ "User ID=sa;" & _ "Password=改成你的密码;" End Sub四个参数逐个说清楚。Provider=SQLOLEDB表示用 SQL Server 的 OLE DB 提供程序,不是 ODBC,也不是 MSDASQL;写错会报“未找到提供程序”。Data Source是服务器地址,本机可以写127.0.0.1、.或(local),命名实例要写成机器名\实例名。Initial Catalog是数据库名,必须和CREATE DATABASE建出来的名字一致。User ID和Password是 SQL Server 身份验证账号,用sa只是为了第一次跑通,跑通后建议建一个只对StudentMIS有读写权限的独立登录,不要把sa写进长期使用的工程。
如果环境只允许 Windows 身份验证,可以把账号密码两段换成Integrated Security=SSPI,但要注意 VB6 进程当前登录的 Windows 账户必须有数据库权限。常见翻车是:查询分析器里能用 Windows 登录,VB 程序里却报登录失败,因为两者跑的账户不一样。遇到这种情况,先确认 SQL Server 的认证模式,再决定用 SQL 账号还是 Windows 账号,不要在两套认证之间反复改连接串。
提示:密码里如果带分号,连接串会被分号切断,表现是“登录失败”但密码明明是对的。临时改成不含分号的密码,能省掉很多无效排查。
3.3 先验表,再回 VB 里连
数据库建好后,不要直接去点主窗体。先在 VB 里加一个临时测试过程,或者按Ctrl+G打开立即窗口,跑一遍连接和查询。下面的代码用adOpenStatic静态游标、adLockReadOnly只读锁,适合统计查询,不会给表加不必要的锁。COUNT(*) AS cnt给结果列起了别名,后面用Fields("cnt")取值。
Public Sub TestConnection() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset On Error GoTo ErrHandler cn.Open ConnectString Debug.Print "连接状态:" & cn.State rs.Open "SELECT COUNT(*) AS cnt FROM student_Info", cn, adOpenStatic, adLockReadOnly Debug.Print "学生记录数:" & rs.Fields("cnt").Value rs.Close cn.Close Exit Sub ErrHandler: Debug.Print "错误 " & Err.Number & ":" & Err.Description End Subcn.State返回 1 表示连接已打开,返回 0 表示关闭。如果这里就报“对象变量或 With 块变量未设置”,先查“工程-引用”里 ADO 库有没有勾上,而不是怀疑数据库。如果报“无法打开登录所请求的数据库”,查Initial Catalog和数据库名是否一致。如果报“用户登录失败”,查认证模式和密码。把这一层跑通,后面窗体里的ExecuteSQL才有意义。
4. 让工程能编译:VB6 引用、控件缺失与 ExecuteSQL 公共函数逐行拆
数据库通了,接下来才是工程本身。VB6 老工程最常见的失败不是语法错,而是引用和控件缺失:打开时提示“找不到工程或库”,或者某个窗体设计器直接打不开。先把这些修掉,再去看ExecuteSQL的实现,否则你会在一个根本跑不起来的工程里改业务逻辑。
4.1 打开工程先修引用:ADODB 与缺失控件
在 VB6 里打开.vbp,如果弹出“不能加载工程”或“找不到工程或库”,先看“工程-引用”对话框。带MISSING的引用要取消勾选,然后重新勾选可用的版本。这套系统用 ADO 操作数据库,所以必须存在Microsoft ActiveX Data Objects 2.x Library的引用。原文没有写具体版本,常见做法是以工程里原本勾选的那一版为准;如果原引用丢失,选 2.5 或 2.6 中能通过编译的一版,不要同时勾多个大版本。
控件缺失看“工程-部件”。学籍系统常见控件包括Microsoft Common Dialog Control、Microsoft DataGrid Control、Microsoft FlexGrid Control、Microsoft Windows Common Controls等。窗体打不开时,先看报错里提到的.ocx文件名,再到部件列表里找同名控件。找到后勾选,如果提示路径不对,用“浏览”定位到系统里的SysWOW64或System32目录。VB6 是 32 位程序,在 64 位环境里注册控件要用 32 位版本的regsvr32,不要用错目录下的注册工具。
:: 以管理员身份运行,注册 32 位控件示例 regsvr32 "C:\Windows\SysWOW64\MSCOMCTL.OCX"注册成功会弹出成功提示。如果提示“模块已加载,但找不到入口点”,通常是控件
本文还有配套的精品资源,点击获取