访问 SQL 随机发生器未按预期工作
Access SQL Randomizer Not working as intended
我正在使用下面提到的代码 select 来自 Access 数据库的记录 ID,该记录 ID 在最后一天尚未 select 编辑并将其添加到数组中。
总的目标是检索符合初始 "Difficulty" 条件的记录,只要该记录之前从未 select 编辑过或上次未选择该记录2天。循环完成后,我应该有 x
数量的唯一记录 ID,并将它们添加到数组中以便在其他地方处理。
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
循环中,结果比以前更糟。
正如史蒂夫所写,>= 应该是 < .
此外,您的 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());
另请参阅 How to get random record from MS Access database - 建议使用负值作为 Rnd()
的参数。
我正在使用下面提到的代码 select 来自 Access 数据库的记录 ID,该记录 ID 在最后一天尚未 select 编辑并将其添加到数组中。
总的目标是检索符合初始 "Difficulty" 条件的记录,只要该记录之前从未 select 编辑过或上次未选择该记录2天。循环完成后,我应该有 x
数量的唯一记录 ID,并将它们添加到数组中以便在其他地方处理。
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
循环中,结果比以前更糟。
正如史蒂夫所写,>= 应该是 < .
此外,您的 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());
另请参阅 How to get random record from MS Access database - 建议使用负值作为 Rnd()
的参数。