Использование сеанса [] с загрузкой страницы

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

   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.

tvanfosson 16.10.2008 02:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
2 893
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

Псевдокод:

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

Кэш используется для всех запросов, поэтому запросы от других людей приведут к получению кэшированного набора данных, созданного с другими параметрами. Вы можете использовать кеш, если примените фильтрацию методом Select () после извлечения из него данных. Сессия - это то, что вы хотите использовать на основе приведенного выше кода.

cfeduke 16.10.2008 05:14

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

kristian 16.10.2008 19:38

Он доступен, но более изменчив, чем Cache. Если он закроет свой браузер и т. д., Он исчезнет.

John Sheehan 17.10.2008 03:27

Проблема заключается не в использовании Session, а в логике, используемой для определения, когда извлекать данные. Сеанс - это правильный подход для использования здесь, поскольку кэш используется совместно для запросов, то есть пользователь A будет видеть отчет, который пользователь B только что настроил, если пользователь 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;
         // ....
    }
}       

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

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

Другие вопросы по теме