通过 Access 数据库随机化 RadioButtons 中的答案

Posted

技术标签:

【中文标题】通过 Access 数据库随机化 RadioButtons 中的答案【英文标题】:Randomize answers in RadioButtons through Access database 【发布时间】:2019-12-21 20:36:36 【问题描述】:

我目前正在做多项选择测验,但在这部分遇到了问题。我正在尝试从数据库中获取答案并让它们随机进入单选按钮。到目前为止,我让它们中的每一个都进入单选按钮,但由于我是新手,我不确定如何随机化它。

Private Sub Answers()
    Dim dr As OleDbDataReader
    Dim cm As New OleDbCommand
    Dim cn As New OleDbConnection

    cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=login.accdb"
    cn.Open()

    cm.CommandText = ("SELECT pAns1,pAns2,pAns3,CorrectAns FROM MCQ WHERE QuestionNumber = '" & n & "'")
    cm.Connection = cn
    dr = cm.ExecuteReader
    dr.Read()
    RadioButton1.Text = dr.Item("pAns1")
    RadioButton2.Text = dr.Item("pAns2")
    RadioButton3.Text = dr.Item("pAns3")
    RadioButton4.Text = dr.Item("CorrectAns")
End Sub

【问题讨论】:

我明白了,仍然存在 sql 注入问题。这重要! 有两种安全问题太重要了,永远不能以错误的方式处理......即使对于学校的学习项目也是如此。其中之一是密码处理。 永远不要以纯文本形式存储密码,即使是在为学校布置作业时也是如此。 (即使加密也不够好。)另一个是sql注入。 要求您构建类似的东西之前,讲师应该向您展示参数化查询。 查看OleDbParameter类型和OleDbCommand.Parameters属性。 @JoelCoehoorn:请放松。你甚至不知道变量n 的来源。参数的使用当然是首选,但最常见的原因是 SQL 注入以外的其他原因,尤其是在接触不允许嵌套 SQL 语句的 Access SQL 时。 请开启 Option Strict。这是一个两部分的过程。首先对于当前项目 - 在解决方案资源管理器中双击我的项目。选择左侧的编译。在 Option Strict 下拉列表中选择 ON。未来项目的第二个 - 转到工具菜单 -> 选项 -> 项目和解决方案 -> VB 默认值。在 Option Strict 下拉列表中选择 ON。这将使您避免在运行时出现错误。 【参考方案1】:

你可以这样做:

'A class level variable.
Private ReadOnly rand As New Random

Private Sub Answers()
    Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=login.accdb")
        Using cmd As New OleDbCommand("SELECT pAns1, pAns2, pAns3, CorrectAns FROM MCQ WHERE QuestionNumber = ?", cn)
            cmd.Parameters.AddWithValue("@QuestionNumber", n)
            cn.Open()
            Using r As OleDbDataReader = cmd.ExecuteReader
                Dim arr = 
                        r.GetOrdinal("pAns1"),
                        r.GetOrdinal("pAns2"),
                        r.GetOrdinal("pAns3")
                    .OrderBy(Function(x) rand.Next).ToArray
                If r.Read Then
                    RadioButton1.Text = r.Item(arr(0)).ToString
                    RadioButton2.Text = r.Item(arr(1)).ToString
                    RadioButton3.Text = r.Item(arr(2)).ToString
                End If
            End Using
        End Using
    End Using
End Sub

请注意:

sn-p 尊重上述 cmets。

您应该关闭连接并处理一次性对象。 Using ... End Using 块将为您做到这一点。

对于 randomize 要求,我们获取列序数以创建整数数组并 shuffle 内容。您可能想阅读this 帖子以了解不同的数组改组 方式。

【讨论】:

请注意:AddWithValue is Evil、AddWithValue is evil! 和 Can we stop using AddWithValue() already?。 @AndrewMorton 同意。不管我是否已经知道,提醒总是好的和感激的。谢谢你的朋友。

以上是关于通过 Access 数据库随机化 RadioButtons 中的答案的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access VB 随机生成器

c# - 从 ms access 数据库中随机生成数据

在 Ms. Access 中生成随机字母数字密钥

如何创建随机数的多个阵列为JavaScript数据随机化?

通过并行化加速随机数生成

在 Access 中生成随机字母数字字符串后检查重复项