2012-01-07 4 views
-1

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

код в классе 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). Кроме того, в базе данных у меня есть две таблицы - Вопросы с столбцами - ИД, QuestionBody, CorrectAnswer и ответы с столбцами - ID, QuestionID, AnswerA, AnswerB, AnswerC.

+2

«Я получил следующую ошибку в строке списка« Что вы подразумеваете под линией «список»? –

+0

Жаль, что я не был определен. Я имел в виду последнюю строку. Это он: rbAnswer1.Text = AList [a] .AnswerA – user1135433

+0

Список 'AList', возможно, не был создан. То, что именно должно быть возвращено 'DatabaseConnecter.LoadAnswers();'. Убедитесь, что он правильно возвращает то, что вы ожидаете. – Lion

ответ

1

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

В вашей функции LoadQuestions, если обнаружено исключение, вы возвращаете значение null. Не проверяя, является ли оно нулевым или нет, вы пытаетесь получить доступ к этому с помощью 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 и увидеть, где она отбита. Вы можете видеть, является ли объект нулевым или не используется окно просмотра также