0

オンライン テスト用の Web アプリケーションを作成しました。

Web サイトはローカル マシンでは問題なく動作していますが、リモート サーバーではエラーが発生します。

protected void Page_Load(object sender, EventArgs e)
{

            arrSessionALL_questions = Session["arrALL_questions"] as int[];
            arrSessionQuestion_ID = Session["arrayOfQuestionID"] as int[];
            arrSessionCorrectAns = Session["arrayOfCorrectAns"] as string[];
            arrSessionCorrectAnsMarks = Session["arrayOfCorrectAnsMarks"] as int[];
            arrSessionAns_ID = Session["arrayOfAnsID"] as string[];
            arrSessionAttempted_ID = Session["arrayOfAttemptedID"] as int[];
            arrSessionMarkQuestion_ID = Session["arrMarkQuestion_ID"] as int[];
            arrSessionLeft_ID = Session["arrayOfLeftID"] as int[];
            arrSessionTotalMarks = Session["arrTotalMarks"] as int[];
}

protected void ButtonNext_Click(object sender, EventArgs e)
{


    PanelTimer.Visible = true;
    PanelQuestNum.Visible = false;

    try
    {       

    if (arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])] != 0)
    {


        if (Convert.ToInt32(Session["QuestionCounter"]) < arrSessionALL_questions.Length)
        {
            //Session["QuestionCounter"] = Convert.ToInt32(Session["QuestionCounter"]) + 1;
            LabelStudentName.Text = arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])].ToString();
            correctAns = arrSessionCorrectAns[Convert.ToInt32(Session["QuestionCounter"])].ToString();
            correctMarks = Convert.ToInt32(arrSessionCorrectAnsMarks[Convert.ToInt32(Session["QuestionCounter"])]);
            PanelQ.Visible = true;
            ButtonSTART.Visible = false;
            ButtonMark.Visible = true;


            PanelTimer.Visible = true;
            PanelQuestNum.Visible = false;


            if (RadioButtonListAns.SelectedIndex >= 0)
            {

                arrAns_ID[Convert.ToInt32(Session["QuestionCounter"])] = RadioButtonListAns.SelectedItem.ToString();
                Session["arrayOfAnsID"] = arrAns_ID;
                arrSessionAns_ID = Session["arrayOfAnsID"] as string[];


                if (arrSessionAns_ID[Convert.ToInt32(Session["QuestionCounter"])] == correctAns)
                {
                    studentMarks = correctMarks;
                    attempt_correct_wrong = "correct";
                }
                else
                {
                    studentMarks = 0;
                    attempt_correct_wrong = "wrong";
                }


                con.Open();
                SqlDataAdapter adp = new SqlDataAdapter("select * from Student_Analysis where((date='" + date + "' AND username='" + username + "') AND (PaperName='" + papername + "' AND QuestionNumber='" + arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])] + "'))", con);
                DataSet ds = new DataSet();
                adp.Fill(ds, "Student_Analysis");
                int count = ds.Tables[0].Rows.Count;
                if (count > 0)
                {
                    con.Close();

                    con1.Open();
                    SqlCommand cmd = new SqlCommand("UPDATE Student_Analysis set studentAns='" + arrSessionAns_ID[Convert.ToInt32(Session["QuestionCounter"])] + "',studentMarks='" + studentMarks + "',attemp_correct_wrong='" + attempt_correct_wrong + "' where((date='" + date + "' AND username='" + username + "') AND (PaperName='" + papername + "' AND QuestionNumber='" + arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])] + "'))", con1);
                    cmd.ExecuteNonQuery();
                    con1.Close();
                }
                else
                {

                    con.Close();

                    con1.Open();
                    SqlCommand cmd = new SqlCommand("insert into Student_Analysis values('" + date + "','" + studentId.ToString() + "','" + studentName + "','" + username.ToString() + "','" + papername + "','" + Convert.ToInt32(LabelStudentName.Text) + "','" + arrSessionAns_ID[Convert.ToInt32(Session["QuestionCounter"])] + "','" + correctAns + "','" + studentMarks + "','" + correctMarks + "','" + attempt_correct_wrong + "')", con1);
                    cmd.ExecuteNonQuery();
                    con1.Close();
                }

}

            else
            {
                arrAns_ID[Convert.ToInt32(Session["QuestionCounter"])] = "NULL";
                Session["arrayOfAnsID"] = arrAns_ID;
                arrSessionAns_ID = Session["arrayOfAnsID"] as string[];


                studentMarks = 0;
                attempt_correct_wrong = "Not attempted";



                con.Open();
                SqlDataAdapter adp = new SqlDataAdapter("select * from Student_Analysis where((date='" + date + "' AND username='" + username + "') AND (PaperName='" + papername + "' AND QuestionNumber='" + arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])] + "'))", con);
                DataSet ds = new DataSet();
                adp.Fill(ds, "Student_Analysis");
                int count = ds.Tables[0].Rows.Count;
                if (count > 0)
                {
                    con.Close();

                    con1.Open();
                    SqlCommand cmd = new SqlCommand("UPDATE Student_Analysis set studentAns='" + "NULL" + "',studentMarks='" + studentMarks + "',attemp_correct_wrong='" + attempt_correct_wrong + "' where((date='" + date + "' AND username='" + username + "') AND (PaperName='" + papername + "' AND QuestionNumber='" + arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])] + "'))", con1);
                    cmd.ExecuteNonQuery();
                    con1.Close();
                }
                else
                {

                    con.Close();

                    con1.Open();
                    SqlCommand cmd = new SqlCommand("insert into Student_Analysis values('" + date + "','" + studentId.ToString() + "','" + studentName + "','" + username.ToString() + "','" + papername + "','" + Convert.ToInt32(LabelStudentName.Text) + "','" + "NULL" + "','" + correctAns + "','" + studentMarks + "','" + correctMarks + "','" + attempt_correct_wrong + "')", con1);
                    cmd.ExecuteNonQuery();
                    con1.Close();
                }
            }


            if (Convert.ToInt32(Session["QuestionCounter"]) < arrSessionALL_questions.Length - 1)
            {
                Session["QuestionCounter"] = Convert.ToInt32(Session["QuestionCounter"]) + 1;
                loadQuestion();
                ButtonMark.Visible = true;


                //Checking if question has been marked
                con.Open();
                SqlDataAdapter adp = new SqlDataAdapter("select * from StudentMarkedQuestions where((date='" + date + "' AND username='" + username + "') AND (PaperName='" + papername + "' AND markedQuestionNumber='" + arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])] + "'))", con);
                DataSet ds = new DataSet();
                adp.Fill(ds, "Student_Analysis");
                int count = ds.Tables[0].Rows.Count;
                if (count > 0)
                {
                    ButtonMark.Visible = false;
                    ButtonUnMark.Visible = true;

}

                else
                {
                    ButtonMark.Visible = true;
                    ButtonUnMark.Visible = false;
                }
                //Checking if question has been marked
            }
            else
            {
                LabelStudentName.Text = "End of questions!!";
                PanelQ.Visible = true;
                ButtonSTART.Visible = false;
                ButtonFinish.Visible = true;
                ButtonNext.Visible = true;
                ButtonPrevious.Visible = true;

            }


        }
        else
        {
            LabelStudentName.Text = "End of questions!!";
            PanelQ.Visible = true;
            ButtonSTART.Visible = false;

            ButtonFinish.Visible = true;
            ButtonMark.Visible = false;
            ButtonPrevious.Visible = false;
            ButtonNext.Visible = false;
            ButtonUnMark.Visible = false;

        }
    }


    }   //try ends     
    catch(Exception ex)
    {

       Response.Write(ex.Message);          
    }
}

