2009-07-26 37 views
12

Tôi có một dự án ứng dụng cửa sổ (C# và .NET 2.0) đã sử dụng Crystal Report 2008. Nhưng thỉnh thoảng tôi gặp lỗi (có vẻ như vô tình) trong báo cáo tải. Lỗi đó là:Báo cáo tải báo cáo CrystalReport không thành công

CrystalDecisions.Shared.CrystalReportsException: Load report failed. 
System.Runtime.InteropServices.COMException (0x8000020D): Unable to load report. 
    at CrystalDecisions.ReportAppServer.ClientDoc.ReportClientDocumentClass.Open(Object& DocumentPath, Int32 Options) 
    at CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.Open(Object& DocumentPath, Int32 Options) 
    at CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.EnsureDocumentIsOpened() 
    --- End of inner exception stack trace --- 
    at CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.EnsureDocumentIsOpened() 
    at CrystalDecisions.CrystalReports.Engine.ReportDocument.Load(String filename, OpenReportMethod openMethod, Int16 parentJob) 
    at CrystalDecisions.CrystalReports.Engine.ReportDocument.Load(String filename) 
at SIA.DataTransfer.Forms.frmReport.GetStateReport(Int32 transferType) 

vui lòng hướng dẫn tôi. Làm thế nào tôi có thể giải quyết vấn đề này?

+0

Điều này xảy ra trên máy tính phát triển của bạn? Hay chỉ là máy sản xuất? – mattruma

+0

Nó chỉ xảy ra trong các máy sản xuất. Tôi chắc chắn đường dẫn báo cáo là chính xác. – mSafdel

+0

Tôi đã gặp phải vấn đề này trước khi ... điều đầu tiên tôi phải làm là kiểm tra để đảm bảo đường dẫn báo cáo chính xác. – mattruma

Trả lời

0

Internet cũng đề nghị cài đặt lại các báo cáo pha lê trên các máy bạn đang cố mở báo cáo (đảm bảo rằng tất cả các vị trí đều có cùng phiên bản).

+0

thanx SeanJA. tôi nên kiểm tra giải pháp này. – mSafdel

16

Nếu ứng dụng của bạn là một tệp thực thi độc lập thì lỗi này được tạo vì bạn không đóng đúng đối tượng báo cáo của mình khi bạn hoàn thành nó. Bạn có thể thấy lỗi này đang chạy ứng dụng của bạn dưới dạng ứng dụng ASP.NET với nhiều người dùng truy cập trang web của bạn cùng một lúc.

Bạn có thể gây ra các lỗi xuất hiện sớm bằng cách tinh chỉnh registry key này:

HKEY_LOCAL_MACHINE\SOFTWARE\CRYSTAL DECISIONS\10.0\REPORT APPLICATION SERVER\SERVER\PrintJobLimit 

Nó thường được mặc định để 75. Đối với gỡ lỗi bạn có thể đặt nó vào một giá trị nhỏ hơn và gây ra các lỗi xuất hiện sớm hơn.

Khi bạn sử dụng xong đối tượng báo cáo, hãy gọi phương thức .Close() để xóa các tài nguyên không được quản lý sử dụng.

Có những người đề cập đến thay đổi cài đặt thành -1. Đây là một sai lầm, nó sẽ chỉ gây ra các vấn đề khác cho một ứng dụng đang chạy dài. Quá trình này cuối cùng sẽ hết nguồn lực và bắt đầu thất bại theo những cách sẽ khó khắc phục hơn nữa.

+2

Tôi đọc ở đây http://devlibrary.businessobjects.com/businessobjectsxir2/en/en/CrystalReports_dotNET_SDK/crsdk_net_doc/doc/crsdk_net_doc/html/crconsdkfundamentalsscalabilityclosemethod.htm rằng đúng thời điểm để gọi phương thức Close() là trong sự kiện Page_Unload. –

+0

Tôi chỉ cần biết nếu .dispose hoạt động cũng như .đóng (tôi nhận được một lỗi trong khi in ấn của tôi ngay cả khi sử dụng .dispose giữa các bản in). Và lỗi xảy ra chủ yếu khi tôi in hơn 75 lần ... – Minus

0

FYI, tôi vừa xác minh giải pháp này cho một vấn đề tương tự. Phương thức ReportDocument.Load đã thất bại khi sử dụng một mạng chia sẻ ánh xạ hoặc đường dẫn UNC và cài đặt các báo cáo pha lê Thời gian chạy VS trên máy chủ tệp đã khắc phục sự cố.

2

Tôi đã xác minh John Dyer's giải pháp, above, không hoạt động trong mọi trường hợp.

Tôi cũng đã xác minh rằng cài đặt lại Crystal Runtime không tốt cho lỗi cụ thể này.

Đối với ứng dụng của tôi, điều này chỉ xảy ra trên các cài đặt Citrix của một .exe độc ​​lập, với các báo cáo được nhúng. Trước khi sử dụng Trình xem báo cáo Crystal, tôi cần đảm bảo rằng tôi đã xóa mọi báo cáo được tải trước đó trong trình xem, theo hướng dẫn của John. Vì vậy, tôi sẽ viết một cái gì đó (trong VB) trông giống như

Public Function ShowRpt(...) As Boolean 
    .... 
    CleanOutViewer() 
    .... 
End Function 

nơi CleanOutViewer là:

Private Sub CleanOutViewer() 
    If Not Me.CrystalReportViewer1.ReportSource() Is Nothing Then 
     CType(Me.CrystalReportViewer1.ReportSource(), CrystalDecisions.CrystalReports.Engine.ReportDocument).Close() 
     CType(Me.CrystalReportViewer1.ReportSource(), CrystalDecisions.CrystalReports.Engine.ReportDocument).Dispose() 
     Me.CrystalReportViewer1.ReportSource() = Nothing 
     GC.Collect() 
    End If 
End Sub 

Các cuộc gọi sau khi .Close() cũng không có hiệu lực thi hành (và được thêm vào như là một thay thế cố gắng để buộc các Crystal để phát hành tài nguyên).

+0

Ngoài ra: sử dụng tài nguyên nhúng thay vì báo cáo được lưu trữ trên hệ thống tệp không có hiệu lực - Tôi chưa bao giờ làm như vậy và nhận được lỗi này. –

2

Tài liệu báo cáo tinh thể cần được xử lý thủ công.

Bạn nên kiểm soát toàn bộ thời gian của tất cả Báo cáo trong ứng dụng của mình và gọi Dispose của chúng trước khi đạt đến giới hạn 75.

Có một cách tiếp cận tốt về làm thế nào để đạt được điều này trong liên kết này:

http://geekswithblogs.net/technetbytes/archive/2007/07/17/114008.aspx

4

Tăng CurrentJobLimit không được các giải pháp; số này sẽ đạt được nếu bộ đếm không được đặt lại. Để tránh tăng số lượng công việc, bạn cần đóng Tài liệu báo cáo tinh thể (ReportSource.Close()) theo lập trình.

protected void Page_Unload(object sender, EventArgs e) 
{ 
    CrystalReportViewer1.ReportSource.Close(); 
} 

Đây là cách duy nhất để tránh tiếp tục ngày càng tăng của báo cáo mở ra, mà được tính bằng CurrentJobLimit

+0

Tôi đang sử dụng CR 13 và CrystalReportViewer không có phương thức .Close(). Làm cách nào để đóng tài liệu? –

+1

@LukinhaRS không phải là CrystalReportViewer nhưng CrystalReportViewer1.ReportSource có phương thức Đóng. –

+0

@EmanueleGreco, CrystalReportViewer1 là gì? – Apostrofix

Các vấn đề liên quan