C# 在ASP.NET Webforms中单击按钮时出现空引用异常

C# 在ASP.NET Webforms中单击按钮时出现空引用异常,c#,asp.net,sql-server-2008,C#,Asp.net,Sql Server 2008,我创建了一个用于在线测试的web应用程序 该网站在我的本地机器上运行良好,但在远程服务器上出现错误 protected void Page_Load(object sender, EventArgs e) { arrSessionALL_questions = Session["arrALL_questions"] as int[]; arrSessionQuestion_ID = Session["arrayOfQuestionID"] as

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

}
我尝试了我所知道的一切,在互联网上搜索了一切,但仍然无法修复它。 我已经检查了所有可以设置为null的变量和数组,代码在本地机器上运行良好。
我使用SQL Server作为数据库。

线索在堆栈跟踪中。您正在调用方法或获取/设置
ButtonNext
的处理程序中
null
的属性

查看您的
按钮next\u Click()
方法,尝试查看哪些对象可能为空

如果不能在本地复制,那么考虑构建调试构建并部署它。这将为您提供在堆栈跟踪中引发异常的实际行号

然而 这段代码有很多严重的问题。如果您致力于提高代码的整体质量,那么像
NullReferenceException
这样的简单操作将更容易找到和解决

  • 方法长度你需要将你的
    按钮next\u Click()
    方法切割成许多小的(甚至少于10行)描述命名的方法。如果你有。如果你不买,就买下来。然而,甚至-。尤其是
    if/else
    块的内容可能是很好的候选内容
  • 你太淘气了-连接SQL字符串是个坏主意。相反更好的方法是使用实体框架(在.NETFramework中免费提供)或类似Dapper的东西
  • 不要使用
    “NULL”
    。使用
    null
    并注意重要的区别
  • 最后一件事——你不应该看到死亡的黄屏,真的。在生产过程中,您应该始终在
    web.config
    中关闭它:

    <customErrors mode="RemoteOnly" ... />
    
    
    
    @Hanumendra-刚刚选中,它在按钮next_Click()上给出空引用异常,该按钮很快关闭。我正在写一个答案。虽然这个问题有问题,但这显然是一个缺乏一些基本调试技能的人——也许他们还不知道如何询问他们在寻找什么。哈努门德拉:线索在堆栈跟踪中。您正在调用方法或获取/设置
    ButtonNext
    的处理程序中
    null
    的属性。查看您的
    按钮next\u Click()
    方法,尝试查看哪些对象可能为空。@NeilBarnwell问题是,这个问题的表达方式不足以对其他人有用,OP也没有将信息放入我们需要解决其问题的问题中。当然,我们可以使用我们的,但这不是堆栈溢出的目的。@NeilBarnwell它被称为[暂停]是有原因的,如果它改进了,它将重新启动Hanks Neil,非常感谢,我在您的帮助下解决了这个问题。你真是个好人,不客气。是否愿意分享问题的具体内容,以及为什么在您的生产现场与本地不同?
    <customErrors mode="RemoteOnly" ... />