2011-07-19 87 views
2

我收到錯誤'對象引用未設置爲對象的實例'。我試過尋找類似的問題,但真的不知道我的程序有什麼問題。那我有一個錯誤代碼行是:C#對象問題 - 無法解決它

labelQuestion.Text = table.Rows[0]["Question"].ToString(); 

這是我的全部代碼:

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.Sql; 
using System.Data.SqlClient; 

namespace Quiz_Test 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    String chosenAnswer, correctAnswer; 
    DataTable table; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     //declare connection string using windows security 
     string cnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Hannah\\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(); 
     labelQuestion.Text = table.Rows[0]["Question"].ToString(); 
     radioButton1.Text = table.Rows[0]["Answer 1"].ToString(); 
     radioButton2.Text = table.Rows[0]["Answer 2"].ToString(); 
     radioButton3.Text = table.Rows[0]["Answer 3"].ToString(); 
     radioButton4.Text = table.Rows[0]["Answer 4"].ToString(); 
     correctAnswer = table.Rows[0]["Correct Answer"].ToString(); ; 


     conGet.Close(); 

    } 

    private void btnSelect_Click(object sender, EventArgs e) 
    { 
     String cnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Hannah\\Desktop\\QuizQuestions.accdb"; 

     //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(); 

      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()) 
      { 
       //chosenCorrectly++; 
       MessageBox.Show("You have got this answer correct"); 
       //label2.Text = "You have got " + chosenCorrectly + " answers correct"; 
      } 
      else 
      { 
       MessageBox.Show("That is not the correct answer"); 
      } 
     } 
    } 
} 

}

我意識到這個問題不是太大,但我看不到我的申報計劃錯誤如何

+1

我不知道你在哪裏填充您的數據表。它是空的。 – Cyberdrew

+0

是否嘗試在該行代碼上設置斷點(按f9),然後將鼠標懸停在各種標識符上 - 查看哪一個出現空值... –

+0

您錯過了將結果集分配給您的部分數據表。表未分配。 – Jonathan

回答

0

你調用Form1_Load的的ExecuteReader()後,右鍵你需要

table = new DataTable(); 
table.Load (reader); 
5

您永遠不會初始化table,因此當您嘗試訪問其時將會是財產。

雖然在這種情況下實際上並不需要DataTable。您可以直接從OleDbDataReader訪問屬性見here的細節

喜歡的東西(你初始化。)(看Get***()家庭的方法。):

labelQuestion.Text = reader.GetString(reader.GetOrdinal("Question")); 

如此反覆其餘的列。

如果你選擇使用table,則省略reader.Read()行並添加:

table = new DataTable(); 
table.Load(reader); 
-2

無論是表中沒有行,或者沒有「問題」列或列有一個空它的價值。

考慮將作業分成多個步驟以幫助您診斷問題。或者,更清晰的眼睛已經注意到,這是因爲你沒有任何東西分配給'桌子'(德哦)。

儘管如此,關於分配作業的評論是一種有用的診斷方法。

1

問題是你的表沒有被初始化。因此,當您嘗試訪問table.row[0]時,您會收到此錯誤消息。

而且如果沒有問題列,你可能會得到這樣

Column ‘Question’ does not belong to table. 

錯誤。因此,在這一點上也不行。說是否有'問題'欄。首先,你需要填寫你的表格。

+1

表甚至沒有初始化。 – mdm

+0

你是對的我的壞。 –

0

錯誤對象引用空:

try 
{ 
    OleDbCommand com; 
    // OleDbConnection con = new OleDbConnection(ConnectionString); 
    cn.Open(); 

    string str = "select *from DatabaseLogin where user_id='" + textBox2.Text + "'"; 
    com = new OleDbCommand(str, cn); 
    OleDbDataReader reader = com.ExecuteReader(); 
    while (reader.Read()) 
    { 
     checkedListBox1.Items.Add(reader["stckdemge"].ToString()); 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(" " + ex); 
}