1

vs 2010 c# で Crystal レポートを使用し、CR の rpt ドキュメントを使用して pdf ファイルを作成します。

このコードを Windows サービスに配置すると、コードは 30 ~ 40 回正常に動作しますが、メモリは +5 +7 ごとに増加します。

最後に次のようなエラーが発生しました: load file is failed !

私のコード:(connを破棄/閉じると思いますが、どのように)

     private void ReportLogin(ReportDocument crDoc, string Database, string Server, string UserID, string Password)
    {
        try
        {
            crConnectionInfo = new ConnectionInfo();
            crConnectionInfo.ServerName = Server;
            crConnectionInfo.DatabaseName = Database;
            crConnectionInfo.UserID = UserID;
            crConnectionInfo.Password = Password;

            crDatabase = crDoc.Database;
            crTables = crDatabase.Tables;

            foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in crTables)
            {
                crTableLogonInfo = crTable.LogOnInfo;
                crTableLogonInfo.ConnectionInfo = crConnectionInfo;
                crTable.ApplyLogOnInfo(crTableLogonInfo);
            }
        }
        catch (Exception x)
        {
            throw x;
        }
    }

    private void _CrystalReport(string RptFilePath)
    {

        reportDocument = LoadDoc(RptFilePath);

        RptParamsWithType = new Dictionary<string, string>();

        if (reportDocument.ParameterFields.Count > 0)
        {
            foreach (ParameterField pField in reportDocument.ParameterFields)
            {
                RptParamsWithType.Add(pField.Name,              pField.ParameterValueType.ToString().Replace("Parameter", ""));
            }
        }
    }

ロード機能:

    private ReportDocument LoadDoc(string RptFilePath)
    {
        try
        {
            reportDocument = new ReportDocument();
            reportDocument.Load(RptFilePath);

            return reportDocument;

        }
        catch (Exception x)
        {
            throw x;
        }

    }

最後に呼び出された私の関数は create pdf です:

     public MemoryStream asPdf
    {
        get
        {
            using (TempMemoryStream = (MemoryStream)reportDocument.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat))
            {
                return TempMemoryStream;
            }
        }
    } 

ありがとうアドバイス、助けてください

4

3 に答える 3

1

このサンプルのようにコードを変換したところ、動作しました!

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using CrystalDecisions;
using CrystalDecisions.CrystalReports;
using CrystalDecisions.CrystalReports.Engine;

namespace Test.Utilities
{
   public class ReportFactory
   {
       protected static Queue reportQueue = new Queue();

       protected static ReportClass CreateReport(Type reportClass)
      {
        object report = Activator.CreateInstance(reportClass);
        reportQueue.Enqueue(report);
        return (ReportClass)report;
      }

    public static ReportClass GetReport(Type reportClass)
    {
        //75 is my print job limit.
        if (reportQueue.Count > 75) ((ReportClass)reportQueue.Dequeue()).Dispose();
        return CreateReport(reportClass);
    }
  } 
}

元のリンク

于 2013-05-16T14:51:50.417 に答える
0
    private void LoadReport()
    {
        doc = new ReportDocument();
        doc.Load(Server.MapPath("CrSalesReport.rpt"));
        doc.SetDatabaseLogon(AppConfig.ReportServerDSUserName, AppConfig.ReportServerDSPassword, AppConfig.ReportServerDomain, "TexERP", false);

    }

データベースログオンのためにこのコードを試してください

于 2013-05-08T10:43:28.957 に答える