【问题标题】:Select and display all rows belonging to a specific ID选择并显示属于特定 ID 的所有行
【发布时间】:2019-03-17 12:03:19
【问题描述】:

我有

studentstudent_subjectsubject_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。我想要做的是在文本框中显示 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

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

【问题讨论】:

  • 欢迎来到 Stack Overflow。在这里提问无需说“对不起”:欢迎初学者!你的问题写得很好。
  • 我会更改您的数据库架构。成绩不属于主题表。应该有一个包含学生 ID、学科 ID 和成绩的表格。
  • @Mary 嗨。是的,我现在遇到了麻烦,因为我无法更新连接表中的成绩。我是否应该为它创建一个新主题,我昨天正在做,然后我再次访问这里,然后阅读您的回复,我应该制作另一个连接表吗? student_grade 包含 student_id subject_id 和成绩?
  • 设置成绩表的主键。由 studentID 和 subjectID 组成的两列 PK 将起作用。

标签: mysql sql database vb.net phpmyadmin


【解决方案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。我也猜你有Grade1, Grade2 ....

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

   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 = valueY = Y + 50 算术来完成表单的所有布局。

这就是存在网格控件的原因。他们会处理这种事情。

【讨论】:

    【解决方案2】:

    如果您希望动态创建文本框,则应参考@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()
    

    【讨论】:

    • ThenWhile 循环中?
    • @Mary 哎呀我修好了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2021-12-11
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多