我想将数据加载到会话中,这样当在crystal report viewer中单击下一个按钮时,应该从数据表中加载数据,而不是从数据库中再次检索数据。这是我的代码......
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;
我正在尝试此代码但是当我点击下一个按钮时,它会给我一个错误,即无效的报告源...我猜这个会话是空的,这就是为什么它给我这个错误。
任何sugesstions如何解决这个问题...
答案 0 :(得分:1)
我认为您希望将Cache对象与每个用户的唯一键一起使用,而不是在此处使用Session。
伪代码:
var data = Cache["Record_999"] as DataTable;
if (data == null) {
// get from db
// insert into cache
}
SetDataSource(data);
答案 1 :(得分:0)
问题不在于使用Session,而在于用于确定何时检索数据的逻辑。会话是这里使用的正确方法,因为缓存在请求之间共享 - 也就是说,如果用户B是第一个执行使用Cache而不是Session的代码的用户,则用户A会看到用户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;
// ....
}
}
答案 2 :(得分:0)
`可能是那种排序不是0吗?如果sort不是0并且用户第一次访问该页面(之前没有设置Session [“Record”]),他可能会收到错误。 可能想尝试:
if(sort==0 || Session["Record"] == null)
{
// do your magic
}