Я хочу загрузить данные в сеанс, чтобы при нажатии следующей кнопки в средстве просмотра отчетов 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;
Я пробую этот код, но когда я нажал следующую кнопку, он выдает ошибку, что недопустимый источник отчета ... я предполагаю, что сеанс равен нулю, поэтому он дает мне эту ошибку.
Любые предложения, как я могу это решить ...





Я думаю, вы захотите использовать здесь объект Cache с уникальным ключом для каждого пользователя вместо Session.
Псевдокод:
var data = Cache["Record_999"] as DataTable;
if (data == null) {
// get from db
// insert into cache
}
SetDataSource(data);
Кэш используется для всех запросов, поэтому запросы от других людей приведут к получению кэшированного набора данных, созданного с другими параметрами. Вы можете использовать кеш, если примените фильтрацию методом Select () после извлечения из него данных. Сессия - это то, что вы хотите использовать на основе приведенного выше кода.
Джон, не могли бы вы объяснить, почему сеанс недоступен в этом контексте? (Я предполагаю, что это не так, и поэтому вы эмулируете его с помощью пользовательского кеша)
Он доступен, но более изменчив, чем Cache. Если он закроет свой браузер и т. д., Он исчезнет.
Проблема заключается не в использовании 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
}
Было бы полезно, если бы в вашем коде все недостающие фигурные скобки были возвращены на место. Трудно сказать, какова область действия каждого из операторов if.