vb.net - 多项选择测验:分数加起来不正确
问题描述
测验完成后,我回去测试它,发现分数加起来不正确。我已经检查了几次代码,看起来不错,但我不明白为什么它没有正确添加分数。我创建了一个子程序来检查正确答案并标记它,然后在单击按钮时调用它。
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
解决方案
您可能在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。这将使您避免在运行时出现错误。