2015-05-18 80 views
0

在我的程序中,用户可以将学生组合到一个班级中。在我的代码中,似乎有一些奇怪的逻辑错误;我的数据库通过StudentsGroups表将一个组链接到学生。虽然输入应该是这样的:添加到数据库时出现逻辑错误

+---------------------+----------------------------------+ 
|  studentsgroups |       groups | 
+---------+-----------+---------+-----------+------------+ 
| groupID | studentID | groupID | groupName | groupFocus | 
+---------+-----------+---------+-----------+------------+ 
|  1 |   1 |  1 | TestGroup |  Maths | 
|  1 |   2 +---------+-----------+------------+ 
|  1 |   3 | 
+---------+-----------+ 

我的输出,而不是像这样:

+---------+-----------+ 
| groupID | studentID | 
+---------+-----------+ 
|  1 |   0 | 
|  2 |   0 | 
|  3 |   0 | 
+---------+-----------+ 

随着groups表是空的。我没有收到任何错误消息,所以据我所知,我的代码运行良好,但在某个地方出现问题。

Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click 
    ' We create a new instance of a Groups object to store our entered values; the group's name 
    ' the group's focus and the students in this group 
    Dim newGroup As New Groups 
    newGroup.strGroupName = txtGroupName.Text 
    newGroup.strGroupFocus = cmbGroupFocus.SelectedValue 
    ' We add every student in this group list to the Groups object's student list. 
    For i As Integer = 0 To lstGroupList.Items.Count - 1 
     newGroup.addStudent(groupList.Item(i)) 
    Next 
    ' Firstly, we must insert a new group into the database. This will allow us to link every 
    ' student in the group to this group in our StudentsGroups table. 
    Using conn As New MySqlConnection(connString) 
     conn.Open() 
     Using cmd As New MySqlCommand 
      cmd.Connection = conn 
      cmd.CommandText = "INSERT INTO groups(groupName, groupFocus) VALUES(@grpName, @grpFocus);" 
      cmd.Parameters.AddWithValue("@grpName", newGroup.strGroupName) 
      cmd.Parameters.AddWithValue("@grpFocus", newGroup.strGroupFocus) 
     End Using 
     conn.Close() 
    End Using 
    Try 
     ' To get the ID of the group generated by the database, we make a temporary string to 
     ' hold the ID value. 
     Dim groupID As String 
     Using conn As New MySqlConnection(connString) 
      conn.Open() 
      Using selComm As New MySqlCommand 
       ' We create a SELECT query to find the new ID by using the entered group's name. 
       selComm.Connection = conn 
       selComm.CommandText = "SELECT groupID FROM groups WHERE groupName = @groupName;" 
       selComm.Parameters.AddWithValue("@groupName", newGroup.strGroupName) 
       selComm.Prepare() 
       ' We use the ExecuteScalar method, which would return the very first entry on the 
       ' first row. Since we only want one row and one result, this is better than using 
       ' a DataTable and DataReader. 
       groupID = selComm.ExecuteScalar() 
      End Using 
      conn.Close() 
     End Using 
     ' Now we begin to link the students to their group. We run through every student in the 
     ' group list and add in their ID along with the group's ID to the table. 
     For i As Integer = 0 To groupList.Count - 1 
      Using conn As New MySqlConnection(connString) 
       conn.Open() 
       Using newCommand As New MySqlCommand 
        newCommand.Connection = conn 
        newCommand.CommandText = "INSERT INTO studentsgroups VALUES(@groupID, @studentID);" 
        newCommand.Parameters.AddWithValue("@groupID", CInt(groupID)) 
        ' To get the student's ID, we do the same process as above; make a new 
        ' command to get the student's ID, using ExecuteScalar. 
        Dim studentID As String 
        ' When processing a new command, we need a new connection item to 
        Using conn2 As New MySqlConnection(connString) 
         conn2.Open() 
         Using comm2 As New MySqlCommand 
          comm2.Connection = conn2 
          comm2.CommandText = "SELECT idNumber FROM students WHERE passCode = @passcode" 
          comm2.Parameters.AddWithValue("@passcode", groupList.Item(i).intIDNum) 
          comm2.Prepare() 
          studentID = comm2.ExecuteScalar() 
         End Using 
         conn2.Close() 
        End Using 
        newCommand.Parameters.AddWithValue("@studentID", CInt(studentID)) 
        newCommand.Prepare() 
        newCommand.ExecuteNonQuery() 
       End Using 
       conn.Close() 
      End Using 
     Next 
    Catch ex As Exception 
     MsgBox("Error: " & ex.ToString()) 
    Finally 
     MsgBox("New Group created!") 
     Me.Close() 
    End Try 
End Sub 

这里是提交部分的相关代码,有人会知道逻辑问题可能出现在哪里吗?

回答

0

使用Groups表,您可以打开连接,格式化命令,然后关闭连接而不执行该命令。添加行

cmd.ExecuteNonQuery() 

在“Using cmd ...”块的末尾。

我没有看到导致您的GroupID发生变化的逻辑错误,但我怀疑罪魁祸首是studentgroups表的groupID列被设置为AutoIncrement(可能是因为大多数mySQL客户端将第一列默认为主键)。在构建表时注意这一点,切记只有唯一值应该设置为主键,并且不是每个表都需要主键。

至于为什么你的studentID列的每一行都是0,我在你的代码中遇到了一些麻烦。在线路:

comm2.CommandText = "SELECT idNumber FROM students WHERE passCode = @passcode" 
comm2.Parameters.AddWithValue("@passcode", groupList.Item(i).intIDNum) 

你似乎是:1)提供一个学生ID号2)寻找行,其中学生ID号密码列匹配和3)从这些行获得学生ID号。我不知道这是否是问题或如何解决它,而不知道更多关于您的数据库模式和GUI结构,但让我问你:

你需要编写一个查询来获得学生ID号码为小组中的每个人?用户似乎已经选择了要添加的学生,并且此信息已存储在您的表单中。就像:

newCommand.Parameters.AddWithValue("@groupID", CInt(groupID)) 
'Delete everything between these two lines 
newCommand.Parameters.AddWithValue("@studentID", groupList.Item(i).intIDNum) 

这应该工作,如果我推测你的设置正确。如果没有,请绘制学生表并详细解释您可以从表单中访问哪些列。

+0

最初的困惑更多的是我自己,因为我在数据库之前制定了很多加入学生的代码。所以当程序引用'IDNum'时,这与'passCode'列相同。但是,是的,这就是我想从我的代码中,将组中的每个人添加到列表中。 –

相关问题