0

我创建了一个用于在线测试的 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
    }

}

这是我应用的代码,我给出了 Page Load 和 ButtonNext_Click() 事件的代码。

开始测试时,它会加载两个问题,但是如果您再次单击下一步按钮,则会出现以下错误:

 [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()方法并尝试查看哪些对象可能为空。

如果您无法在本地复制,请考虑构建 DEBUG 构建并进行部署。这应该为您提供在堆栈跟踪中引发异常的实际行号。

然而

这段代码有很多严重的问题。如果您致力于提高代码的整体质量,那么简单的事情NullReferenceException就会变得更容易找到和解决。

  1. 方法长度坦率地说,您需要将 MASSIVEButtonNext_Click()方法切割成许多小(甚至可能少于 10 行)描述性命名的方法。如果您有ReSharper ,请 了解如何使用它。如果您不这样做,请购买并学习如何使用它。然而,即使是Visual Studio 也有“提取方法”这些天-使用它。特别是if/else块的内容可能是很好的候选者。
  2. SQL 注入你太淘气了——连接 SQL 字符串是个坏主意。相反,参数化您的 SQL 字符串。更好的是,使用实体框架(在 .NET 框架中免费提供)或类似 Dapper 的东西。
  3. 不要使用"NULL". 使用null并注意重要的区别。

最后一件事——你真的不应该看到黄屏死机。您应该始终在您的生产环境中将其关闭web.config

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