Utilizzo della sessione [] con caricamento pagina
-
03-07-2019 - |
Domanda
Voglio caricare i dati in sessione in modo tale che quando si fa clic sul pulsante successivo nel visualizzatore di report di cristallo, quindi in caricare i dati dal datatable anziché recuperare nuovamente i dati dal database. Ecco il mio codice ...
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;
Sto provando questo codice ma quando ho fatto clic sul pulsante successivo mi viene visualizzato l'errore che non è stato restituito come fonte..immagino che la sessione sia nulla, ecco perché mi dà questo errore.
Qualche suggerimento come posso risolvere questo ...
Soluzione
Penso che vorresti usare l'oggetto Cache con una chiave univoca per ciascun utente anziché Session qui.
Codice pseudo:
var data = Cache["Record_999"] as DataTable;
if (data == null) {
// get from db
// insert into cache
}
SetDataSource(data);
Altri suggerimenti
Il problema non sta nell'uso di Session, ma nella logica usata per determinare quando recuperare i dati. La sessione è l'approccio corretto da utilizzare qui poiché la cache è condivisa tra le richieste, ovvero l'utente A visualizzerebbe il rapporto che l'utente B ha appena configurato se l'utente B fosse il primo utente ad eseguire il codice che utilizzava cache anziché Session.
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;
// ....
}
}
`Potrebbe essere che l'ordinamento non sia 0? Se l'ordinamento non è 0 e l'utente accede alla pagina per la prima volta (Sessione [" Record "] non è stata impostata in precedenza), potrebbe ricevere l'errore. potrebbe voler provare:
if(sort==0 || Session["Record"] == null)
{
// do your magic
}