2015-05-15 4 views
1

При чтении данных из таблицы одно из моих числовых значений возвращается как -1, а не значение, заданное пользователем.Странная проблема при получении данных из моей базы данных

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Try 
     Dim conn As New MySqlConnection("server=localhost;user=root;database=new_project;port=3306;password=********;") 
     conn.Open() 
     Dim command As New MySqlCommand("SELECT * FROM students;", conn) 
     Dim dataSet As New DataSet() 
     Dim dataAdapter As New MySqlDataAdapter() 
     dataAdapter.SelectCommand = command 
     dataAdapter.Fill(dataSet, "students") 
     Dim dataTable As DataTable = dataSet.Tables("students") 
     For x As Integer = 0 To dataTable.Rows.Count - 1 
      Dim newStudent As New Student 
      newStudent.intIDNum = dataTable.Rows(x).Item("idNumber") 
      newStudent.strFirstName = dataTable.Rows(x).Item("firstName") 
      newStudent.strLastName = dataTable.Rows(x).Item("lastName") 
      newStudent.chrGender = dataTable.Rows(x).Item("gender") 
      newStudent.dateDOB = dataTable.Rows(x).Item("dateOfBirth") 
      newStudent.intAge = CInt(Today.Year - newStudent.dateDOB.Year) 
      newStudent.intYearGroup = dataTable.Rows(x).Item("yearGroup") 
      newStudent.intSkillLevel = dataTable.Rows(x).Item("skillLevel") 
      studentList.Add(newStudent) 
      lstStudents.Items.Add(newStudent.nameConcat(newStudent.strFirstName, newStudent.strLastName)) 
     Next 
     conn.Close() 
    Catch ex As Exception 
     MsgBox("Error: " & ex.ToString()) 
    End Try 
End Sub 

При чтении значения «skillLevel» он должен читать от 1 до 4, но вместо этого он читает -1. Это не произошло с данными, добавленными непосредственно в базу данных через MySQL, но при использовании метода в моей программе, похоже, эта проблема возникает.

Dim newStudent As New Student 
     newStudent.strFirstName = txtForename.Text 
     newStudent.strLastName = txtSurname.Text 
     newStudent.dateDOB = dtpStudentDOB.Value 
     If rdbMale.Checked = True Then 
      newStudent.chrGender = "M" 
     Else 
      newStudent.chrGender = "F" 
     End If 
     newStudent.intAge = newStudent.calcAge(dtpStudentDOB.Value) 
     newStudent.intSkillLevel = cmbSkillLevel.SelectedItem 
     newStudent.intYearGroup = cmbYearGroup.SelectedItem 
     newStudent.intIDNum = CInt(txtStudentID.Text) 
     Dim conn As New MySqlConnection("server=localhost;user=root;database=new_project;port=3306;password=********;") 
     Try 
      conn.Open() 
      Dim command As MySqlCommand = New MySqlCommand 
      command.Connection = conn 
      command.CommandText = "INSERT INTO Students VALUES(@IdNumber, @firstName, @lastName, @gender, @dateOfBirth, @yearGroup, @skillLevel);" 
      command.Prepare() 
      command.Parameters.AddWithValue("@IdNumber", newStudent.intIDNum) 
      command.Parameters.AddWithValue("@firstName", newStudent.strFirstName) 
      command.Parameters.AddWithValue("@lastName", newStudent.strLastName) 
      command.Parameters.AddWithValue("@gender", newStudent.chrGender) 
      command.Parameters.AddWithValue("@dateOfBirth", newStudent.dateDOB) 
      command.Parameters.AddWithValue("@yearGroup", newStudent.intYearGroup) 
      command.Parameters.AddWithValue("@skillLevel", newStudent.intSkillLevel) 
      command.ExecuteNonQuery() 
     Catch ex As Exception 
      MsgBox("Error: " & ex.ToString()) 
     Finally 
      conn.Close() 
     End Try 

Это раздел кода, в котором ученик добавлен в систему. Что именно может вызвать эту ошибку?

Для справки, основной формой добавить в данных использует перечисление:

Private Enum SkillLevels As Integer 
    One = 1 
    Two = 2 
    Three = 3 
    Four = 4 
End Enum 

А потом я связать его с выпадающего меню: cmbSkillLevel.DataSource = System.Enum.GetValues(GetType(SkillLevels))

+0

Думаю, вам нужно 'newStudent.intSkillLevel = cmbSkillLevel.SelectedItem.Value'. 'SelectedItem' - это объект, поэтому, возможно, VB.NET неявно бросает его и дает вам ненадежную ценность? Вы можете найти достаточно легко, выставив окно сообщения с помощью 'newStudent.intSkillLevel = cmbSkillLevel.SelectedItem' и' newStudent.intSkillLevel = cmbSkillLevel.SelectedItem.Value'. –

+0

Я попытался использовать 'cmbSkillLevel.SelectedValue', но проблема не устранена. Однако это происходит только в том случае, если я закрываю программу и затем снова ее открываю. –

+0

Что такое тип стороны базы данных столбца skillLevel? Предполагая, что это целочисленный тип, вы пробовали передать команду. Параметр.AddWithValue ("@ skillLevel", CInt (newStudent.intSkillLevel))? – tolanj

ответ

0

Я думаю, что я неправильно интерпретировал комментарии @ tolanj. Похоже, что при загрузке моих данных система не могла прочитать мой столбец skillLevel. Чтобы исправить это, я изменил newStudent.intSkillLevel = row.Item("skillLevel") на newStudent.intSkillLevel = SByte.Parse(row.Item("skillLevel")).

0

Очевидная возможность не что ни выбор был сделан в выпадающее меню SKILL-LEVEL, и именно поэтому вы получаете -1, вы можете проверить, был ли выделен выбор в раскрывающемся списке, гарантируя, что он не равен -1

Например, ваши навыки выпадающего списка могут выглядеть так:

<select id="SkillLevel"> 
    <option value="0" selected="selected">Please Select</option> 
    <option value="1">Low</option> 
    <option value="2">Medium</option> 
    <option value="3">High</option> 
    <option value="4">Very-High</option> 
</select> 

Если выбор не сделан значение по умолчанию, возвращаемый будет равен нулю (0) И вы можете проверить действительных значений путем поиска возвращаемых значений> 0

Насколько я помню, если опустить selected = "selected", тогда возвращаемое значение будет -1

+0

В раскрывающемся списке нет нулевой опции. Дизайн состоит из четырех вариантов и ничего больше. Позвольте мне добавить подробности в вопросе. –

+0

Независимо от того, имеет ли он параметр с нулем или нет, когда выбрано НЕТ, возвращаемое значение ВСЕГДА -1, поэтому это означает, что форма была отправлена ​​до того, как был представлен уровень навыков. – Zeddy

Смежные вопросы