Создание онлайн-теста с базой данных доступа в C # - PullRequest
0 голосов
/ 07 января 2012

Мне нужно создать онлайн-тест с 10 вопросами. У меня есть 30 вопросов, хранящихся в базе данных, и каждый раз, когда тест начинается, 10 вопросов должны выбираться случайным образом. Мне удалось отобразить вопросы на этикетке, но я показываю их все. Какой код мне нужен, чтобы отображалось только 10 вопросов? Также там, поскольку есть ответы с несколькими вариантами ответов, мне нужно назначить каждый вариант ответа для переключателя. Ответы также хранятся в базе данных. Что я сделал до сих пор (я разместил только соответствующий код):

Код в классе DBConnection:

public static List<Questions> LoadQuestions()
{
    List<Questions> quest = new List<Questions>();
    OleDbConnection myConnection = GetConnection();
    string myQuery = "SELECT * FROM Questions";
    OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection);

    try
    {
        myConnection.Open();
        OleDbDataReader reader = myCommand.ExecuteReader();

        while (reader.Read())
        {
            Questions q = new Questions(Int32.Parse(reader["ID"].ToString()),                
                                        reader["QuestionBody"].ToString(),
                                        reader["CorrectAnswer"].ToString());
            quest.Add(q);
        }

        return quest;
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception in DBHandler" + ex);
        return null;
    }
    finally
    {
        myConnection.Close();
    }
}

public static List<Answers> LoadAnswers()
{
    List<Answers> answers = new List<Answers>();
    OleDbConnection myConnection = GetConnection();

    string myQuery = "SELECT * FROM Answers";
    OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection);

    try
    {
        myConnection.Open();
        OleDbDataReader reader = myCommand.ExecuteReader();
        while (reader.Read())
        {
            Answers a = new Answers(Int32.Parse(reader["ID"].ToString()),
                                    reader["AnswerA"].ToString(),
                                    reader["AnswerB"].ToString(),
                                    reader["AnswerC"].ToString(),
                                    (Int32.Parse(reader["QuestionId"].ToString())));
            answers.Add(a);
        }

        return answers;
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception in DBHandler" + ex);
        return null;
    }
    finally
    {
        myConnection.Close();
    }
}

Код в Test.aspx:

protected void Page_Load(object sender, EventArgs e)
{
    List<Questions> QList = DatabaseConnecter.LoadQuestions();
    Random rndNumber = new Random();
    int randomQuest = rndNumber.Next(30);
    lblQuest.Text = QList[randomQuest].QuestionBody;

    List<Answers> AList = DatabaseConnecter.LoadAnswers();
    int a = 30;
    rbAnswer1.Text = AList[a].AnswerA;
}

Я получил следующую ошибку в строке списка

"Ссылка на объект не установлена ​​для экземпляра объекта".

Метка (lbwQuest) отображает вопросы просто отлично. Проблема с ответами и переключателями (rbAnswer1, rbAnswer2, rbAnswer3). Кроме того, в базе данных у меня есть две таблицы - Вопросы со столбцами - ID, QuestionBody, CorrectAnswer и Ответы со столбцами - ID, QuestionID, AnswerA, AnswerB, AnswerC.

1 Ответ

1 голос
/ 07 января 2012

Эта ошибка означает, что вы пытаетесь получить доступ к свойствам / пытаетесь вызвать методы нулевого объекта.

Если в вашей функции LoadQuestions возникло исключение, вы возвращаете нуль.Не проверяя, является ли оно пустым или нет, вы пытаетесь получить к нему доступ с помощью QList [randomQuest] .QuestionBody.Я бы добавил нулевую проверку, чтобы сделать код более устойчивым.

    List<Questions> QList = DatabaseConnecter.LoadQuestions();
    Random rndNumber = new Random();
    int randomQuest = rndNumber.Next(30);
    if((QList!=null) && (QList .Count>0))
    {
       lblQuest.Text = QList[randomQuest].QuestionBody;
    }
    else
    {
       lblQuest.Text = "Questions are not loaded!";
    }


    List<Answers> AList = DatabaseConnecter.LoadAnswers();
    int a = 30;
    if((AList!==null) && (AList.Count>0))
    {
       rbAnswer1.Text = AList[a].AnswerA;
    }
    else
    {
       rbAnswer1.Text = "Answers are not loaded!";
    }

Поместите контрольные точки в ваши методы LoadQuestions и LoadAnswers и посмотрите, где он ломается.Вы также можете видеть, является ли объект нулевым или нет, используя окно просмотра

...