2015-12-26 3 views
1

Очень новое для VB, так что извиняйтесь, если я не очень понимаю. У меня есть база данных вопросов о пустяках с тремя полями: вопрос, ответ и время. Я хочу, чтобы у вас была возможность нажать кнопку и получить случай из базы данных случайным образом из числа записей с наименьшим запрошенным значением Times Asked, а затем добавить одно к значению Times Asked. Может ли кто-нибудь помочь мне? Вот что у меня до сих пор:Выберите случайную запись в базе данных с самым низким значением

Private DBCon As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; "Data Source=Trivia.accdb;") 

Public Sub GenerateQuestion() 

DBCon.Open() 

'grab how many questions there are total 
    Dim QuestionsQuery As String = "SELECT COUNT(*) FROM Questions" 
    Dim QuestionsCmd As New OleDbCommand(QuestionsQuery, DBCon) 
    Dim NumOfQuestions As Integer = QuestionsCmd.ExecuteScalar() 

    'grab the lowest number from Times Asked 
    Dim SeenQuery As String = "SELECT MIN(`Times`) FROM Questions" 
    Dim SeenCmd As New OleDbCommand(SeenQuery, DBCon) 
    Dim SeenReader As OleDb.OleDbDataReader = SeenCmd.ExecuteReader 
    SeenReader.Close() 

End Sub 

Эта подпрограмма вызывается с помощью кнопки на другую форму, и когда я нажимаю кнопку, я получаю исключение для каких-либо существующих в строке/столбце данных. Даже если мне удастся получить эту ценность, хотя я понятия не имею, что следующий шаг заключается в том, чтобы на самом деле схватить случайный вопрос из числа минимальных значений Times и добавить значение One в значение Times для этого вопроса.

Для справки Вот таблица я работаю с ата: http://i.imgur.com/2vwlVQR.jpg

EDIT: Для тех, кто находя это в будущем здесь код, который исправил проблему:

Imports System.Data.OleDb 
    Dim rng As New Random 
Dim connection As OleDb.OleDbConnection 

Private Function GetQuestionWithAnswer() As Tuple(Of String, String) 
    'Use XML literals for the SQL statements. 
    Dim selectSql = <sql> 
        SELECT * 
        FROM Questions 
        WHERE Times = 
        (
         SELECT MIN(Times) 
         FROM Questions 
        ) 
       </sql> 
    Dim updateSql = <sql> 
        UPDATE Questions 
        SET Times = @Times 
        WHERE ID = @ID 
       </sql> 

    Using connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=Trivia.accdb;") 
     Dim adapter As New OleDbDataAdapter(selectSql.Value, connection) 
     Dim updateCommand = New OleDbCommand(updateSql.Value, connection) 

     With updateCommand.Parameters 
      .Add("@Times", OleDbType.Integer, 0, "Times") 
      .Add("@ID", OleDbType.Integer, 0, "ID") 
     End With 

     adapter.UpdateCommand = updateCommand 

     Dim table As New DataTable 

     'Getall the questions that have been asked the fewest number of times. 
     adapter.Fill(table) 

     'Select a question at random. 
     Dim record = table.Rows(rng.Next(table.Rows.Count)) 

     'Increment the number of times the question has been asked and save the change. 
     record("Times") = CInt(record("Times")) + 1 
     adapter.Update(table) 

     'Package up the selected question. 
     LblQuestion.Text = record(1) 
     Return Tuple.Create(CStr(record("Question")), CStr(record("Answer"))) 

    End Using 
End Function 

ответ

0

Вот вам может найти применение Rand в Mysql: http://jan.kneschke.de/projects/mysql/order-by-rand/

Если вы используете Rand, нет необходимости выбирать вопросы, которые не отображаются в основном. Он будет сбалансирован, если вы используете только Rand.