public void loadQuestion()
{
    if (arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])] != 0)
    {


        con1.Open();
        SqlDataAdapter adp1 = new SqlDataAdapter("select * from QuestionInsert where(QuestionNum='" + arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])] + "')", con1);
        DataSet ds1 = new DataSet();
        adp1.Fill(ds1);
        LabelQuestion.Text = (Convert.ToInt32(Session["QuestionCounter"]) + 1) + ".  " + ds1.Tables[0].Rows[0][7].ToString();
        con1.Close();


        RadioButtonListAns.Items.Clear();
        con2.Open();
        string strQuery = "select * from QuestionInsert where(QuestionNum='" + arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])] + "')";
        SqlDataAdapter da = new SqlDataAdapter(strQuery, con2);
        DataTable dt = new DataTable();
        da.Fill(dt);
        con2.Close();
        RadioButtonListAns.Items.Insert(0, new ListItem(dt.Rows[0]["Option1"].ToString(), dt.Rows[0]["Option1"].ToString()));
        RadioButtonListAns.Items.Insert(1, new ListItem(dt.Rows[0]["Option2"].ToString(), dt.Rows[0]["Option2"].ToString()));
        RadioButtonListAns.Items.Insert(2, new ListItem(dt.Rows[0]["Option3"].ToString(), dt.Rows[0]["Option3"].ToString()));
        RadioButtonListAns.Items.Insert(3, new ListItem(dt.Rows[0]["Option4"].ToString(), dt.Rows[0]["Option4"].ToString()));
        RadioButtonListAns.Items.Insert(4, new ListItem(dt.Rows[0]["Option5"].ToString(), dt.Rows[0]["Option5"].ToString()));



        //Selects radiobutton if answer found in database
        con3.Open();
        SqlDataAdapter adp = new SqlDataAdapter("select * from Student_Analysis where((date='" + date + "' AND username='" + username + "') AND (PaperName='" + papername + "' AND QuestionNumber='" + arrSessionQuestion_ID[Convert.ToInt32(Session["QuestionCounter"])] + "'))", con3);
        DataSet ds = new DataSet();
        adp.Fill(ds, "Student_Analysis");
        int count = ds.Tables[0].Rows.Count;
        if (count > 0)
        {
            con3.Close();

            string ans = ds.Tables[0].Rows[0][6].ToString();
            if (RadioButtonListAns.Items.FindByText(ans) != null)
            {
                RadioButtonListAns.Items.FindByText(ans).Selected = true;
            }
        }
        con3.Close();
        //Selects radiobutton if answer found in database
    }

}

