【无标题】链接数据库进行相关操作

一、 项目需求及设计要求

假设有学生-选课数据库,其中有学生表,课程表,教师表,选课表,其结构如下:

学生(学号,姓名,专业,入学年份),课程(课程号,课程名,学分),选课(学号,课程号,成绩)。一门课程可以被多名学生选修,一名学生可以选修多门课程。请根据以上信息,实现下列功能:

1)任意给定一门课程号,统计其成绩分布,如:最高分,最低分,平均分,各分数段人数;(课程号由用户在程序运行过程中指定,放在主变量中)

2)如果选课表中某位同学某门课程的成绩更新了,系统能自动更新1)中的统计分析数据;(学号和课程号由用户在程序运行过程中指定,放在主变量中)

3)如果学生表中数据有更新,如:有学生退学或插班,请自动更新选课表,并将这两个表中有变化的数据加以保存。

(学号由用户在程序运行过程中指定,放在主变量中)

要求:提交源程序并标识必要的注释。保证程序能正确运行。

二、实验内容

根据实验要求完成下列任务

1)编写存储过程和触发器完成相应功能

2)在高级语言中操作数据库

3)实验数据由学生自己生成,数据量要求如下:学生表中元组个数大于10,课程表中元组个数大于5,选课表中元组个数大于60,每位学生至少选修5门课程,每门课程至少被6人选修。

三、实验结果

1.建表:

CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    major VARCHAR(50),
    grade INT
);

CREATE TABLE courses (
    cid INT PRIMARY KEY,
    cname VARCHAR(50),
    credits INT
);
CREATE TABLE SC (
    id INT,
    cid INT,
    score INT,
    PRIMARY KEY (id, cid),
    FOREIGN KEY (id) REFERENCES students(id) ON DELETE CASCADE,
    FOREIGN KEY (cid) REFERENCES courses(cid) ON DELETE CASCADE
);

外链图片转存失在这里插入图片描述

INSERT INTO students VALUES
(1, '白落提', '计算机科学', 2018),
(2, '丰和', '计算机科学学', 2019),
(3, '英宋', '计算机科学', 2017),
(4, '桓泽金', '计算机科学', 2016),
(5, '广秀', '计算机科学', 2018),
(6, '海问香', '软件工程', 2019),
(7, '迷麟', '软件工程', 2017),
(8, '卡拉肖克潘', '物联网', 2016),
(9, '离离艾', '大数据', 2018),
(10, '远浪', '大数据', 2019),
(11, '镜心', '物联网', 2017);

在这里插入图片描述

INSERT INTO courses VALUES
(1, '数据库原理', 4),
(2, '数据结构', 4),
(3, '计算机组成原理', 4),
(4, '高等数学', 3),
(5, '线性代数', 3),
(6, '大学英语', 2);

在这里插入图片描述

INSERT INTO SC VALUES
(1, 1, 90),
(1, 2, 85),
(1, 3, 80),
(1, 4, 75),
(1, 5, 70),
(1, 6, 95),
(2, 1, 78),
(2, 2, 82),
(2, 3, 88),
(2, 4, 91),
(2, 5, 65),
(2, 6, 72),
(3, 1, 92),
(3, 2, 87),
(3, 3, 84),
(3, 4, 79),
(3, 5, 68),
(3, 6, 96),
(4, 1, 65),
(4, 2, 70),
(4, 3, 75),
(4, 4, 80),
(4, 5, 85),
(4, 6, 90),
(5, 1, 87),
(5, 2, 92),
(5, 3, 84),
(5, 4, 78),
(5, 5, 73),
(5, 6, 95),
(6, 1, 83),
(6, 2, 76),
(6, 3, 89),
(6, 4, 93),
(6, 5, 70),
(6, 6, 81),

(7, 1, 95),
(7, 2, 92),
(7, 3, 88),
(7, 4, 84),
(7, 5, 76),
(7, 6, 94),
(8, 1, 79),
(8, 2, 83),
(8, 3, 90),
(8, 4, 95),
(8, 5, 67),
(8, 6, 72),
(9, 1, 88),
(9, 2, 84),
(9, 3, 81),
(9, 4, 76),
(9, 5, 71),
(9, 6, 97),
(10, 1, 72),
(10, 2, 78),
(10, 3, 85),
(10, 4, 91),
(10, 5, 83),
(10, 6, 89),
(11, 1, 90),
(11, 2, 86),
(11, 3, 82),
(11, 4, 78),
(11, 5, 74),
(11, 6, 95);

在这里插入图片描述

1)任意给定一门课程号,统计其成绩分布,如:最高分,最低分,平均分,各分数段人数;(课程号由用户在程序运行过程中指定,放在主变量中)

