Как обновить строку в соединительной таблице для оценки ученика - PullRequest
1 голос
/ 19 марта 2019

Вот и я снова.Большое спасибо за помощь.

Вот мой старый вопрос о том, как я могу выбрать и отобразить оценку ученика в распределительной таблице.

Выделить и отобразить все строки, относящиеся к определенному идентификатору

Я сделал это успешно, но теперь у меня возникают проблемы с обновлением оценки в соединениитаблица.

Здесь снова моя таблица примеров.

    "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     |

И вот запрос, который я сделал.Это пример того, как я пытаюсь обновить оценку studentID 1235 с subject_id = 1

ОБНОВЛЕНИЕ 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 & пользователь вводит студента, не обращая на это внимания.Большое спасибо, я использую visual studion vb.net.

И это именно та ошибка, которую я получил.

У вас ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом со значением «FROM student_subject INNER JOIN subject_bsit ON subject_bsit.subject_id = studen» в строке 1

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Во-первых, вы не ОБНОВЛЯЕТе student_subject. Поскольку в таблице subject_bsit нет столбца student_id, вы не можете связать оценку со студентом.

ОБНОВЛЕНИЕ subject_bsit Установить оценку = @grade Где subject_ID = @ subject_ID

Это сделало бы то же самое.

Это схема, которую я предлагаю.

1010 * Студенты *

+-------------+--------------+------+-----+---------+----------------+
| 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) <- Students.studentID (PK) </p>

  2. grades.subjectID (FK) <- subjects.subjectID (PK) </p>

Обратите внимание, что таблица оценок содержит составной ключ, состоящий из 2 полей.

предметы

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

Пожалуйста, всегда используйте параметры при связи с базой данных. Это поможет защитить вашу базу данных от Sql Injection.

Блоки Использование закрывают и удаляют объекты базы данных даже в случае ошибки.

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
2 голосов
/ 19 марта 2019

Ваш запрос колеблется, он должен быть как ниже

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...