Отредактировано - Я ранее разместил более раннюю версию своего кода, правильный код теперь ниже
У меня есть база данных вопросов викторины, которую я отображаю в своей форме, однако, когда я добираюсь до последнего вопроса в таблице, я получаю следующую ошибку:
IndexOutOfRangeException was unhandled
There is no row at position 5
Моя структура таблицы выглядит следующим образом:
Номер вопроса | Вопрос | Ответ 1 | Ответ 2 | Ответ 3 | Ответ 4 | Правильный ответ
Вот мой код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.SqlClient;
namespace WindowsFormsApplication1
{
public partial class QuizQuestions : Form
{
public WindowsAnalysisQuiz()
{
InitializeComponent();
}
//int questionNumber;
String correctAnswer;
private void WindowsAnalysisQuiz_Load(object sender, EventArgs e)
{
//declare connection string using windows security
string cnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Hanna\\Desktop\\QuizQuestions.accdb";
//declare Connection, command and other related objects
OleDbConnection conGet = new OleDbConnection(cnString);
OleDbCommand cmdGet = new OleDbCommand();
//try
//{
//open connection
conGet.Open();
//String correctAnswer;
cmdGet.CommandType = CommandType.Text;
cmdGet.Connection = conGet;
cmdGet.CommandText = "SELECT * FROM QuizQuestions ORDER BY rnd()";
OleDbDataReader reader = cmdGet.ExecuteReader();
reader.Read();
label1.Text = reader["Question"].ToString();
radioButton1.Text = reader["Answer 1"].ToString();
radioButton2.Text = reader["Answer 2"].ToString();
radioButton3.Text = reader["Answer 3"].ToString();
radioButton4.Text = reader["Answer 4"].ToString();
correctAnswer = reader["Correct Answer"].ToString();
//questionNumber = 0;
conGet.Close();
}
private void btnNextQuestion_Click(object sender, EventArgs e)
{
String cnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Hannah\\Desktop\\QuizQuestions.accdb";
int questionNumber = 0;
//declare Connection, command and other related objects
OleDbConnection conGet = new OleDbConnection(cnString);
OleDbCommand cmdGet = new OleDbCommand();
//try
{
//open connection
conGet.Open();
cmdGet.CommandType = CommandType.Text;
cmdGet.Connection = conGet;
cmdGet.CommandText = "SELECT * FROM QuizQuestions ORDER BY rnd()"; // select all columns in all rows
OleDbDataReader reader = cmdGet.ExecuteReader();
reader.Read();
String chosenAnswer = "";
//int chosenCorrectly = 0;
if (radioButton1.Checked)
{
chosenAnswer = reader["Answer 1"].ToString();
}
else if (radioButton2.Checked)
{
chosenAnswer = reader["Answer 2"].ToString();
}
else if (radioButton3.Checked)
{
chosenAnswer = reader["Answer 3"].ToString();
}
else
{
chosenAnswer = reader["Answer 4"].ToString();
}
if (chosenAnswer == reader["Correct Answer"].ToString())
{
labelQuestion.Text = table.Rows[questionNumber]["Question"].ToString();
//and show possible answers:
radioButton1.Text = table.Rows[questionNumber]["Answer 1"].ToString();
radioButton2.Text = table.Rows[questionNumber]["Answer 2"].ToString();
radioButton3.Text = table.Rows[questionNumber]["Answer 3"].ToString();
radioButton4.Text = table.Rows[questionNumber]["Answer 4"].ToString();
correctAnswer = table.Rows[questionNumber]["Correct Answer"].ToString();
questionNumber++; //got to next question!
}
else
{
MessageBox.Show("That is not the correct answer");
}
}
}
}
}
То, что я пытаюсь сделать, это получить цикл for, который будет перечислять вопросы в моей базе данных, но таким образом, чтобы я мог сложить все ответы, на которые правильно ответили, когда на последний вопрос был дан ответ, и, конечно, , не получаю сообщение об ошибке