2015-08-14 2 views
0

Я использую указанный ниже код для выбора идентификатора записи из базы данных доступа, которая еще не была выбрана в последний день и добавлена ​​в массив.Access SQL Randomizer Не работает по назначению

Общая цель заключается в том, что запись, соответствующая исходным критериям «Трудности», будет получена, если либо запись никогда не была выбрана до того, как запись не была выбрана за последние 2 дня. По завершении цикла я должен иметь количество уникальных идентификаторов записи и добавить их в массив для обработки в другом месте.

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, и мне дали худшие результаты, чем раньше.

+2

_OR запись не была выбрана за последние 2 дня_ критически смотришь на это **> = ** – Steve

ответ

1

Как писал Стив,> = должно быть <.

Кроме того, в предложении WHERE отсутствуют скобки вокруг части ИЛИ. Оно должно быть (без всех ненужных скобок):

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

также посмотреть на How to get random record from MS Access database - предлагается использовать отрицательное значение в качестве параметра для Rnd().

Смежные вопросы