积极答复者
问一个特殊的随机出试卷的问题

问题
-
是这样的,自己首先在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
答案
-
补充说明,结合TerryChuang和你的思路,您不妨参考这个方法:
1)使用"Select max(最大试卷编号字段名称) from xxx" 从而选出最大的那个试卷编号(用SqlCommand的ExecuteScalar方法获取)。
2)然后使用Rnd()*最大试卷编号+1的方法取整数(获取1~最大试卷编号)之内的随机序号,
注意VB中先用Randomize函数随机化随机数产生器。
- 已编辑 ThankfulHeart 2012年4月1日 0:54
- 已标记为答案 强辉史 2012年4月1日 2:17
-
有缘人好,觉得你说的思路是非常正确的,但是自己没使用过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(); //做其它事情…… }
- 已标记为答案 强辉史 2012年4月1日 2:17
-
有缘人,自己使用的是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").ConnectionStringSqlDataSource4.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
全部回复
-
补充一下,如果使用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
-
SqlDataSource4.SelectCommand = "SELECT * FROM 试卷 WHERE [试卷编号] = " & Rnumber
”WHERE[试卷编号]= “一个目前[试卷]中最大[试卷编号]之内的一个随机值。
qianghuishi
把SQL语句改成这样试试
SELECT Top 1 * FROM 试卷
Order by NewId()意思为从现有试卷中随机挑一张试卷
- The blog of typewriter職人
- Convert C# to VB.NET
- /*If my concept is wrong ,please correct me.Thanks.*/
-
你好,不是这样子的,使用你的语句只是从[试卷]中抽出一道随机试题,在[试卷]这张表中有很多的试题,[试卷编号]作为其中一列存在于[试卷]中,一部分试题的[试卷编号]为1,一部分为2,以此类推,到底有多少的[试卷编号],是老师在组卷添加或修改试题时决定的,现在考生进去后,需要显示特定[试卷编号]的所有试题,但由于[试卷编号]时刻都可能会变,今天老师编了5张试卷,明天又编了6,7,8,9,10张,所以怎么使用WHERE,能在1至最大[试卷编号]之内随机选择一个数,这样不管老师编了多少试卷,但最大[试卷编号]总是在的,你能明白我的意思吗?
qianghuishi
-
补充说明,结合TerryChuang和你的思路,您不妨参考这个方法:
1)使用"Select max(最大试卷编号字段名称) from xxx" 从而选出最大的那个试卷编号(用SqlCommand的ExecuteScalar方法获取)。
2)然后使用Rnd()*最大试卷编号+1的方法取整数(获取1~最大试卷编号)之内的随机序号,
注意VB中先用Randomize函数随机化随机数产生器。
- 已编辑 ThankfulHeart 2012年4月1日 0:54
- 已标记为答案 强辉史 2012年4月1日 2:17
-
不知道这样讲师傅可不可以理解:
数据库中有一张[试卷]表,里面有很多很多题目,其中有一列[试卷编号],每个题目都有属于自己的试卷编号,每个试卷编号也对应很多的题目,比如吧,[试卷]表中前十行题目都是试卷编号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
-
有缘人好,觉得你说的思路是非常正确的,但是自己没使用过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(); //做其它事情…… }
- 已标记为答案 强辉史 2012年4月1日 2:17
-
有缘人,自己使用的是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").ConnectionStringSqlDataSource4.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