【问题标题】:Using Session[] with Page Load将 Session[] 与页面加载一起使用
【发布时间】:2010-09-17 10:17:50
【问题描述】:

我想将数据加载到会话中,以便在水晶报表查看器中单击下一个按钮时,应该从数据表中加载数据,而不是再次从数据库中检索数据。这是我的代码...

   ReportDocument rpt = new ReportDocument();
    DataTable resultSet = new DataTable();
    string reportpath = null;

   protected void Page_Load(object sender, EventArgs e)
    {


        if (!Page.IsPostBack)
        {

           if (Request.QueryString.Get("id") == "5")
            {
                string publication = Request.QueryString.Get("pub");
                DateTime date = DateTime.Parse(Request.QueryString.Get("date"));
                int pages = int.Parse(Request.QueryString.Get("pages"));
                int sort = int.Parse(Request.QueryString.Get("sort"));
                if (sort == 0)
                {
                    reportpath = Server.MapPath("IssuesReport.rpt");
                    rpt.Load(reportpath);
                    DataTable resultSet1 = RetrievalProcedures.IssuesReport(date,          publication, pages);
                Session["Record"] = resultSet1;
             }

          DataTable report = (DataTable)Session["Record"];
          rpt.SetDataSource(report);
          CrystalReportViewer1.ReportSource = rpt;

我正在尝试这段代码,但是当我点击下一个按钮时,它给了我无效报告源的错误。我猜会话是空的,这就是它给我这个错误的原因。

我该如何解决这个问题...

【问题讨论】:

  • 如果您的代码将所有丢失的大括号放回它们所属的位置,这将有所帮助。很难说每个 if 语句的范围是什么。

标签: c# session web-applications


【解决方案1】:

我认为您希望为每个用户使用具有唯一键的 Cache 对象,而不是此处的 Session。

伪代码:

var data = Cache["Record_999"] as DataTable;
if (data == null) {
    // get from db
    // insert into cache
}
SetDataSource(data);

【讨论】:

  • 缓存在请求之间共享,因此来自其他人的请求将导致检索使用不同参数创建的缓存数据集。如果在从中检索数据后应用 Select() 方法过滤,则可以使用缓存。根据上面的代码,您想要使用 Session。
  • John,您能解释一下为什么会话在这种情况下不可用吗? (我认为不是,这就是您使用用户键控缓存来模拟它的原因)
  • 它是可用的,但它也比缓存更不稳定。如果他关闭浏览器等,它就消失了。
【解决方案2】:

问题不在于使用 Session,而在于用于确定何时检索数据的逻辑。 Session 是在这里使用的正确方法,因为 Cache 在请求之间共享 - 也就是说,如果用户 B 是第一个执行使用 Cache 而不是 Session 的代码的用户,用户 A 将看到刚刚配置的报告用户 B。

if (!Page.IsPostBack)
{
    if (Request.QueryString.Get("id") == "5")
    {
        string publication = Request.QueryString.Get("pub");
        DateTime date = DateTime.Parse(Request.QueryString.Get("date"));
        int pages = int.Parse(Request.QueryString.Get("pages"));
        int sort = int.Parse(Request.QueryString.Get("sort"));
        // fixed the statement below to key off of session
        if (Session["Record"] == null)
        {
            reportpath = Server.MapPath("IssuesReport.rpt");
            rpt.Load(reportpath);
            Session["Record"] = RetrievalProcedures.IssuesReport(date, publication, pages);
         }

         rpt.SetDataSource((DataTable)Session["Record"]);
         CrystalReportViewer1.ReportSource = rpt;
         // ....
    }
}       

【讨论】:

    【解决方案3】:

    `会不会是排序不是0?如果 sort 不为 0 并且用户是第一次访问该页面(之前未设置 Session["Record"]),他可能会收到错误消息。 不妨试试:

    if(sort==0 || Session["Record"] == null)
    {
    // do your magic
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多