2010-09-27 71 views
0

我有这个在线测验会产生随机问题,但唯一的问题是它重复了以前的问题。我的问题有限(我的表格中有10个问题,但我将问题数量限制为5个,输出将只显示5个随机问题),我将其命名为RequiredRecords。选择数据库中的多个不同值

question_id 
    1 
    3 
    4 
    7 
    9 
    14 
    15 
    24 
    26 
    29 

应该输出后的随机

question_id 
    3 
    4 
    9 
    14 
    24 

我试图访问this question,但它并没有解决我的问题。以下是我使用的一些代码和SQL语句。

我发现我的查询在创建随机问题上没有问题,我可以不重复地显示它,但是我的其他代码出现了错误,导致程序出现重复。请帮帮我。


代码使用VS2008 3.5

Partial Class Student_DetailView 
Inherits System.Web.UI.Page 

Shared TotalRecords As Integer 
Private sqlda As SqlDataAdapter 
Private dt As DataTable 

Private Function CreateConnection() As SqlConnection 
    Dim _connectionString As String = ConfigurationManager.ConnectionStrings("LMSConnectionString").ConnectionString 
    Return New SqlConnection(_connectionString) 
End Function 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Dim quiz_id As Integer 
    quiz_id = Session("quiz_id") 

    Dim query As String = "SELECT COUNT(*) AS TotalRecords FROM tblQuizQuestion WHERE (quiz_id = '" & quiz_id & "')" 
    Dim dt As DataTable = GetRecords(query) 
    TotalRecords = Convert.ToInt32(dt.Rows(0)("TotalRecords")) 

    getQuestions() 
End Sub 

Public Function GetRecords(ByVal Query As String) As DataTable 
    Dim connection As SqlConnection = CreateConnection() 
    connection.Open() 
    sqlda = New SqlDataAdapter(Query, connection) 
    dt = New DataTable() 
    sqlda.Fill(dt) 
    connection.Close() 
    Return dt 
End Function 

Public Function RandomNumbers(ByVal max As Integer) As ArrayList 
    Dim lstNumbers As New ArrayList() 
    Dim rndNumber As New Random() 
    Dim number As Integer = rndNumber.[Next](1, max + 1) 
    lstNumbers.Add(number) 
    Dim count As Integer = 0 
    Do 
     number = rndNumber.[Next](1, max + 1) 
     If Not lstNumbers.Contains(number) Then 
      lstNumbers.Add(number) 
     End If 
     count += 1 
    Loop While count <= 10 * max 
    Return lstNumbers 
End Function 

Public Function GetRandomNumbersCSV(ByVal max As Integer, ByVal req As Integer) As String 
    Dim CSV As String = "" 
    Dim lstNumbers As ArrayList = RandomNumbers(max) 
    For i As Integer = 0 To req - 1 
     CSV += lstNumbers(i).ToString() & "," 
    Next 
    CSV = CSV.Remove(CSV.Length - 1) 
    Return CSV 
End Function 

Protected Sub buttonNext_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles buttonNext.Click 
    If Not Session("dt") Is Nothing Then 
     getQuestions() 
     Try 
      ' Save off previous answers 
      Dim dr As System.Data.DataRowView 
      dr = CType(questionDetails.DataItem, System.Data.DataRowView) 

      ' Create Answer object to save values 
      Dim a As Answer = New Answer() 
      a.CorrectAnswer = dr("answer").ToString() 
      a.UserAnswer = answerDropDownList.SelectedValue.ToString() 

      Dim al As ArrayList 
      al = CType(Session("AnswerList"), ArrayList) 
      al.Add(a) 

      Session.Add("AnswerList", al) 

     Catch ex As Exception 

      Response.Redirect("default.aspx") 
     End Try 
     If questionDetails.PageIndex = questionDetails.PageCount - 1 Then 
      ' Go to evaluate answers 
      Response.Redirect("results.aspx") 
     Else 
      questionDetails.PageIndex += 1 

     End If 

     If questionDetails.PageIndex = questionDetails.PageCount - 1 Then 
      buttonNext.Text = "Finished" 
     End If 
    End If 
End Sub 

Private Sub getQuestions() 
    Dim RequiredRecords As Integer 
    RequiredRecords = 5 
    Dim CSVData As String, query As String 
    Dim quiz_id As Integer 
    quiz_id = Session("quiz_id") 
    If TotalRecords >= RequiredRecords Then 
     CSVData = GetRandomNumbersCSV(TotalRecords, RequiredRecords) 

     query = "SELECT distinct question_id,quiz_question, choice1, choice2, choice3, choice4, answer, quiz_id FROM " & _ 
       "(SELECT question_id,quiz_question, choice1, choice2, choice3, choice4, answer, quiz_id , ROW_NUMBER() OVER(ORDER BY rand()) " & _ 
       "AS RowID FROM tblQuizQuestion WHERE quiz_id = '" & quiz_id & "') TempTable WHERE RowID IN(" & CSVData & ")" 
     dt = GetRecords(query) 
     Session("dt") = dt 
     questionDetails.DataSource = dt 
     questionDetails.DataBind() 
    Else 
     Response.Write("Required Records must be greater than Requried Records.") 
    End If 
End Sub 

End Class 

回答

0

在你身后应该能够随机你的问题是这样

选择前5 QuestionID,NEWID()作为 RandomString从问题排序 RandomString

newid()是一个关键字,它会给你一个随机的指导,然后你排序的问题

0

看看这个答案的方式来随机化来自数据库的条目,以可预测的方式,允许恢复你离开了... Linq Orderby random ThreadSafe for use in ASP.NET

你可以通过一个特定的值(例如用户ID,用户ID加上日期,...),然后从数据库中轻松获取每个项目,而不需要知道除了随机序列中所需项目的索引之外的任何内容。

+0

感谢您的回复Hightechrider ..我认为这真的是个好主意..但突然间我不知道该怎么做..如果你有空余时间,你可以通过使用我的变量或数据以某种方式展示它使用..再次感谢..我将编辑我的代码上面更详细的代码,我正在使用 – Kid 2010-09-30 19:28:33

相关问题