选择并显示属于特定ID的所有行

时间:2019-03-17 12:03:19

标签: mysql sql database vb.net phpmyadmin

我有

学生 student_subject subject_bsit

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

如您所见,表ID 1235是michael他有三个三个主题,subject_id 1,2和3。我想要做的是在文本框中而不是在datagrid视图中显示michael的所有主题名称和等级。 。

到目前为止,我仍然无法将其输出到文本框。这是我的示例查询

    sql = "SELECT subject_name " & _
        " FROM student_subject " & _
        " INNER JOIN subject_bsit ON subject_bsit.subject_id = student_subject.sub_id" & _
        " where student_subject.student_id='" & Txtbox.Text & "'"

上一个查询中的Txtbox.text是用户输入ID号的位置。

这是我在文本框中显示数据的代码。我对如何在文本框上循环并将其显示在每个文本框上没有任何想法或方法。

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

    While dr.Read
        TextBox1.Text = dr.Item("subject_name").ToString
        TextBox2.Text = dr.Item("subject_name").ToString
    End While

这是我要实现的示例用户界面。非常感谢。

enter image description here

2 个答案:

答案 0 :(得分:1)

当您读取查询的结果集时,就会使用一个循环。

While dr.Read
    ' run this for every row in your resultset 
    ...
End While

While循环不断进行,直到您读取了所有行。

您不必使用循环。如果您希望一次可以读取一行,就像这样

 If dr.Read
    ' just the first row
 End If
 If dr.Read
    ' just the second row
 End If
 If dr.Read
    ' just the third row
 End If
 ...

根据您的问题,我想您的表单上有Textbox1Textbox2,... Textbox5。我还猜你有Grade1Grade2 ....

要同时处理学科名称和年级,请将查询的第一行更改为

   sql = "SELECT subject_name, grade " & _

您可以像这样填充这些项目:

 If dr.Read
    TextBox1.Text = dr.Item("subject_name").ToString
    Grade1.Text = dr.Item("grade").ToString
 End If
 If dr.Read
    TextBox2.Text = dr.Item("subject_name").ToString
    Grade2.Text = dr.Item("grade").ToString
 End If
 If dr.Read
    TextBox3.Text = dr.Item("subject_name").ToString
    Grade3.Text = dr.Item("grade").ToString
 End If
 ' more of these sets of four lines to fill your whole form.

这可以解决您的问题。但是您可能会注意到它是重复的,荒谬的。您真正需要的是一个文本框数组(实际上是两个数组)。您在程序中创建然后填写这些texbox。 我还没有调试过:这是您要做的。

  Dim Subjects As Textbox()
  Dim Grades As Textbox()
  ...

  Dim rownumber, Y
  rownumber = 0
  Y = 200
  Dim Subject
  Dim Grade
  While dr.Read
    Subject = New Textbox
    Subject.Text = dr.Item("subject_name").ToString
    Subject.Width = 200
    Subject.Height = 40
    Subject.X = 175
    Subject.Y = Y
    Subjects(rownumber) = Subject
    Form.Controls.Add(Subject)
    Grade = New Textbox
    Grade.Text = dr.Item("grade").ToString
    Grade.Width = 50
    Grade.Height = 40
    Grade.X = 400
    Grade.Y = Y
    Grades(rownumber) = Grade
    Form.Controls.Add(Grade)
    rownumber = rownumber + 1
    Y = Y + 50
  End While

运行此命令时,将有两列控件,每个主题一列。但是这段代码很复杂,您必须先使用Something.Y = value然后是Y = Y + 50算术来完成表单的所有布局。

这就是为什么存在网格控件的原因。他们会照顾这种事情。

答案 1 :(得分:0)

如果要动态创建文本框,则应参考@OJones答案

您可以简单地遍历Me.Controls.OfType(Of TextBox)()

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

While dr.Read
    For Each txt As TextBox In Me.Controls.OfType(Of TextBox)()
        txt.Text = dr.Item("subject_name").ToString
    Next
End While

或者,如果您需要在文本框中填写第一个主题名称,则可以执行类似的方法(如果返回的主题超过文本框,则其他主题将被忽略)

While dr.Read = True

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

    If Not txt Is Nothing Then txt.Text = dr.Item("subject_name").ToString

    cnt += 1

End While
dr.Close()