これは私が適用したコードです。ページの読み込みと ButtonNext_Click() イベントからコードを提供しました。

テストの開始時に 2 つの質問が読み込まれますが、[次へ] ボタンをもう一度クリックすると、次のエラーが表示されます。

 [NullReferenceException: Object reference not set to an instance of an object.]
       StudentTestingPage.ButtonNext_Click(Object sender, EventArgs e) +2018
       System.EventHandler.Invoke(Object sender, EventArgs e) +0
       System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9553178
       System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103
       System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

知っていることはすべて試し、インターネットですべてを検索しましたが、まだ修正できません。null に設定できるすべての変数と配列を確認しました。コードはローカル マシンで正常に実行されています。データベースとしてSQL Serverを使用しています。

4

1 に答える 1

1

手がかりはスタックトレースにあります。nullのハンドラーにあるメソッドを呼び出しているか、プロパティを取得/設定していますButtonNext

メソッドを見て、ButtonNext_Click()どのオブジェクトが null であるかを確認してください。

ローカルでレプリケートできない場合は、DEBUG ビルドをビルドしてデプロイすることを検討してください。これにより、スタック トレースで例外をスローした実際の行番号が得られるはずです。

でも

このコードには多くの重大な問題があります。コードの全体的な品質の向上に取り組めば、次のような単純な問題のNullReferenceException特定と解決が容易になります。

  1. メソッドの長さ率直に言って、MASSIVEButtonNext_Click()メソッドを多数の小さな (場合によっては 10 行未満の) わかりやすい名前の付いたメソッドに分割する必要があります。ReSharper をお持ちの場合は、その使用方法を学んでください。そうでない場合は、購入して使い方を学びましょう。ただし、最近では Visual Studio にも「Extract Method」があります- USE IT。特に、if/elseブロックの内容は良い候補かもしれません。
  2. SQL インジェクションあなたは非常にいたずらです。SQL 文字列を連結するのは悪い考えです。代わりに、 SQL 文字列をパラメータ化してください。さらに良いのは、Entity Framework (.NET フレームワークでは無料で提供されます) や Dapper などを使用することです。
  3. 使用しないでください"NULL"。使用nullし、重要な違いに注意してください。

最後にもう 1 つ - 死のイエロー スクリーンは実際には表示されません。本番環境では、常にオフにする必要がありますweb.config

<customErrors mode="RemoteOnly" ... />
于 2013-09-11T11:49:36.607 に答える