Access SQL Randomizer не работает должным образом
Я использую приведенный ниже код для выбора идентификатора записи из базы данных Access, которая еще не была выбрана в последний день, и добавления его в массив.
Общая цель заключается в том, чтобы получить запись, которая соответствует начальным критериям "сложности", при условии, что либо запись никогда не была выбрана ранее, либо запись не была выбрана в последние 2 дня. После завершения цикла, я должен иметь x
количество уникальных идентификаторов записей и добавить их в массив для обработки в другом месте.
Private Function RetrieveQuestionID(questionCount As Integer)
' We're using this retrieve the question id's from the database that fit our arrangements.
Dim intQuestArray(0 To questionCount) As Integer
Dim QuestionConnection As New OleDb.OleDbConnection("PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source = |DataDirectory|\Database\MillionaireDB.accdb;")
QuestionConnection.Open()
For i As Integer = 1 To intNoOfQuestions
'TODO: If there are no valid questions, pull up any of them that meets the difficulty requirement....
Dim QuestionConnectionQuery As New OleDb.OleDbCommand("SELECT Questions.QuestionID FROM Questions WHERE (((Questions.QuestionDifficulty)=[?])) AND (((Questions.LastDateRevealed) Is Null)) OR (Questions.LastDateRevealed >= DateAdd('d',-2,Date())) ORDER BY Rnd((Questions.QuestionID) * Time());", QuestionConnection)
QuestionConnectionQuery.Parameters.AddWithValue("?", intQuestionDifficulty(i - 1).ToString)
Dim QuestionDataAdapter As New OleDb.OleDbDataAdapter(QuestionConnectionQuery)
Dim QuestionDataSet As New DataSet
QuestionDataAdapter.Fill(QuestionDataSet, "Questions")
intQuestArray(i - 1) = QuestionDataSet.Tables("Questions").Rows(0).Item(0)
Dim QuestionConnectionUpdateQuery As New OleDb.OleDbCommand("UPDATE Questions SET Questions.LastDateRevealed = NOW() WHERE Questions.QuestionID = [?]", QuestionConnection)
QuestionConnectionUpdateQuery.Parameters.AddWithValue("?", intQuestArray(i - 1).ToString)
QuestionConnectionUpdateQuery.ExecuteNonQuery()
Next
QuestionConnection.Close()
Return intQuestArray
End Function
Однако циклический просмотр массива покажет, что есть записи, которые каким-то образом повторяются, даже если записи обновляются во время цикла.
Есть ли другой способ перебрать базу данных и проверить эти записи? Я даже попытался переместить .Open()
а также .Close()
заявления в пределах For...Next
цикл и мне дали худшие результаты, чем раньше.
1 ответ
Как писал Стив,>= должно быть <.
Кроме того, в предложении WHERE отсутствуют круглые скобки вокруг части OR. Должно быть (без лишних скобок):
SELECT Questions.QuestionID
FROM Questions
WHERE Questions.QuestionDifficulty=[?]
AND ( Questions.LastDateRevealed Is Null
OR Questions.LastDateRevealed < DateAdd('d',-2,Date()) )
ORDER BY Rnd(Questions.QuestionID * Time());
Также взгляните на Как получить случайную запись из базы данных MS Access - предлагается использовать отрицательное значение в качестве параметра для Rnd()
,