none
问一个特殊的随机出试卷的问题 RRS feed

  • 问题

  • 是这样的,自己首先在Page_Load中编写了

            Dim Rnumber = Int(Rnd() * 2) + 1
            SqlDataSource4.ConnectionString = WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
            SqlDataSource4.SelectCommand = "SELECT * FROM 试卷 WHERE [试卷编号] = " & Rnumber
            GridView4.DataSourceID = SqlDataSource4.ID

    这样就从[试卷编号]为1至3之间随机抽出了一个值,并把以这个值为[试卷编号]的题全部都显示了出来,但是问题是作为管理员并不知道教师在试卷中设置了多少的[试卷编号],教师可能今天出一份试卷,明天也出一份试卷,那样Int(Rnd()*2)+1中的“2”的取值就不明朗了,因为它是动态的,考生今天参加考试可能抽取不到老师昨天刚刚出的那份新试卷,除非管理员非常勤劳,每天负责修改这个“2”的取值,显然这样就太麻烦了,不知道如何让”WHERE[试卷编号]= “一个目前[试卷]中最大[试卷编号]之内的一个随机值。


    qianghuishi

    2012年3月31日 7:21

答案

  • 补充说明,结合TerryChuang和你的思路,您不妨参考这个方法:

    1)使用"Select max(最大试卷编号字段名称) from xxx" 从而选出最大的那个试卷编号(用SqlCommand的ExecuteScalar方法获取)。
    2)然后使用Rnd()*最大试卷编号+1的方法取整数(获取1~最大试卷编号)之内的随机序号,
    注意VB中先用Randomize函数随机化随机数产生器。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月1日 0:54
  • 有缘人好,觉得你说的思路是非常正确的,但是自己没使用过ExecuteScalar,不知道使用"Select max(最大试卷编号字段名称) from xxx" 从而选出最大的那个试卷编号(用SqlCommand的ExecuteScalar方法获取)。怎么写?

    qianghuishi

    using (SqlCommand cmd = new SqlCommand("select max(你的字段名称) from xxx",new SqlConnection("字符串连接……")))
    {
       cmd.Connection.Open();
       int result = (int)cmd.ExecuteScalar();
       cmd.Connection.Close();
       //做其它事情……
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 强辉史 2012年4月1日 2:17
    2012年4月1日 1:20
  • 你先到SQL Management Studio中执行SELECT MAX(试卷编号)FROM 编程卷看看有什么问题?

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 强辉史 2012年4月1日 2:17
    2012年4月1日 2:02
  • 有缘人,自己使用的是VB,所以自己把你的语句修改了一下,但是还是出现了错误,请指正

     

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim myconnection As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;Integrated Security=True;User Instance=True")
            Dim cmd As New SqlCommand("SELECT MAX(试卷编号)FROM 编程卷", myconnection)
            cmd.Connection.Open()
            Dim result As Integer = cmd.ExecuteScalar()
            cmd.Connection.Close()
            Dim Rnumber = Int(Rnd() * result) + 1
            SqlDataSource4.ConnectionString = WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString

    SqlDataSource4.SelectCommand = "SELECT * FROM 编程卷 WHERE [试卷编号] = " & Rnumber
            GridView4.DataSourceID = SqlDataSource4.ID

    提示的错误是Dim result As Integer = cmd.ExecuteScalar();自己改成Dim result As Integer =int( cmd.ExecuteScalar())还是报错,不知道怎么修改?


    qianghuishi

    • 已标记为答案 强辉史 2012年4月1日 2:17
    2012年4月1日 1:55

全部回复

  • 太难了吗?

    qianghuishi

    2012年3月31日 8:57
  • 期待奇迹出现哈

    qianghuishi

    2012年3月31日 13:00
  • 其实自己真的非常着急!顶自己一下!

    qianghuishi

    2012年3月31日 13:19
  • 补充一下,如果使用SqlDataAdapter与datatable来先把[试卷编号]存储起来,然后从中随机抽取一个值,最后把这个值填入到SqlDataSource4.SelectCommand = "SELECT * FROM 试卷 WHERE [试卷编号] = "应该就能解决吧。                                                   

    SqlDataSource4.ConnectionString = WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
            Dim dad As New SqlDataAdapter("SELECT DISTINCT 试卷编号 FROM 编程卷", WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
            Dim dtb As New DataTable()
            dad.Fill(dtb)
            Dim rnd As New Random()
            Dim ranRow As DataRow = dtb.Rows(rnd.Next(dtb.Rows.Count))
            Dim result As New SqlDataRecord(New SqlMetaData("试卷编号", SqlDbType.Int))
            result.SetSqlInt32(0, CType(ranRow("试卷编号"), Integer))
            SqlDataSource4.SelectCommand = "SELECT * FROM 编程卷 WHERE [试卷编号] = "
            GridView4.DataSourceID = SqlDataSource4.ID
    不知道这里的result是不是就是那个值呢?但填入之后始终不对,继续求教!真急!~哎~


    qianghuishi

    2012年3月31日 13:32
  •         SqlDataSource4.SelectCommand = "SELECT * FROM 试卷 WHERE [试卷编号] = " & Rnumber
    ”WHERE[试卷编号]= “一个目前[试卷]中最大[试卷编号]之内的一个随机值。


    qianghuishi

    把SQL语句改成这样试试

    SELECT Top 1 * FROM 试卷
    Order by NewId()

    意思为从现有试卷中随机挑一张试卷


    2012年3月31日 13:48
  • 請問可以舉例說明有關一個目前試卷中最大試卷編號之內的一個隨機值嗎?

    因為就我的理解既然是最大編號那就是用MAX(試卷編號)就可以了,已經是最大值,怎麼做隨機呢?


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年3月31日 15:16
  • 你好,不是这样子的,使用你的语句只是从[试卷]中抽出一道随机试题,在[试卷]这张表中有很多的试题,[试卷编号]作为其中一列存在于[试卷]中,一部分试题的[试卷编号]为1,一部分为2,以此类推,到底有多少的[试卷编号],是老师在组卷添加或修改试题时决定的,现在考生进去后,需要显示特定[试卷编号]的所有试题,但由于[试卷编号]时刻都可能会变,今天老师编了5张试卷,明天又编了6,7,8,9,10张,所以怎么使用WHERE,能在1至最大[试卷编号]之内随机选择一个数,这样不管老师编了多少试卷,但最大[试卷编号]总是在的,你能明白我的意思吗?

    qianghuishi

    2012年4月1日 0:33
  • 补充说明,结合TerryChuang和你的思路,您不妨参考这个方法:

    1)使用"Select max(最大试卷编号字段名称) from xxx" 从而选出最大的那个试卷编号(用SqlCommand的ExecuteScalar方法获取)。
    2)然后使用Rnd()*最大试卷编号+1的方法取整数(获取1~最大试卷编号)之内的随机序号,
    注意VB中先用Randomize函数随机化随机数产生器。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月1日 0:54
  • 不知道这样讲师傅可不可以理解:

    数据库中有一张[试卷]表,里面有很多很多题目,其中有一列[试卷编号],每个题目都有属于自己的试卷编号,每个试卷编号也对应很多的题目,比如吧,[试卷]表中前十行题目都是试卷编号1,后十行题目都是试卷编号2,再后十行是试卷编号3,以此类推,但这试卷编号的最大值是教师在组卷时往[试卷]表中添加或者修改试题时决定的,他(她)每填加一道试题,在试卷编号这一列内都会设置一个值,比如今天,教师又在[试卷]表中添加了10行题目,它们的试卷编号都是4

    下面是考生进入答题界面了,作为管理员得把考试的题目显示给他们,随机地从[试卷]表中使用如“WHERE [试卷编号]=1”来把最前面的十行题显示出来,那也就是一份试卷了,使用如“WHERE [试卷编号]=2"来吧第11行至20行的题目显示出来,这就是另一份试卷了,但现在是从[试卷]表中随机把对应的试卷编号的题显示出来,如使用Dim Rnumber = Int(Rnd() * 3) + 1;然后使用WHERE[试卷编号]=Rumber;这样就能随机从[试卷]中抽取[试卷编号]为1至4中的某一个值的那十道题了,但是做为管理员,我们该如何确定这个Int(Rnd()*3)+1中的3呢?因为可能教师明天又会添加10行题目,试卷编号为5,后天又是10行题目,试卷编号为6...那我们管理员不可能明天把3改成4,后天把4改成5...这样就太麻烦了,也不可能把3改成MAX(试卷编号),因为MAX(试卷编号)是T-SQL语句中,Dim Rnumber = Int(Rnd() * 3) + 1是VB.NET语句中的,所以怎么样才能实现目前,当前,现在,此时此刻[试卷]中从[试卷编号]为1到最大的[试卷编号]随机选出一个随机数,你可以理解我讲的吗?


    qianghuishi

    2012年4月1日 0:59
  • 有缘人好,觉得你说的思路是非常正确的,但是自己没使用过ExecuteScalar,不知道使用"Select max(最大试卷编号字段名称) from xxx" 从而选出最大的那个试卷编号(用SqlCommand的ExecuteScalar方法获取)。怎么写?

    qianghuishi

    2012年4月1日 1:12
  • 有缘人好,觉得你说的思路是非常正确的,但是自己没使用过ExecuteScalar,不知道使用"Select max(最大试卷编号字段名称) from xxx" 从而选出最大的那个试卷编号(用SqlCommand的ExecuteScalar方法获取)。怎么写?

    qianghuishi

    using (SqlCommand cmd = new SqlCommand("select max(你的字段名称) from xxx",new SqlConnection("字符串连接……")))
    {
       cmd.Connection.Open();
       int result = (int)cmd.ExecuteScalar();
       cmd.Connection.Close();
       //做其它事情……
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 强辉史 2012年4月1日 2:17
    2012年4月1日 1:20
  • 有缘人,自己使用的是VB,所以自己把你的语句修改了一下,但是还是出现了错误,请指正

     

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim myconnection As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;Integrated Security=True;User Instance=True")
            Dim cmd As New SqlCommand("SELECT MAX(试卷编号)FROM 编程卷", myconnection)
            cmd.Connection.Open()
            Dim result As Integer = cmd.ExecuteScalar()
            cmd.Connection.Close()
            Dim Rnumber = Int(Rnd() * result) + 1
            SqlDataSource4.ConnectionString = WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString

    SqlDataSource4.SelectCommand = "SELECT * FROM 编程卷 WHERE [试卷编号] = " & Rnumber
            GridView4.DataSourceID = SqlDataSource4.ID

    提示的错误是Dim result As Integer = cmd.ExecuteScalar();自己改成Dim result As Integer =int( cmd.ExecuteScalar())还是报错,不知道怎么修改?


    qianghuishi

    • 已标记为答案 强辉史 2012年4月1日 2:17
    2012年4月1日 1:55
  • 你先到SQL Management Studio中执行SELECT MAX(试卷编号)FROM 编程卷看看有什么问题?

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 强辉史 2012年4月1日 2:17
    2012年4月1日 2:02
  • 成功了成功了!哈哈~原因居然是试卷编号左边的括号与右边的括号不同. 万分感谢!~

    qianghuishi

    2012年4月1日 2:16