0

データをセッションにロードして、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;

私はこのコードを試していますが、次のボタンをクリックすると、無効なレポートソースというエラーが表示されます。セッションがnullであると推測されるため、このエラーが発生します。

どんな推測でも、どうすればこれを解決できますか...

4

3 に答える 3

1

ここでのSessionの代わりに、ユーザーごとに一意のキーを持つCacheオブジェクトを使用したいと思います。

擬似コード:

var data = Cache["Record_999"] as DataTable;
if (data == null) {
    // get from db
    // insert into cache
}
SetDataSource(data);
于 2008-10-15T22:19:06.140 に答える
0

`ソートが 0 ではない可能性がありますか? sort が 0 ではなく、ユーザーが初めてページにアクセスする場合 (Session["Record"] が以前に設定されていない場合)、エラーが発生する可能性があります。試してみたいかもしれません:

if(sort==0 || Session["Record"] == null)
{
// do your magic
}
于 2008-10-16T01:42:58.630 に答える
0

問題は Session の使用にあるのではなく、いつデータを取得するかを決定するために使用されるロジックにあります。キャッシュはリクエスト全体で共有されるため、ここではセッションを使用するのが適切な方法です。つまり、ユーザー B がセッションの代わりにキャッシュを使用するコードを実行した最初のユーザーである場合、ユーザー 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;
         // ....
    }
}       
于 2008-10-16T01:20:57.320 に答える