如何根据学生证在联结表上进行选择

时间:2019-03-16 21:19:43

标签: mysql sql .net database vb.net

对不起,我的英语不好。

我在使用联结表时遇到问题,它仅返回1个主题,这是我的查询。

我有一个 Student_tbl Subject_tbl student_subject_tbl 连接表。

这是我使用vb.net的查询

SELECT subject_name 
FROM student_subject 
     JOIN student ON student.StudentID = student_subject.student_id 
     JOIN subject_bsit ON subject_bsit.subject_id = student_subject.sub_id 
WHERE student.StudentID='" & TextBox1.Text & "'"

我想做的是只选择属于 student_id 学生ID的所有受试者名称,该名称等于我在vb.net中的文本框,即我将在其中输入学生的学生证。非常感谢您。

编辑: 我正在尝试在文本框中显示输入的学生ID的所有主题名称的值。这是我显示的vb.code,仅显示 subject_tbl

上的第一个主题
cmd = New MySqlCommand(sql, myconn)
        dr = cmd.ExecuteReader
        If dr.Read = True Then
            TextBox2.Text = dr(0)
            'Label4.Text = dr(1)
            TextBox4.Text = dr(1)
            TextBox5.Text = dr(2)
            TextBox6.Text = dr(3)
            TextBox7.Text = dr(4)
            TextBox8.Text = dr(5)
            dr.Close()

1 个答案:

答案 0 :(得分:1)

由于Id也存储在联结表中,并且您没有在检索学生信息,因此您不必与学生表联接,也可以使用参数化命令而不是手动构建命令,以避免SQL注入< / strong>。

尝试使用以下代码:

Dim strQuery as string = "SELECT subject_name " & _
" FROM student_subject " & _
" INNER JOIN subject_bsit ON subject_bsit.subject_id = student_subject.sub_id" & _
" WHERE student_subject.student_id = @StudentID"

Dim cmd as New MySqlCommand(strQuery,connection)

cmd.AddParameterWithValue("@StudentID",Textbox1.text)

cmd.ExecuteReader()

更新1

您传递给datareader对象的索引是列索引,而不是行索引,还必须使用循环而不是if条件:

cmd = New MySqlCommand(sql, myconn)
dr = cmd.ExecuteReader()

While dr.Read = True Then

    Msgbox(dr(0).Tostring())

End While
dr.Close()

更新2-动态传递文本框名称

首先,您必须确保文本框的数量小于或等于返回的行数。

cmd = New MySqlCommand(sql, myconn)
dr = cmd.ExecuteReader()
Dim cnt as Integer = 1

While dr.Read = True Then

    Dim txt As New TextBox = DirectCast(Me.Controls.Find(string.Format("Textbox{0}", cnt ),false).FirstOrDefault(),Textbox);

    txt.Text = dr(0).ToString()

    cnt += 1

End While
dr.Close()

但是为什么不在GridView中显示结果?