对象引用未设置为 ReportViewer 中的对象实例

Object reference not set to an instance of an object in ReportViewer

我在页面上报告说,如果我离开 20 分钟,我会收到错误消息对象引用未设置为对象的实例

AMFM.ReportViewer.GenerateReport(DataTable dt) in c:\Users\gorella\Documents\Visual Studio 2013\Projects\Web_Applications\AMFM\AMFM\ReportViewer.aspx.cs:76

AMFM.ReportViewer.Page_Init(Object sender, EventArgs e) in c:\Users\gorella\Documents\Visual Studio 2013\Projects\Web_Applications\AMFM\AMFM\ReportViewer.aspx.cs:65

第一个问题:上面的路径甚至不是我运行宁这个运行的用户配置文件或路径。

第二个问题是当用户试图刷新页面时如何消除这个错误。

此代码是从 TFS 复制的。这是第 65 和 76 行的代码

private void Page_Init(object sender, EventArgs e) {
    DataTable dt = (DataTable)Session["dataset"];

    String query = (String)Session["query"];
    //System.Diagnostics.Debug.WriteLine("********************" + query);
    //System.Diagnostics.Debug.WriteLine("########################" + dt.Rows.Count.ToString());
    if (dt == null) {
        System.Diagnostics.Debug.WriteLine("THIS IS A TEST EVENT MESSAGE Response Header----------- THIS IS A TEST EVENT MESSAGETHIS IS A TEST EVENT MESSAGETHIS IS A TEST EVENT MESSAGETHIS IS A TEST EVENT"); ;
    }
    GenerateReport(dt);
}

protected void GenerateReport(DataTable dt) {
    // Get the dataset from the session state. Passed in from Reports.aspx.
    // This way the dataset is only generated once.
    //Report treport = new Report();
    // Get the report node from the session state. Passed in from Reports.aspx

    ReportTreeNode rn = (ReportTreeNode)Session["report"];

    System.Diagnostics.Debug.WriteLine(String.Format("### {0}", rn.Text));
    //Report r = new Report();
    System.Diagnostics.Debug.WriteLine(String.Format(" {0}",
        rn.treport.ToString())
    );

    rn.treport.ReportParameters["title"].Value = rn.Text + " Report";
    rn.treport.ReportParameters["title2"].Value = rn.title2;
    rn.treport.DataSource = dt;
    TReportViewer1.ReportSource = rn.treport;    
    //TReportViewer1.Report = rn.treport;
    // do a refresh if needed.
    //TReportViewer1.RefreshReport();
}

需要帮助进行故障排除。我至少也想在出现此异常时重定向到主页

我对此并不完全确定,但这是我唯一能想到的与您离开页面的时间量有关的事情,会话 可能 即将到期在服务器上。

你有 Page_Init 的地方你需要修改它以便检查该查询是否为空

private void Page_Init(object sender, EventArgs e)
    {
        DataTable dt = (DataTable)Session["dataset"];

        String query = ""
        if(Session["query"]!= null){
            query = (String)Session["query"];
        }
        if (dt == null)
        {
            System.Diagnostics.Debug.WriteLine("THIS IS A TEST EVENT MESSAGE Response Header----------- THIS IS A TEST EVENT MESSAGETHIS IS A TEST EVENT MESSAGETHIS IS A TEST EVENT MESSAGETHIS IS A TEST EVENT"); ;
        }
        GenerateReport(dt);
    }

然后您需要在下次使用查询时检查查询以确保它不是空字符串。

如果做不到这一点,请将 visual studios 调试器附加到它并让它显示空引用的来源。

我不建议将错误重定向到非信息性主页,虽然这可能 看起来 更像样,但它实际上只是对需要解决的问题的一种肮脏的解决方法,并且可能使以后的问题更难解决,从而产生滚雪球效应。

错误可能是由于会话超时(默认为 20 分钟)和您的会话变量丢失数据所致。

private void Page_Init(object sender, EventArgs e) {
    DataTable dt;

    String query = "";
    if (Session["query"] != null) {
        query = (String)Session["query"];
    }
    if (Session["dataset"] != null) {
        dt = (DataTable)Session["dataset"];
        GenerateReport(dt);
    }
    else {
        System.Diagnostics.Debug.WriteLine("THIS IS A TEST EVENT MESSAGE Response Header----------- THIS IS A TEST EVENT MESSAGETHIS IS A TEST EVENT MESSAGETHIS IS A TEST EVENT MESSAGETHIS IS A TEST EVENT"); ;
    }
}

还在 GenerateReport 方法中检查任何其他会话变量,如 ReportTreeNode 等。

protected void GenerateReport(DataTable dt) {
    ReportTreeNode rn;
    if (Session["report"] != null) {
        rn = (ReportTreeNode)Session["report"];
        rn.treport.ReportParameters["title"].Value = rn.Text + " Report";
        rn.treport.ReportParameters["title2"].Value = rn.title2;
        rn.treport.DataSource = dt;
        TReportViewer1.ReportSource = rn.treport;    
    }
}