CREATE PROCEDURE course_score
AS
BEGIN
    -- 计算每门课程的最高分、最低分和平均分
    SELECT
        c.cname AS 课程名,
        MAX(sc.score) AS 最高分,
        MIN(sc.score) AS 最低分,
        AVG(sc.score) AS 平均分,
        SUM(CASE WHEN sc.score >= 90 THEN 1 ELSE 0 END) AS 分数90以上,
        SUM(CASE WHEN sc.score BETWEEN 80 AND 89 THEN 1 ELSE 0 END) AS 分数80_89,
        SUM(CASE WHEN sc.score BETWEEN 70 AND 79 THEN 1 ELSE 0 END) AS 分数70_79,
        SUM(CASE WHEN sc.score BETWEEN 60 AND 69 THEN 1 ELSE 0 END) AS 分数60_69,
        SUM(CASE WHEN sc.score < 60 THEN 1 ELSE 0 END) AS 低于60FROM courses c
    INNER JOIN SC sc ON c.cid = sc.cid
    GROUP BY c.cname;
END;

在这里插入图片描述
在这里插入图片描述

2)如果选课表中某位同学某门课程的成绩更新了,系统能自动更新1)中的统计分析数据;(学号和课程号由用户在程序运行过程中指定,放在主变量中)

CREATE TRIGGER UpdateScore
ON SC
AFTER UPDATE
AS
BEGIN
    -- 调用存储过程 course_score
    EXEC course_score
END;

在这里插入图片描述

3)如果学生表中数据有更新,如:有学生退学或插班,请自动更新选课表,并将这两个表中有变化的数据加以保存。

-- 创建触发器
CREATE TRIGGER trg_Update
ON students
AFTER UPDATE
AS
BEGIN
    -- 创建临时表来存储被删除的学生数据
    CREATE TABLE #deletedStudents (
        id INT PRIMARY KEY
    );
    -- 将被删除的学生数据插入临时表
    INSERT INTO #deletedStudents (id)
    SELECT id
    FROM deleted;

    -- 更新选课表中学生信息
    UPDATE SC
    SET SC.id = inserted.id
    FROM SC
    INNER JOIN inserted ON SC.id = inserted.id
    INNER JOIN #deletedStudents ON SC.id = #deletedStudents.id;

    -- 插入新增学生的选课记录
    INSERT INTO SC (id, cid, score)
    SELECT inserted.id, SC.cid, SC.score
    FROM SC
    INNER JOIN inserted ON SC.id = inserted.id
    LEFT JOIN #deletedStudents ON SC.id = #deletedStudents.id
    WHERE #deletedStudents.id IS NULL;

    -- 删除退学学生的选课记录
    DELETE FROM SC
    WHERE id IN (
        SELECT id
        FROM #deletedStudents
    );
    -- 删除临时表
   DROP TABLE #deletedStudents;
END

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.用高级语言操作数据库

class Program
{
    // 数据库连接字符串
    static string connectionString = "Data Source=Tom;Initial Catalog=BGWK;Integrated Security=True";

    // 主函数
    static void Main(string[] args)
    {
        // 显示主菜单
        ShowMainMenu();
    }

    // 显示主菜单
    static void ShowMainMenu()
    {
        Console.WriteLine("欢迎来到学生管理系统");
        Console.WriteLine("1. 修改学生的成绩");
        Console.WriteLine("2. 学生退学");
        Console.WriteLine("3. 添加学生");
        Console.WriteLine("4. 查询成绩分布");
        Console.WriteLine("5. Exit");

        int choice = GetMenuChoice(1, 5);

        switch (choice)
        {
            case 1:
                ModifyStudentGrade();
                break;
            case 2:
                RemoveStudent();
                break;
            case 3:
                AddStudent();
                break;
            case 4:
                QueryScoreDistribution();
                break;
            case 5:
                Environment.Exit(0);
                break;
        }
    }

    // 修改学生成绩
    static void ModifyStudentGrade()
    {
        Console.WriteLine("请输入学生信息");

        Console.Write("学生ID: ");
        int studentId = Convert.ToInt32(Console.ReadLine());

        Console.Write("课程代码: ");
        int courseId = Convert.ToInt32(Console.ReadLine());

        Console.Write("分数: ");
        int grade = Convert.ToInt32(Console.ReadLine());

        // 更新学生成绩
        UpdateStudentGrade(studentId, courseId, grade);


        // 返回主菜单
        ShowMainMenu();
    }

    // 更新学生成绩
    static void UpdateStudentGrade(int studentId, int courseId, int grade)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // 更新学生成绩
            SqlCommand command = new SqlCommand(
                "UPDATE SC " +
                "SET score = @Grade " +
                "WHERE id = @StudentId AND cid = @CourseId",
                connection);
            command.Parameters.AddWithValue("@Grade", grade);
            command.Parameters.AddWithValue("@StudentId", studentId);
            command.Parameters.AddWithValue("@CourseId", courseId);

