GUI+SQLServer考试系统

本文档详述了一个基于Microsoft SQL Server 2019的在线做题数据管理系统的完整设计过程,包括需求分析、系统模块设计、概念模型构建、逻辑和物理结构设计以及数据库的实施与维护。系统功能涵盖用户登录、题库管理、错题记录等功能,旨在提升用户做题整理效率。源码获取地址见文末。
摘要由CSDN通过智能技术生成

1、概述

1.1、 目的与要求

随着科技的发展,基本上所有的具有一定数量数据的机构都开始使用计算机数据库来做管理。几乎现在每个人在学习中,都会做大量的题。该课程设计要求设计一个做题的数据管理系统,数据库中包含了用户的基本信息,题库基本信息,以及用户错题集。要方便用户进行做题整理与归纳,通过该课程设计,应该达到把数据库理论知识更加的巩固加深,加强动手能力与实践能力,学以致用,与现实生活中的应用充分结合起来。

1.2、设计环境

  1. Microsoft SQL Server 2019
  2. JDK 1.8
  3. IntelliJ IDEA 2021

2、需求分析

2.1、系统功能要求设计

  • 此系统实现如下功能:
    1. 使得用户练习题,整理错题、条理化、自动化。
    2. 通过账号和密码登录系统,管理员增删改查提供以及用户。
    3. 设计人机交换界面,功能安排合理,操作使用方便,并且进一步考虑系统在安全性,完整性,并发控制等方面的功能要求。

2.2、系统模块设计

  • 习题练习系统大体可以分成两大模块如,一是管理员模块,里面包含题库和用户的基本信息;再者便是用户模块,在该模块中应该包含查询题库,与错题集的添加。
  • 可以得到系统流程图:
    在这里插入图片描述

2.3、数据字典

  • 数据项是数据库的关系中不可再分的数据单位,下表分别列出了数据的名称、数据类型、长度、取值能否为空。利用SQL Server 2019 建立“exam”数据库,其基本表清单及表结构描述如下:
  • 数据库中用到的表:
    在这里插入图片描述
  • Usertable 数据表,结构如下:
    在这里插入图片描述
  • Title 数据表,结构如下:
    在这里插入图片描述
  • Error 数据表结构如下:
    在这里插入图片描述

3、概念模型设计

  • 由需求分析的结果可知,本系统设计的实体包括:
    1. 用户:账号,密码,姓名,权限
    2. 题库:题目编号,题目,选项A,选项B,选项C,选项D,选项E,题目类型,答案
    3. 错题集:errorid,写错时间
    4. 管理员可以添加多个题,用户可以答多个题。由上述分析可得到系统的E—R图:
      在这里插入图片描述

4、逻辑和物理结构设计

4.1、由系统E—R图转化而得到的关系模式如下

  1. 用户(userid,姓名,密码,权限)
  2. 题库(topicid,题目,选项A,选项B,选项C,选项D,选项E,题目类型,答案,userid)
  3. 错题集(errorid,写错时间,userid,topicid)

4.2、确定关系模型的存取方法

在将概念模型转换成物理模型之后,我们可以对物理模型进行设计,双击物理模型的关系,可以对该关系的名称、注释等信息进行查询。可对该关系的屆性列进行设计,可分别设置其名称、码、数据类型以及主码、是否为空等。在实际设计中最常用的存取方法是紫引发,使用紫引可以大大减少数据的查询时间,在建立紫引时应遊福:在经常需要搜紫的列上建立紫引:在主关键字上建立紫升;在经常用于连接的列上建立索引,即在外键上建立索引:在经常需要根据范围进行搜索的列上创建索列,因为索引己经排序,其指定的范围是连续的等规则。才能充分利用索引的作用避免因索引引起的负面
作用。

4.3、确定数据库的存储结构

  • 创建用户表:

    CREATE TABLE [dbo].[usertable](
    	[userid] [varchar](10) NOT NULL,
    	[password] [varchar](16) NOT NULL,
    	[name] [varchar](10) NOT NULL,
    	[power] [int] NOT NULL,
     CONSTRAINT [PK_user] PRIMARY KEY CLUSTERED 
    (
    	[userid] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[usertable]  WITH CHECK ADD  CONSTRAINT [CK_usertable] CHECK  (([power]=(1) OR [power]=(0)))
    GO
    ALTER TABLE [dbo].[usertable] CHECK CONSTRAINT [CK_usertable]
    GO
    
  • 创建题库表:

    CREATE TABLE [dbo].[title](
    		[topicid] [int] IDENTITY(1,1) NOT NULL,
    		[topic] [varchar](800) NOT NULL,
    		[A] [varchar](800) NOT NULL,
    		[B] [varchar](800) NOT NULL,
    		[C] [varchar](800) NOT NULL,
    		[D] [varchar](800) NOT NULL,
    		[E] [varchar](800) NULL,
    		[type] [char](6) NOT NULL,
    		[value] [varchar](5) NOT NULL,
    		[userid] [varchar](10) NULL,
     CONSTRAINT [PK_title] PRIMARY KEY CLUSTERED 
    (
    		[topicid] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[title]  WITH CHECK ADD  CONSTRAINT [FK_title_title] FOREIGN KEY([topicid])
    REFERENCES [dbo].[title] ([topicid])
    GO
    ALTER TABLE [dbo].[title] CHECK CONSTRAINT [FK_title_title]
    GO
    ALTER TABLE [dbo].[title]  WITH CHECK ADD  CONSTRAINT [FK_title_title1] FOREIGN KEY([topicid])
    REFERENCES [dbo].[title] ([topicid])
    GO
    ALTER TABLE [dbo].[title] CHECK CONSTRAINT [FK_title_title1]
    GO
    
    
  • 创建错题表:

    CREATE TABLE [dbo].[error](
    	[errorid] [int] IDENTITY(1,1) NOT NULL,
    	[userid] [varchar](10) NOT NULL,
    	[topicid] [int] NOT NULL,
    	[errortime] [date] NOT NULL,
     CONSTRAINT [PK_error] PRIMARY KEY CLUSTERED 
    (
    	[errorid] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[error]  WITH CHECK ADD  CONSTRAINT [FK_error_title] FOREIGN KEY([topicid])
    REFERENCES [dbo].[title] ([topicid])
    GO
    ALTER TABLE [dbo].[error] CHECK CONSTRAINT [FK_error_title]
    GO
    
    ALTER TABLE [dbo].[error]  WITH CHECK ADD  CONSTRAINT [FK_error_usertable] FOREIGN KEY([userid])
    REFERENCES [dbo].[usertable] ([userid])
    GO
    ALTER TABLE [dbo].[error] CHECK CONSTRAINT [FK_error_usertable]
    GO
    
    

5、数据库的实施与维护

  • 此阶段主要任务包括创建数据库,加载初始数据,数据库试运行,数据库的安全性和完整性控制数据库的备份与恢复,数据库性能的监督分析和改仅,数据库的重组和重构等。首先在数据库中建立一个学生成绩管理系统数据库,然后新建一个数据源。主要代码如下:
	import java.sql.*;
	import java.util.ArrayList;
	import java.util.List;
	import java.util.Vector;
	import java.util.concurrent.CopyOnWriteArrayList;
	
	public class ConnectSQLserver {
	    public ConnectSQLserver( ) {
	        String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=exam;user=sa;password=123";//sa身份连接
	        Connection con = null;  //会话连接
	        try {
	            //1-注册驱动器,驱动管理器类加载SQLServerDriver类的静态方法,如果没有添加这个驱动,则创建这个驱动
	            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	            System.out.println("驱动加载成功!");
	            //2-与数据源获得连接
	            con = DriverManager.getConnection(url);
	            System.out.println("数据库连接成功!");
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            try {
	                con.close();
	            } catch (SQLException throwables) {
	                throwables.printStackTrace();
	            }
	
	        }
	    }
	
	    public User login( String userid, String password ) {
	        User user = new User();
	        String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=exam;user=sa;password=123";//sa身份连接
	        Connection con = null;  //会话连接
	        Statement stmt = null;  //用于执行静态SQL语句并返回其生成的结果的对象。
	        ResultSet rs = null;  //数据库结果集的数据表
	        try {
	            //1-注册驱动器,驱动管理器类加载SQLServerDriver类的静态方法,如果没有添加这个驱动,则创建这个驱动
	            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	            System.out.println("驱动加载成功!");
	            //2-与数据源获得连接
	            con = DriverManager.getConnection(url);
	            System.out.println("数据库连接成功!");
	            //3-创建一个Statement对象,用于将SQL语句发送到数据库
	            stmt = con.createStatement();
	            //4- SQL语句
	            String SQL = "SELECT  name,power FROM usertable where userid="
	                    + "'" + userid + "'and password=" + "'" + password + "'";
	            //5-执行SQL,返回数据
	            rs = stmt.executeQuery(SQL);
	            //6-遍历
	            if (rs.next()) {
	                user.setUserid(rs.getString("name"));
	                user.setPower(rs.getString("power"));
	            }
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            if (rs != null)
	                try {
	                    rs.close();
	                } catch (Exception e) {
	                }
	            if (stmt != null)
	                try {
	                    stmt.close();
	                } catch (Exception e) {
	                }
	            if (con != null)
	                try {
	                    con.close();
	                } catch (Exception e) {
	                }
	            return user;
	        }
	    }
	
	    public int addexam( String topic, String A, String B, String C, String D, String E, String type, String value ,String userid) {
	        User user = new User();
	        String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=exam;user=sa;password=123";//sa身份连接
	        Connection con = null;  //会话连接
	        Statement stmt = null;  //用于执行静态SQL语句并返回其生成的结果的对象。
	        int rs = 0;  //数据执行结果
	        try {
	            //1-注册驱动器,驱动管理器类加载SQLServerDriver类的静态方法,如果没有添加这个驱动,则创建这个驱动
	            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	            System.out.println("驱动加载成功!");
	            //2-与数据源获得连接
	            con = DriverManager.getConnection(url);
	            System.out.println("数据库连接成功!");
	            //3-创建一个Statement对象,用于将SQL语句发送到数据库
	            stmt = con.createStatement();
	            //4- SQL语句
	            String SQL = "insert into title values('" + topic + "','" + A + "','" + B + "','" +
	                    C + "','" + D + "','" + E + "','" + type + "','" + value + "','" +userid+"')";
	            //5-执行SQL,返回数据
	            System.out.println(SQL);
	            rs = stmt.executeUpdate(SQL);
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            if (stmt != null)
	                try {
	                    stmt.close();
	                } catch (Exception e) {
	                }
	            if (con != null)
	                try {
	                    con.close();
	                } catch (Exception e) {
	                }
	            return rs;
	        }
	    }
	
	    public Vector[] delExam( ) {
	        String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=exam;user=sa;password=123";//sa身份连接
	        Connection con = null;  //会话连接
	        Statement stmt = null;  //用于执行静态SQL语句并返回其生成的结果的对象。
	        ResultSet rs = null;  //数据执行结果
	        Vector rowData, columnNames;
	        columnNames = new Vector();
	        columnNames.add("题目编号");
	        columnNames.add("题目");
	        rowData = new Vector();
	        try {
	            //1-注册驱动器,驱动管理器类加载SQLServerDriver类的静态方法,如果没有添加这个驱动,则创建这个驱动
	            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	            System.out.println("驱动加载成功!");
	            //2-与数据源获得连接
	            con = DriverManager.getConnection(url);
	            System.out.println("数据库连接成功!");
	            //3-创建一个Statement对象,用于将SQL语句发送到数据库
	            stmt = con.createStatement();
	            //4- SQL语句
	            String SQL = "select topicid,topic from title";
	            //5-执行SQL,返回数据
	            rs = stmt.executeQuery(SQL);
	            while (rs.next()) {
	                Vector hang = new Vector();
	                hang.add(rs.getString(1));
	                hang.add(rs.getString(2));
	                rowData.add(hang.clone());
	            }
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            if (rs != null)
	                try {
	                    rs.close();
	                } catch (Exception e) {
	                }
	            if (stmt != null)
	                try {
	                    stmt.close();
	                } catch (Exception e) {
	                }
	            if (con != null)
	                try {
	                    con.close();
	                } catch (Exception e) {
	                }
	            Vector[] vectors = {rowData, columnNames};
	            return vectors;
	        }
	    }
	
	    public int bDelExam( int i ) {
	        String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=exam;user=sa;password=123";//sa身份连接
	        Connection con = null;  //会话连接
	        Statement stmt = null;  //用于执行静态SQL语句并返回其生成的结果的对象。
	        int rs = 0;  //数据执行结果
	        try {
	            //1-注册驱动器,驱动管理器类加载SQLServerDriver类的静态方法,如果没有添加这个驱动,则创建这个驱动
	            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	            System.out.println("驱动加载成功!");
	            //2-与数据源获得连接
	            con = DriverManager.getConnection(url);
	            System.out.println("数据库连接成功!");
	            //3-创建一个Statement对象,用于将SQL语句发送到数据库
	            stmt = con.createStatement();
	            //4- SQL语句
	            String SQL0 = "delete from title where topicid=" + i;
	            String SQL1 = "delete from error where topicid=" + i;
	            //5-执行SQL,返回数据
	            System.out.println(SQL1);
	            stmt.executeUpdate(SQL1);
	            rs = stmt.executeUpdate(SQL0);
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            if (stmt != null)
	                try {
	                    stmt.close();
	                } catch (Exception e) {
	                }
	            if (con != null)
	                try {
	                    con.close();
	                } catch (Exception e) {
	                }
	            return rs;
	        }
	    }
	
	    public int bAltExam( int i ) {
	        String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=exam;user=sa;password=123";//sa身份连接
	        Connection con = null;  //会话连接
	        Statement stmt = null;  //用于执行静态SQL语句并返回其生成的结果的对象。
	        ResultSet rs = null;  //数据执行结果
	        int rs1 = 0;
	        try {
	            //1-注册驱动器,驱动管理器类加载SQLServerDriver类的静态方法,如果没有添加这个驱动,则创建这个驱动
	            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	            System.out.println("驱动加载成功!");
	            //2-与数据源获得连接
	            con = DriverManager.getConnection(url);
	            System.out.println("数据库连接成功!");
	            //3-创建一个Statement对象,用于将SQL语句发送到数据库
	            stmt = con.createStatement();
	            //4- SQL语句
	            String SQL = "select topicid from title where topicid=" + i;
	            //5-执行SQL,返回数据
	            rs = stmt.executeQuery(SQL);
	            while (rs.next()) {
	                rs1 = new Integer(rs.getInt(1));
	            }
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            if (rs != null) {
	                try {
	                    rs.close();
	                } catch (Exception e) {
	                }
	            }
	            if (stmt != null)
	                try {
	                    stmt.close();
	                } catch (Exception e) {
	                }
	            if (con != null)
	                try {
	                    con.close();
	                } catch (Exception e) {
	                }
	            return rs1;
	        }
	    }
	
	    public int setExam( int topicid, String topic, String A, String B, String C, String D, String E, String type, String value ) {
	        User user = new User();
	        String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=exam;user=sa;password=123";//sa身份连接
	        Connection con = null;  //会话连接
	        Statement stmt = null;  //用于执行静态SQL语句并返回其生成的结果的对象。
	        int rs = 0;  //数据执行结果
	        try {
	            //1-注册驱动器,驱动管理器类加载SQLServerDriver类的静态方法,如果没有添加这个驱动,则创建这个驱动
	            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	            System.out.println("驱动加载成功!");
	            //2-与数据源获得连接
	            con = DriverManager.getConnection(url);
	            System.out.println("数据库连接成功!");
	            //3-创建一个Statement对象,用于将SQL语句发送到数据库
	            stmt = con.createStatement();
	            //4- SQL语句
	            String SQL = "update title set topic='" + topic + "',A='" + A + "',B='" + B + "',C='" +
	                    C + "',D='" + D + "',E='" + E + "',type='" + type + "',value='" + value + "'" + "where topicid=" + topicid;
	            //5-执行SQL,返回数据
	            System.out.println(SQL);
	            rs = stmt.executeUpdate(SQL);
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            if (stmt != null)
	                try {
	                    stmt.close();
	                } catch (Exception e) {
	                }
	            if (con != null)
	                try {
	                    con.close();
	                } catch (Exception e) {
	                }
	            return rs;
	        }
	    }
	
	    public int addUser( String userid, String password, String name, int power ) {
	        String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=exam;user=sa;password=123";//sa身份连接
	        Connection con = null;  //会话连接
	        Statement stmt = null;  //用于执行静态SQL语句并返回其生成的结果的对象。
	        int rs = 0;  //数据执行结果
	        try {
	            //1-注册驱动器,驱动管理器类加载SQLServerDriver类的静态方法,如果没有添加这个驱动,则创建这个驱动
	            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	            System.out.println("驱动加载成功!");
	            //2-与数据源获得连接
	            con = DriverManager.getConnection(url);
	            System.out.println("数据库连接成功!");
	            //3-创建一个Statement对象,用于将SQL语句发送到数据库
	            stmt = con.createStatement();
	            //4- SQL语句
	            String SQL = "insert into usertable(userid,password,name,power) " +
	                    "values('" + userid + "','" + password + "','" + name + "'," +
	                    power  + ")";
	            //5-执行SQL,返回数据
	            System.out.println(SQL);
	            rs = stmt.executeUpdate(SQL);
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            if (stmt != null)
	                try {
	                    stmt.close();
	                } catch (Exception e) {
	                }
	            if (con != null)
	                try {
	                    con.close();
	                } catch (Exception e) {
	                }
	            return rs;
	        }
	    }
	
	    public Vector[] delUser( ) {
	        String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=exam;user=sa;password=123";//sa身份连接
	        Connection con = null;  //会话连接
	        Statement stmt = null;  //用于执行静态SQL语句并返回其生成的结果的对象。
	        ResultSet rs = null;  //数据执行结果
	        Vector rowData, columnNames;
	        columnNames = new Vector();
	        columnNames.add("用户账户");
	        columnNames.add("用户姓名");
	        columnNames.add("权限");
	        rowData = new Vector();
	        try {
	            //1-注册驱动器,驱动管理器类加载SQLServerDriver类的静态方法,如果没有添加这个驱动,则创建这个驱动
	            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	            System.out.println("驱动加载成功!");
	            //2-与数据源获得连接
	            con = DriverManager.getConnection(url);
	            System.out.println("数据库连接成功!");
	            //3-创建一个Statement对象,用于将SQL语句发送到数据库
	            stmt = con.createStatement();
	            //4- SQL语句
	            String SQL = "select userid,name,power from usertable";
	            //5-执行SQL,返回数据
	            rs = stmt.executeQuery(SQL);
	            while (rs.next()) {
	                Vector hang = new Vector();
	                hang.add(rs.getString(1));
	                hang.add(rs.getString(2));
	                hang.add(rs.getString(3));
	                rowData.add(hang.clone());
	            }
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            if (rs != null)
	                try {
	                    rs.close();
	                } catch (Exception e) {
	                }
	            if (stmt != null)
	                try {
	                    stmt.close();
	                } catch (Exception e) {
	                }
	            if (con != null)
	                try {
	                    con.close();
	                } catch (Exception e) {
	                }
	            Vector[] vectors = {rowData, columnNames};
	            return vectors;
	        }
	    }
	

5.2、部分操作截图

  1. 下面显示了登录系统进行查询的临时界面:
    在这里插入图片描述
  2. 下面显示了添加题库插入临时界面:
    在这里插入图片描述
  3. 下面显示了添加用户临时插入界面:
    在这里插入图片描述
  4. 下面显示了删除题库界面:
    在这里插入图片描述
  5. 下面显示了做题,查询界面:
    在这里插入图片描述

6、源码获取地址

考试系统源码

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴在敲Bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值