Использование сеанса [] с загрузкой страницы - PullRequest
0 голосов
/ 16 октября 2008

Я хочу загрузить данные в сеанс, чтобы при нажатии следующей кнопки в Crystal Report Viewer данные загружались из таблицы данных, а затем снова извлекали данные из базы данных. Вот мой код ...

   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;

Я пытаюсь использовать этот код, но когда я нажимаю следующую кнопку, появляется сообщение об ошибке, что недопустимый источник отчета ... я предполагаю, что сеанс пуст, поэтому он дает мне эту ошибку.

Любые предложения, как я могу решить это ...

Ответы [ 3 ]

1 голос
/ 16 октября 2008

Я думаю, вы хотели бы использовать объект Cache с уникальным ключом для каждого пользователя вместо Session здесь.

Псевдокод:

var data = Cache["Record_999"] as DataTable;
if (data == null) {
    // get from db
    // insert into cache
}
SetDataSource(data);
0 голосов
/ 16 октября 2008

`Может быть, это не 0? Если sort не равен 0 и пользователь обращается к странице в первый раз (Session ["Record"] не был установлен ранее), он может получить ошибку. может попробовать:

if(sort==0 || Session["Record"] == null)
{
// do your magic
}
0 голосов
/ 16 октября 2008

Проблема не в использовании Session, а в логике, используемой для определения, когда извлекать данные. Сеанс является правильным подходом для использования здесь, поскольку кэш-память используется совместно для разных запросов, то есть пользователь A будет видеть отчет пользователя B, только что настроенный, если пользователь B был первым пользователем, который выполнил код, который использовал Cache вместо сеанса.

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;
         // ....
    }
}       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...