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 ...

È stato utile?

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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top