            int rowsAffected = command.ExecuteNonQuery();

            if (rowsAffected > 0)
            {
                Console.WriteLine($"修改学生成绩 (学生ID: {studentId}, 课程 ID: {courseId}):");
                Console.WriteLine($"修改后成绩: {grade}");
            }
            else
            {
                Console.WriteLine($"修改错误,不存在学生ID为{studentId}, 课程ID为{courseId}的学生");
            }
        }
    }

    // 学生退学
    static void RemoveStudent()
    {
        Console.WriteLine("请输入学生信息");

        Console.Write("学生ID: ");
        int studentId = Convert.ToInt32(Console.ReadLine());

        Console.Write("学生姓名: ");
        string studentName = Console.ReadLine();

        // 删除学生
        DeleteStudent(studentId, studentName);

        Console.WriteLine("删除成功\n");

        // 返回主菜单
        ShowMainMenu();
    }

    // 删除学生
    static void DeleteStudent(int studentId, string studentName)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // 删除学生(级联删除)
            SqlCommand command = new SqlCommand(
                "DELETE FROM students " +
                "WHERE id = @StudentId AND name = @StudentName",
                connection);
            command.Parameters.AddWithValue("@StudentId", studentId);
            command.Parameters.AddWithValue("@StudentName", studentName);

            int rowsAffected = command.ExecuteNonQuery();

            if (rowsAffected > 0)
            {
                Console.WriteLine($"删除成功,学生ID为{studentId},姓名为{studentName}的学生已被删除\n");
            }
            else
            {
                Console.WriteLine($"删除错误,不存在学生ID为{studentId},姓名为{studentName}的学生\n");
            }
        }
    }

    // 删除学生选课记录
    static void DeleteStudentEnrollments(int studentId)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // 删除选课表中与学生ID相关的记录
            SqlCommand command = new SqlCommand(
                "DELETE FROM SC " +
                "WHERE id = @StudentId",
                connection);
            command.Parameters.AddWithValue("@StudentId", studentId);

            command.ExecuteNonQuery();
        }
    }

    // 添加学生
    static void AddStudent()
    {
        Console.WriteLine("请输入学生信息");

        Console.Write("学生ID: ");
        int studentId = Convert.ToInt32(Console.ReadLine());

        Console.Write("学生姓名: ");
        string studentName = Console.ReadLine();

        Console.Write("主修: ");
        string major = Console.ReadLine();

        Console.Write("年级: ");
        string grade = Console.ReadLine();

        // 添加学生
        InsertStudent(studentId, studentName, major,grade);

        Console.WriteLine("添加成功");

        // 返回主菜单
        ShowMainMenu();
    }

    // 添加学生
    static void InsertStudent(int studentId, string studentName, string major,string grade)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // 添加学生
            SqlCommand command = new SqlCommand(
                "INSERT INTO students (id, name, major, grade) " +
                "VALUES (@StudentId, @StudentName, @Major, @Grade)",
                connection);
            command.Parameters.AddWithValue("@StudentId", studentId);
            command.Parameters.AddWithValue("@StudentName", studentName);
            command.Parameters.AddWithValue("@Major", major);
            command.Parameters.AddWithValue("@Grade", grade);

            command.ExecuteNonQuery();
        }
    }
    // 查询成绩分布
    static void QueryScoreDistribution()
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // 调用存储过程
            SqlCommand command = new SqlCommand("course_score", connection);
            command.CommandType = CommandType.StoredProcedure;

            // 执行存储过程并获取结果
            SqlDataReader reader = command.ExecuteReader();

            // 输出列名
            Console.WriteLine("成绩分布表:");
            for (int i = 0; i < reader.FieldCount; i++)
            {
                Console.Write($"{reader.GetName(i)}\t");
            }
            Console.WriteLine();

            // 输出结果表
            while (reader.Read())
            {
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    Console.Write($"{reader[i]}\t");
                }
                Console.WriteLine();
            }

            reader.Close();
        }

        // 返回主菜单
        ShowMainMenu();
    }



    // 获取菜单选择
    static int GetMenuChoice(int minChoice, int maxChoice)
    {
        int choice;

        while (true)
        {
            Console.Write("输入你想查询的功能: ");
            if (int.TryParse(Console.ReadLine(), out choice))
            {
                if (choice >= minChoice && choice <= maxChoice)
                {
                    break;
                }
            }

            Console.WriteLine("请重新输入");
        }

        return choice;
    }
}
① 修改学生成绩

在这里插入图片描述

② 学生退学

在这里插入图片描述

③ 添加学生

在这里插入图片描述

④ 查询成绩

在这里插入图片描述

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值