2012-02-29 17 views
0

私のコードはブックの作成者用です。テーブルの読み込みでエラー:「オブジェクト参照がオブジェクトのインスタンスに設定されていません。

このメソッドは、DBから質問を受け取り、リストに入れます。

質問リストにデータを入れようとしていますが、質問クラスとgetpageDBメソッドがありますが、 "オブジェクト参照がオブジェクトのインスタンスに設定されていません"というエラーが表示されます。

public DataSet getPageDB(string myQuery, string ConnStr) 
{ 


    OleDbDataAdapter oda = new OleDbDataAdapter (myQuery, ConnStr); 
    DataSet ds = new DataSet(); 
    oda.Fill(ds); 

    foreach(DataRow pRow in ds.Tables[0].Rows){ 


     _currentQuest.question=pRow["question"].ToString(); 
     _currentQuest.questionNumber =Convert.ToInt16(pRow["questionnumber"]); 
     _currentQuest.rightAnswer=pRow["answer"].ToString(); 
     _currentQuest.goodFeedBack=pRow["goodfeedback"].ToString(); 
     _currentQuest.badFeedBack1=pRow["badfeedback1"].ToString(); 
     _currentQuest.badFeedBack2=pRow["badfeedback2"].ToString(); 
     AllQuestions.Add(_currentQuest); 


    } 
    return ds; 

} 

私は取得していますエラーは次のとおりです。

オブジェクト参照がオブジェクトインスタンスに設定されていません。

このエラーは何を意味していますか?何が問題ですか?

+0

上記のコード行でエラーが発生しますか? – Dinesh

答えて

0

インスタンス化されていないオブジェクトクラスにアクセスしようとしています。

デバッグで実行して、エラーをスローする行を確認してください。

たとえば、使用する前に_ currentQuestまたはAllQuestionsをインスタンス化していますか?

+0

今すぐご利用いただきありがとうございます –

0

あなたは常にあなたの_currentQuestの新しいInstnaceが必要です!あなたの質問に値を追加する前に

、questionNumberなどが

_currentQuest =新しい質問を()書きます。

+0

もう一つ重要なこと!ループの各サイクルで_currentQuestの新しいインスタンスを作成することを確認してください。そのため、ループをループ内に挿入します。それ以外の場合は、あなたのインスタンスを前から上書きするだけで、リストには同じエントリのn倍のデータが含まれます! – nothing9

+0

ご利用いただきありがとうございます –

0

NEW演算子を使用する前に、各オブジェクトをインスタンス化してみてください。 デバッグによってオブジェクトについて知ることができます。デバッグして、どの行がエラーをスローするかを調べてください。

0

データセットが空であるようです。つまり、最初にクエリを調べる必要があります。それは正しく実行されていないので、あなたのforeachループを開始しているときに順番に行を持たないデータセットを補っています。それはエラーをスローしています。このために、コードをデバッグして、投げている箇所と例外がどこにあるのかを知ることができます。

0

オブジェクト参照エラーは、1つ以上のオブジェクトがnull値を持ち、そのオブジェクトのメソッドまたはプロパティにアクセスしようとしていることを意味します。常にクラスのプロパティ/メンバーにアクセスする前に、クラスを初期化

public DataSet getPageDB(string myQuery, string ConnStr) 
{ 
    OleDbDataAdapter oda = new OleDbDataAdapter (myQuery, ConnStr); 
    DataSet ds = new DataSet(); 
    oda.Fill(ds); 

    foreach(DataRow pRow in ds.Tables[0].Rows){ //here if there are no tables in the dataset. So you must check if(ds.Tables.Count > 0) before executing the for loop. 

     //What is _currentQuest? Have you initialised it with a new keyword? Is it null when you try to use it? 
     _currentQuest.question=pRow["question"].ToString(); 
     _currentQuest.questionNumber =Convert.ToInt16(pRow["questionnumber"]); 
     _currentQuest.rightAnswer=pRow["answer"].ToString(); 
     _currentQuest.goodFeedBack=pRow["goodfeedback"].ToString(); 
     _currentQuest.badFeedBack1=pRow["badfeedback1"].ToString(); 
     _currentQuest.badFeedBack2=pRow["badfeedback2"].ToString(); 

     //What is AllQuestions? make sure that this is not null. 
     AllQuestions.Add(_currentQuest); 

    } 
    return ds; 

} 
2

あなたのコードを破ることができるいくつかの場所があるかもしれません。

例:

class objcls = null;

objcls = new class();

objcls.name = "スタックオーバーフロー";

関連する問題