2012-01-07 45 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)顯示的問題很好。問題出在答案和單選按鈕(rbAnswer1rbAnswer2,rbAnswer3)。另外,在數據庫中,我有兩個表 - 包含列的問題 - ID,QuestionBody,CorrectAnswer和帶列的答案 - ID,QuestionID,AnswerA,AnswerB,AnswerC。

+2

「我在列表行中有以下錯誤」你是什麼意思的「列表」行? – 2012-01-07 02:35:08

+0

對不起,我不是特定的。我的意思是最後一行。這就是:rbAnswer1.Text = AList [a] .AnswerA – user1135433 2012-01-07 02:53:04

+0

列表'AList'可能沒有被實例化。 'DatabaseConnecter.LoadAnswers();'應該返回什麼。確保它正確地返回你所期望的。 – Lion 2012-01-07 02:58:47

回答

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方法中添加斷點並查看斷點。你可以看到一個對象是否爲空或不使用監視窗口也