首页 > 解决方案 > 多项选择测验:分数加起来不正确

问题描述

测验完成后,我回去测试它,发现分数加起来不正确。我已经检查了几次代码,看起来不错,但我不明白为什么它没有正确添加分数。我创建了一个子程序来检查正确答案并标记它,然后在单击按钮时调用它。

Dim NoQ = ArQOP.NoQ
   Dim n As Integer = 1
   Dim rand As New Random
   Dim dr As OleDbDataReader
   Dim CorrectAnswer As String
   Public Score As Integer = 0
   Dim SelectedAnswer As String
   Dim username = Entry.user
   Dim Percentage As Integer
   Dim Grade As String
   Dim sqlString As String

Private Sub AnsCheck()

       Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=login.accdb"),
               cmd As New OleDbCommand("SELECT CorrectAns FROM MCQ WHERE QuestionNumber = '" & n & "'", cn)
           cn.Open()
           CorrectAnswer = cmd.ExecuteScalar
       End Using

       If RadioButton1.Checked Then
           SelectedAnswer = RadioButton1.Text
       End If

       If RadioButton2.Checked Then
           SelectedAnswer = RadioButton2.Text
       End If

       If RadioButton3.Checked Then
           SelectedAnswer = RadioButton3.Text
       End If

       If RadioButton4.Checked Then
           SelectedAnswer = RadioButton4.Text
       End If

       If CorrectAnswer = SelectedAnswer Then
           Score += 1
       Else
           Score = Score
       End If

   End Sub


Private Sub NxtQues_Click(sender As Object, e As EventArgs) Handles NxtQues.Click
       n += 1
       If n <= NoQ Then
           Questions()
           Answers()
           AnsCheck()
       Else
           SkipQues.Hide()
           NxtQues.Hide()
           EndQuiz.Show()
           StatsCalc()
       End If
   End Sub 

标签: vb.net

解决方案


您可能在SELECT CorrectAns FROM MCQ WHERE QuestionNumber = '" & n & "'"您已将 n 声明为 Integer 中存在类型不匹配,但您正试图将其连接成一个字符串。使用参数,您将避免这些问题。如果您检查您的数据库以获取 ,OleDbType您将立即看到要分配给什么类型的变量.Value

cmd.ExecuteScalar返回一个对象,因此需要将其更改为字符串。

我有一个小功能来获取选定的单选按钮。在这种情况下,您通过Me了表单。很多时候,容器控件可能是一个 GroupBox,而您将传递 GroupBox。

我并没有真正看到您的代码增加分数的问题。

Private Sub AnsCheck()

    Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=login.accdb"),
           cmd As New OleDbCommand("SELECT CorrectAns FROM MCQ WHERE QuestionNumber = @n;", cn)
        cmd.Parameters.Add("@n", OleDbType.Numeric).Value = n
        cn.Open()
        CorrectAnswer = CStr(cmd.ExecuteScalar)
    End Using

    SelectedAnswer = GetSelectedRadioButton(Me).Text

    If CorrectAnswer = SelectedAnswer Then
        Score += 1
    End If

End Sub

Private Function GetSelectedRadioButton(ctrl As ContainerControl) As RadioButton
    Dim rButton As RadioButton = ctrl.Controls.OfType(Of RadioButton).FirstOrDefault(Function(r) r.Checked = True)
    Return rButton
End Function

请开启 Option Strict。这是一个两部分的过程。首先对于当前项目 - 在解决方案资源管理器中双击我的项目。选择左侧的编译。在 Option Strict 下拉列表中选择 ON。未来项目的第二个 - 转到工具菜单 -> 选项 -> 项目和解决方案 -> VB 默认值。在 Option Strict 下拉列表中选择 ON。这将使您避免在运行时出现错误。


推荐阅读