水晶報表開發部署常見棘手問題


 

  1. 報Log4net錯誤

    如圖所示

    出現這樣的錯誤,請查看C:\Windows\assembly目錄下的log4net處理器體系結構

    當然不止x86結構了,可能會有amd64之類,在x86結構下,我們只需要設置IIS應用程序池x86處理,如圖所示,只需啟用32位應用程序。

    那么問題來了,如果log4net是基於amd64處理器體系結構,那怎么辦?

  2. 已達到系統管理員配置的最大報表處理作業數限制

    出現這樣的問題,有兩種辦法解決

      1. 辦法一(修改注冊表)

        出現這個問題,通常是水晶報表設置了打印次數限制,初始設置是75,那么出現打印次數這樣的錯誤,我們需要設置注冊表

        [HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer]
         修改PrintJobLimit為最大數,或者設置為-1

         

        [HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\Server]
         修改PrintJobLimit為最大數,或者設置為-1

        注意:不同版本的水晶報表,對應的注冊表結構不同,需要自己查找注冊表的對應位置。

        如下圖,水晶報表對應的位置

         

         

         

         

      2. 辦法二(程序中設置創建ReportDocument對象隊列)

        原理:當報表當前使用次數達到最大值的時候,我們將報表ReportDocument資源全部釋放掉,重新創建ReportDocument對象。

    public class ReportFactory
    {
    	protected static Queue reportQueue = new Queue();
    	protected static int iMaxCount = 75;
    	protected static ReportDocument CreateReport(Type reportClass)
    	{
    		object report = Activator.CreateInstance(reportClass);
    		reportQueue.Enqueue(report);
    		return (ReportDocument)report;
    	
    	}
    	public static ReportDocument GetReport(Type reportClass)
    	{
    		if (reportQueue.Count > iMaxCount)
    		{
    			((ReportDocument)reportQueue.Dequeue()).Close();
    			((ReportDocument)reportQueue.Dequeue()).Dispose();
    			GC.Collect();
    		}
    		return CreateReport(reportClass);
    	}
    }
    
    調用方法
    
    CrystalDecisions.CrystalReports.Engine.ReportDocument crReportDocument = new ReportDocument();
    
    crReportDocument = ReportFactory.GetReport(crReportDocument.GetType());
    

      

  3. 多行文本對齊

    對於這樣的問題,我嘗試修改水晶報表內部javascript文件,或者使用代碼調整,又或者調整內部腳本,沒有一次能成功,盡管顯示的時候,像word一樣的效果,但是打印出來的結果,還是不會變。最后在google搜索下,這樣的問題無法解決,最后對這個產品徹底失望。很奇怪的是,像這樣的大型的水晶報表公司,連這個問題都無法解決,真是奇葩了。

  4. 出現通信錯誤。將停止打印

    這類問題很簡單

    主要是兩個問題引起的

    1. 報表數據綁定和報表屬性配置的問題
      1. 如果是報表數據綁定

        如果不是報表配置的問題,請把相關的數據放入Page_Load(object sender, EventArgs e)

      2. 如果是報表屬性配置,請把配置信息放入

        Page_Init(object sender, EventArgs e)

    2. 數據綁定問題

      出現這個問題,請把數據存儲到session(適用不限於一個頁面也可以在整個應用程序中使用)或者ViewState(適用單頁面)中,比如這樣

       

      If(Session["Report"]==null)
      {
      	boReportDocument = new ReportDocument();
      	boReportDocument.Load("reportname.rpt");
      	Session.Add("Report", boReportDocument);
      }
      CrystalReportViewer.ReportSource = Session["Report"];
      

        

      至於為什么為什么要在HttpSession存儲ReportDocument對象,經過我的觀察,當頁面不斷的回發加載報表的時候,同時也不斷的在C盤window目錄下temp創建臨時ReportDocument文件,這樣就不斷的讀寫文件,那在高負載的這樣的環境,是不是損失了很多性能?那為什么從磁盤加載報表在每次回發時可能是一個非常壞的主意?無疑有以下幾個問題:

  • 高負載加載讀取報表,所影響的性能?
  • 高負載數據庫的重新查詢,報表每一頁的數據呈現所影響的性能?
  • 高負載增加應用服務器和數據庫之間的網絡流量,所影響的性能?
              3. 瀏覽器呈現報表問題

        呈現報表數據的時候,不要把報表頁面嵌在iframe或者不同的http端口服務下下,盡管你的程序沒有錯誤,但是彈出安裝水晶報表activex控件的時候,這個時候頁面會刷新,但刷新的不是當前呈現報表數據的窗口,而是iframe父窗口,這時可能activex控件安裝可能就無法映射到當前呈現報表數據的窗口了,而是映射到了父窗口了,所以才會出現通信錯誤。同樣不同http端口,也會出現這樣的問題,據我的理解,應該是安裝activex控件的時候,沒有映射到具體的位置。以上是我對這個問題的理解,有錯誤,請指正。

  5.水晶報表刻度單位

    1. 水晶報表的最小度量單位其實是緹,1厘米=567緹,這個是他的精度。上移和下移手工拖動有時候動作會太大,可以這樣做微調,點鍾某個字段或對象,可以看到右邊的屬性框里有如下屬性left,top,width等,可以輸入這個值進行精確微調。其實就算換算微調,很難調准確,差距還是很大,必須用實際打印出來的報表,使用尺子去量。

  6.不支持的操作。無法在 C++ 堆棧中打開由 JRC 引擎處理的文檔

 

  你得到這個錯誤的原因是文件名,路徑無效或CR無法訪問文件。如果路徑和文件名都是正確無疑的,那么你要確保Network Service用戶有讀/寫的Temp文件夾權限(一般C:\Windows\Temp)。如果還不能解決問題也許你的臨時文件夾已滿,CR沒有清理垃圾。如果是這種情況,那么你需要適當的請求GC釋放ReportDocument對象資源。

  有的時候,CR行為變幻莫測。當你使用ReportDocument對象調用Dispose()之后,隨后GC.Collect可能仍然沒有清理Temp文件夾。而且就算Temp文件夾中的.rpt文件沒有任何限制,CR仍然也有可能停止執行ReportDocument釋放資源請求。

  很奇怪,這些通常發生在內部函數或事件處理程序中的ReportDocument對象。但是,如果你聲明一個全局的ReportDocument對象,並且調用Dispose方法,這時垃圾很快清理掉了。

釋放資源代碼樣例 

        public override void Dispose()
        {
            try
            {

                if (this.CrystalReportViewer1 != null)
                {
                    this.CrystalReportViewer1.Dispose();
                    this.CrystalReportViewer1 = null;

                }
                if (reportdocument != null)
                {
                    reportdocument.Close();
                    reportdocument.Dispose();
                    GC.ReRegisterForFinalize(reportdocument);
                }
            }
            catch (Exception ex)
            {

            }
        }
        protected void Page_UnLoad(object sender, EventArgs e)
        {
            //建立完頁面時,釋放報表文檔資源         
            try
            {

                if (this.CrystalReportViewer1 != null)
                {
                    this.CrystalReportViewer1.Dispose();
                   this.CrystalReportViewer1 = null;

                }
                if (reportdocument != null)
                {
                    reportdocument.Close();
                    reportdocument.Dispose();
                    GC.ReRegisterForFinalize(reportdocument);
                }
                this.Dispose();
                this.ClearChildState();
            }
            catch (Exception ex)
            {


            }
        }

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM