Выбор нескольких различных значений в базе данных

108
9

У меня есть эта онлайн-опрос, которая генерирует случайные вопросы, но единственная проблема в том, что она повторяет предыдущие вопросы. У меня ограниченные вопросы (у меня есть 10 вопросов в моей таблице, но я ограничил количество вопросов, которые будут 5. Выход будет отображать только 5 случайных вопросов), которые я назвал RequiredRecords.


 question_id 
1
3
4
7
9
14
15
24
26
29

Должен выводиться после случайного


  question_id 
3
4
9
14
24

Я попытался посетить этот вопрос, но это не решает мою проблему. Ниже приведены некоторые из моих кодов и операторов 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

спросил(а) 2021-01-25T15:15:52+03:00 4 месяца, 2 недели назад
1
Решение
117

Взгляните на этот ответ для возможности рандомизировать записи, поступающие из базы данных, предсказуемым образом, что позволяет возобновить то, где вы остановились... Linq Orderby random ThreadSafe для использования в ASP.NET

Вы можете засеять генератор случайных чисел на определенное значение (например, идентификатор пользователя, идентификатор пользователя плюс дату и т.д.), а затем легко получить каждый элемент из базы данных, не зная ничего, кроме индекса элемента, который вы хотите случайная последовательность.

ответил(а) 2021-01-25T15:15:52+03:00 4 месяца, 2 недели назад
45

Вы должны иметь возможность рандомизировать ваши вопросы, как это


Выберите Top 5 QuestionID, newID() как RandomString От вопросов Сортировать по RandomString


newid() - это ключевое слово, которое даст вам случайное руководство, которое затем сортирует вопросы

ответил(а) 2021-01-25T15:15:52+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема