对不起,我的英语不好。
我在使用联结表时遇到问题,它仅返回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()
答案 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()
您传递给datareader对象的索引是列索引,而不是行索引,还必须使用循环而不是if条件:
cmd = New MySqlCommand(sql, myconn)
dr = cmd.ExecuteReader()
While dr.Read = True Then
Msgbox(dr(0).Tostring())
End While
dr.Close()
首先,您必须确保文本框的数量小于或等于返回的行数。
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中显示结果?