#vb.net
Вопрос:
Я пытаюсь создать программу пересмотра с множественным выбором, но у меня возникли некоторые проблемы с тем, как заставить мою программу генерировать другой вопрос, который я сохранил в базе данных, после того как пользователь ответит на первый сгенерированный вопрос? Может кто-нибудь показать мне пример кода или что-то в этом роде, пожалуйста?
Imports System.Data.OleDb Public Class QUI 'Define all the variables which are meant to be in use' Dim ConnectString As String = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=projectdatabase.accdb") Dim DataReader As OleDbDataReader Dim cmd As New OleDbCommand Dim connection As New OleDbConnection Dim noofq As Integer Dim q(noofq) As String Dim questionnum As Integer 'Asks the user to input a number to d Private Sub QUI_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'Asks the user to input a number to decide how many questions they want to answer' noofq = InputBox("Input the number of questions you want. You can choose from 1 to 10.") 'A counter starting from one to the number of questions the user has inputted' For i = 1 To noofq Next 'Open the connection to the database' connection.ConnectionString = ConnectString connection.Open() 'Sets the question number to one' questionnum = 1 Label1.Text = "Question " amp; questionnum amp; " of " amp; noofq 'Retrieves the question and answers from the database' cmd.CommandText = "SELECT question, Answer1, Answer2, Answer3 FROM 1Questions" cmd.Connection = connection DataReader = cmd.ExecuteReader 'Assigns the values from the database to each of the labels and buttons' If DataReader.HasRows Then DataReader.Read() Lblquestion.Text = DataReader.Item("Question") RadioButtonA1.Text = DataReader.Item("Answer1") RadioButtonA2.Text = DataReader.Item("Answer2") RadioButtonA3.Text = DataReader.Item("Answer3") DataReader.Close() End If connection.Close() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnCheck.Click If RadioButtonA1.Checked And questionnum = 1 Then MsgBox("Correct Answer") Else MsgBox("Incorrect Answer") End If End Sub End Class
Ответ №1:
В таблице вопросов, если вы добавите столбец, представляющий код вопроса, вы сможете генерировать случайные числа для выбора из вопросов. Также можно добавить такие функции, как не повторять один и тот же вопрос. То есть, если я хорошо понял ваш вопрос
Комментарии:
1. Привет, Фараг, спасибо за ваше предложение, вы предлагаете мне указать идентификатор каждого вопроса и сгенерировать случайный вопрос с помощью этого? Также после того, как пользователь ответит на вопрос, как бы я мог создать другой вопрос?
2. да, это то, что я имею в виду, вам нужно сгенерировать n случайных чисел — необходимое количество вопросов — и сохранить их, например, в списке целых чисел, затем выполнить цикл по этому списку и изменить свой Quary, чтобы он был похож
cmd.CommandText = "SELECT question, Answer1, Answer2, Answer3 FROM 1Questions where QsId = '"amp; qlist(i) amp;"'"
, и вы можете использовать end sub, когда пользователь выбирает неправильное значение.3. Хорошо, я понимаю, спасибо
Ответ №2:
Очевидно, вы не последовали моему совету и включили опцию Строгий. Пожалуйста, сделайте это сейчас.
Вот как должна выглядеть ваша таблица базы данных. Столбец QuestionID
должен быть с автоматическим номером CorrectAnswer
, и столбец должен содержать название переключателя, который будет содержать правильный ответ.
Ваша главная проблема заключается в том, что вы извлекли все данные из таблицы 1 вопросов, но прочитали только первую запись. Вам придется снова подключиться к базе данных, чтобы получить еще один вопрос. Это плохая идея.
Мы извлекем все необходимые вам данные и поместим их в DataTable
таблицу, которая похожа на таблицу в памяти. Для запуска объекты базы данных будут объявлены и размещены в блоках использования. Это необходимо, чтобы Dispose
были вызваны их методы. Вы не объявляете эти объекты вне метода, в котором они используются. Вы можете передать строку подключения непосредственно конструктору Connection
и передать CommandText
и Connection
непосредственно конструктору Command
.
Я изменил строку sql, чтобы включить в нее первичный ключ таблицы. Мне пришлось угадать название поля, чтобы изменить его на настоящее имя. Я также добавил поле для правильного ответа. Это, возможно, потребуется добавить в таблицу. Последняя часть строки sql содержит Order By
предложение, которое будет возвращать случайные вопросы при каждом ее запуске.
Важным моментом здесь является то, что соединение с базой данных закрыто и удалено. Все данные, которые нам нужны для викторины, есть в DataTable
.
Я использовал a BindingSource
, чтобы мы могли отображать данные и легко перемещаться по вопросам.
Private ConStr As String = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=projectdatabase.accdb") Private intNumOfQuestions As Integer Private questionnum As Integer Private BndScr As BindingSource Private Sub QUI_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim strnoofq = InputBox("Input the number of questions you want. You can choose from 1 to 10.") If Integer.TryParse(strnoofq, intNumOfQuestions) AndAlso intNumOfQuestions gt; 0 AndAlso intNumOfQuestions lt; 11 Then Dim dt As New DataTable Using cn As New OleDbConnection(ConStr), cmd As New OleDbCommand($"SELECT Top {intNumOfQuestions} QuestionID, Question, Answer1, Answer2, Answer3, CorrectAnswer FROM 1Questions ORDER BY Rnd(-Timer()*[QuestionID])", cn) cn.Open() Using reader = cmd.ExecuteReader dt.Load(reader) End Using End Using questionnum = 1 Label1.Text = $"Question {questionnum} of {strnoofq}" BndScr = New BindingSource() BndScr.DataSource = dt Lblquestion.DataBindings.Add("Text", BndScr, "Question") Lblquestion.DataBindings.Add("Tag", BndScr, "CorrectAnswer") RadioButtonA1.DataBindings.Add("Text", BndScr, "Answer1") RadioButtonA2.DataBindings.Add("Text", BndScr, "Answer2") RadioButtonA3.DataBindings.Add("Text", BndScr, "Answer3") Else MessageBox.Show("Please enter valid number Of questions.") End If End Sub Private Sub btnNext_Click(sender As Object, e As EventArgs) Handles btnNext.Click If GetSelectedRadioButton(Me).Name = Lblquestion.Tag.ToString Then 'Correct Answer Else 'Wrong Answer End If If intNumOfQuestions = questionnum Then 'End of quiz Else BndScr.MoveNext() questionnum = 1 End If End Sub Public Function GetSelectedRadioButton(Container As Control) As RadioButton Dim rb = Container.Controls.OfType(Of RadioButton)().FirstOrDefault(Function(r) r.Checked = True) Return rb End Function
От вас зависит, как вести счет.