【问题标题】:How to update row in junction table for student grade如何更新学生成绩的联结表中的行
【发布时间】:2019-03-19 15:15:31
【问题描述】:

我又来了。 非常感谢您的帮助。

这是关于如何在连接表中选择和显示学生成绩的老问题。

Select and display all rows belonging to a specific ID

我成功了,但现在我无法更新连接表中的成绩。

这又是我的示例表。

    "student"
-----------------------
|studentID | FullName |
-----------------------
|1234      | John    |
|1235      | Michael |
|1236      | Bryce   |

        "subject_bsit"
-----------------------------------
|subject_id| subject_name  |grade |
-----------------------------------
|    1     | Programming   |  3   |
|    2     | Networking    |  2.5 |
|    3     | Algorithm     |  1.75|
|    4     | Physical Educ |  2   |

This is the Junction table to connect the 
two now.

       "student_subject"
----------------------------
| student_id | subject_id |
----------------------------
|   1235     |      1     |
|   1235     |      2     |
|   1235     |      3     |
|   1234     |      1     |

这是我所做的查询。 这是我试图更新具有 subject_id = 1

studentID 1235 成绩的示例

更新 3:

sql = "UPDATE student_subject " & _
    " INNER JOIN subject_bsit " & _
    " ON subject_bsit.subject_id = student_subject.sub_id " & _
    " SET grade = 1 " & _
    " where student_subject.student_id='" & Txtbox.Text & "' AND student_subject.sub_id = 1"

& Txtbox.Text & 是用户输入studentid的地方,不用介意。非常感谢我使用visual studion vb.net。

这是我得到的确切错误。

您的 SQL 语法有错误;检查对应的手册 您的 MySQL 服务器版本,以便在 'FROM 附近使用正确的语法 student_subject INNER JOIN subject_bsit ON subject_bsit.subject_id = 第 1 行的学生

【问题讨论】:

  • 始终在尝试将其放入字符串之前自行执行您的 SQL 命令。如果它作为直接 SQL 工作,那么您可以将其砍掉并使其工作。这使您有机会划分错误 - 是我的 SQL 还是我的字符串语法。只是从一个艰难地学会了这一点的人那里得到的一个提示。
  • 您仍然没有更改查询...
  • @Hopper ,嗨,对不起,我在数据库方面不是很好。我知道我试过了,它有同样的错误。它适用于普通更新,但在联结表上更新它不起作用。谢谢
  • @Mihai 我忘了在我最近的帖子中输入 SET Grade = '1'。但它只输出相同的错误。谢谢
  • @Mihai 非常感谢。有用。对不起,我才刚刚开始学习 SQL。再次感谢您。

标签: mysql sql database vb.net phpmyadmin


【解决方案1】:

您的查询不稳定,应该如下所示

UPDATE student_subject 
INNER JOIN subject_bsit 
ON subject_bsit.subject_id = student_subject.sub_id 
SET grade=? 
where student_subject.student_id='" & Txtbox.Text & "' AND student_subject.sub_id = 1

【讨论】:

  • 您好,抱歉,我会更新我的问题,我忘了输入等级,但还是同样的错误,谢谢。
  • @Mihai 请在你的答案中使用参数。
【解决方案2】:

首先,您不更新 student_subject。 由于您的 subject_bsit 表中没有 student_id 列,因此您无法将成绩与学生相关联。

更新subject_bsit 设置等级 = @grade 其中subject_ID = @subject_ID

这将完成同样的事情。

这是我建议的架构。

学生

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| studentID   | int(11)      | NO   | PRI | NULL    | auto_increment |
| studentName | varchar(100) | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

成绩

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| studentID | int(11)      | NO   | PRI | NULL    |       |
| subjectID | int(11)      | NO   | PRI | NULL    |       |
| grade     | decimal(3,2) | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

两个外键

  1. grades.studentID (FK)

  2. grades.subjectID (FK)

请注意,成绩表有一个由 2 个字段组成的复合键。

主题

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| subjectID   | int(11)      | NO   | PRI | NULL    | auto_increment |
| subjectName | varchar(100) | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

与数据库通信时请始终使用参数。这将有助于保护您的数据库免受 Sql 注入。

即使出现错误,Using 块也会关闭并释放您的数据库对象。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim query As String = "Update grades 
                           Set grade = @grade
                           Where studentId = @studentId And subjectID = @subjectID"
    Using cn As New MySqlConnection(My.Settings.StudentConnection)
        Using cmd As New MySqlCommand(query, cn)
            cmd.Parameters.Add("@grade", MySqlDbType.Decimal).Value = 1
            cmd.Parameters.Add("@studentID", MySqlDbType.Int32).Value = CInt(TextBox1.Text)
            cmd.Parameters.Add("@subjectID", MySqlDbType.Int32).Value = 1
            cn.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
End Sub

要显示学生的成绩,请将 DataGridView 添加到表单中。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim dt As New DataTable
    Dim query As String = "Select st.studentName, sub.subjectName, g.grade
                            From grades g
                            Inner Join  students st  on g.studentID = st.studentID
                            Inner Join subjects sub on g.subjectID = sub.subjectID
                            Where st.studentID = @studentID;"
    Using cn As New MySqlConnection(My.Settings.StudentConnection)
        Using cmd As New MySqlCommand(query, cn)
            cmd.Parameters.Add("@studentID", MySqlDbType.Int32).Value = CInt(TextBox1.Text)
            cn.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
    End Using
    DataGridView1.DataSource = dt
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2017-06-08
    • 1970-01-01
    相关资源
    最近更新 更多