2008-10-15 7 views
0

Je souhaite charger les données dans une session de sorte que lorsque vous cliquez sur le bouton suivant dans Crystal Report Viewer, vous chargiez les données du datatable et récupérez à nouveau les données dans la base de données. Ici va mon code ...Utilisation de Session [] avec chargement de page

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; 

J'essaie ce code, mais quand je clique sur le bouton suivant, il me donne l'erreur que le rapport invalide source..i deviner la session est nulle des thats pourquoi sa me donnant cette erreur .

Tout sugesstions comment puis-je résoudre ce ...

+0

Il serait utile si votre code avait toutes les accolades manquantes replacés dans où ils appartiennent. Il est difficile de dire quelle est la portée de chacune des déclarations if. – tvanfosson

Répondre

1

Je pense que vous voulez utiliser l'objet Cache avec une clé unique pour chaque utilisateur au lieu de session ici.

Code Pseudo:

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

Le cache est partagé entre les demandes, de sorte que les demandes provenant d'autres personnes aboutissent à la récupération d'un ensemble de données mis en cache créé avec différents paramètres. Vous pouvez utiliser le cache si vous appliquez le filtrage de méthode Select() après avoir récupéré les données. La session est ce que vous souhaitez utiliser en fonction du code ci-dessus. – cfeduke

+0

Désolé, je voulais dire Cache avec une clé unique pour chaque utilisateur –

+0

John, pourriez-vous expliquer pourquoi la session n'est pas disponible dans ce contexte? (Je suppose que ce n'est pas le cas et c'est pourquoi vous l'émulez avec le cache avec clé utilisateur) – kristian

0

Le problème ne réside pas dans l'utilisation de session, il est avec la logique utilisée pour déterminer quand pour récupérer des données. La session est la bonne approche à utiliser ici car le cache est partagé entre les requêtes - autrement dit, l'utilisateur A verrait le rapport utilisateur B configuré si l'utilisateur B était le premier utilisateur à exécuter du code utilisant Cache au lieu de 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; 
     // .... 
    } 
}  
0

`Peut-être que ce tri n'est pas 0? Si le tri n'est pas 0 et que l'utilisateur accède à la page pour la première fois (Session ["Record"] n'a pas été défini auparavant), il risque d'obtenir l'erreur. pourrait vouloir essayer:

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