Vb.net 对输入的号码进行测验

Vb.net 对输入的号码进行测验,vb.net,Vb.net,我对编程很陌生,所以请原谅我缺乏知识 我正在尝试为我的项目创建一个测验,但遇到了问题。目前,我正在尝试运行测验,直到问题数量与用户在上一表单的组合框中输入的所需数量相同。虽然这部分起作用,但问题是,当您第二次单击按钮时,速度非常慢,并且会冻结 Imports System.Data.OleDb Public Class ArithmeticQuestions Dim NoQ = ArQOP.NoQ Dim dr As OleDbDataReader Dim cm A

我对编程很陌生,所以请原谅我缺乏知识

我正在尝试为我的项目创建一个测验,但遇到了问题。目前,我正在尝试运行测验,直到问题数量与用户在上一表单的组合框中输入的所需数量相同。虽然这部分起作用,但问题是,当您第二次单击按钮时,速度非常慢,并且会冻结

Imports System.Data.OleDb
Public Class ArithmeticQuestions

    Dim NoQ = ArQOP.NoQ


    Dim dr As OleDbDataReader
    Dim cm As New OleDbCommand
    Dim cn As New OleDbConnection
    Dim n As Integer = 1

    Private Sub ArithmeticQuestions_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Label1.Hide()
        RadioButton1.Hide()
        RadioButton2.Hide()
        RadioButton3.Hide()
        RadioButton4.Hide()
        SkipQues.Hide()
        NxtQues.Hide()


    End Sub

    Sub Questions()
        cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=login.accdb"
        cn.Open()
        cm.CommandText = "SELECT Questions FROM MCQ WHERE QuestionNumber ='" & n & "'"
        cm.Connection = cn
        dr = cm.ExecuteReader
        dr.Read()
        Label1.Text = dr.Item("Questions")
        cn.Close()
    End Sub

    Private Sub NxtQues_Click(sender As Object, e As EventArgs) Handles NxtQues.Click
        n = n + 1
        Do
            Call Questions()
        Loop Until n = NoQ
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles StartQuiz.Click
        Label1.Show()
        RadioButton1.Show()
        RadioButton2.Show()
        RadioButton3.Show()
        RadioButton4.Show()
        SkipQues.Show()
        NxtQues.Show()
        StartQuiz.Hide()
        Call Questions()

    End Sub

End Class

任何帮助都将不胜感激。

我猜NoQ是用户请求的问题数量

将数据库对象保持在使用它们的方法的本地,以便可以控制它们是否被关闭和释放。使用…End Using块即使出现错误,也要为您解决这个问题。可以将连接字符串直接传递给连接的构造函数,将命令文本和连接直接传递给命令的构造函数

始终使用参数。我不得不猜测OLEDB类型。检查数据库中的正确类型,并相应地调整代码。看起来您正在检索单个数据段,因此可以使用.ExecuteScalar获取结果集第一行的第一列

在按钮代码中,我只是增加了问题数量,并检查是否与最大问题数量相对应

Dim NoQ = ArQOP.NoQ
Dim n As Integer

Private Sub Questions()
    Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=login.accdb"),
            cmd As New OleDbCommand("SELECT Questions FROM MCQ WHERE QuestionNumber = @QuestionNumber;", cn)
        cmd.Parameters.Add("@QuestionNumber", OleDbType.Integer).Value = n
        cn.Open()
        Label1.Text = cmd.ExecuteScalar.ToString
    End Using
End Sub

Private Sub NxtQues_Click(sender As Object, e As EventArgs) Handles NxtQues.Click
    n += 1
    If n <= NoQ Then
        Questions()
    End If
End Sub
Dim NoQ=ArQOP.NoQ
作为整数的Dim n
私人次级问题()
使用cn作为新的OLEDB连接(“Provider=Microsoft.ACE.OLEDB.12.0;数据源=login.accdb”),
cmd作为新的OleDbCommand(“从MCQ中选择问题,其中QuestionNumber=@QuestionNumber;”,cn)
cmd.Parameters.Add(“@QuestionNumber”,OleDbType.Integer)。值=n
cn.Open()
Label1.Text=cmd.ExecuteScalar.ToString
终端使用
端接头
私有子NxtQues\u单击(发送者作为对象,e作为事件参数)处理NxtQues。单击
n+=1

如果n Yikes,这看起来很可怕,容易受到sql注入问题的攻击@JoelCoehoorn由于
n
被声明为
整数且用户无法更改,您能否解释一下如何注入上述代码,我很想知道如何做到这一点。@chođxěŕ您可以在Windows中覆盖默认的系统数字格式,以包含负号、小数点的任意文本,或组分隔符。用户界面只允许您从列表中选择,但该控件的实际注册表设置可以设置为任何值。@đ;放下桌上的问题--0
,其中所有额外的文本都只是一个漂亮的小数点。负号和群分隔符也有类似的问题。在这种情况下,
1.0
-1
不太可能是值,但您也可以针对不同的区域性更改组分隔符出现的频率。主要的是,我们有参数化的查询,它们其实并不难。使用它们。@đěxěŕ很酷;)在这种情况下,我怀疑任何人都不会有那么多的动机来真正破解他的小项目,但总是会发生的事情是,一旦应用程序具有真正有意义的部署大小,您就会遇到一个具有自定义(非恶意)的人数字格式做了一些你没有预料到的事情,只会破坏查询。谢谢,这真的很有帮助。我使用了该代码并得到了以下错误:“对象引用未设置为对象的实例”来解决我所更改的是第5行,因此它不是@QuestionNumber,而是&n&“'”,并使n等于1,我删除了第6行,