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(),

Другие вопросы по тегам