0

Visual Studio 2008、mvc 2 に付属の Crystal レポートを使用しています。ユーザーがリンクをクリックすると、PDF レポートが生成されます。

これは、クリスタルレポートを構成する私の方法です

    public ReportClass ConfigureReportClass(string strReportPath, object[] objParameters)
    {
        ReportClass rptH = new ReportClass();
        try
        {
                rptH = new ReportClass();
                rptH.FileName = strReportPath;
                int Count = 0;
                rptH.Load();
                if (objParameters == null)
                    return rptH;
                foreach (object obj in objParameters)
                {
                    ParameterField param = rptH.ParameterFields[Count++];  // first param 
                    param.AllowCustomValues = true;
                    ParameterDiscreteValue Disparam = new ParameterDiscreteValue();
                    Disparam.Value = obj;
                    param.CurrentValues.Add(Disparam);
                }

        }
        catch (Exception ex)
        {
            throw ex;
        }
        return rptH;
    }

これはPDFに変換するためのものです

        public System.IO.Stream GetPDFStream(CrystalDecisions.CrystalReports.Engine.ReportClass rptClass)
    {
        System.IO.Stream stream = rptClass.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
        return stream;
    }

これはコントローラーのアクションメソッドです

        public FileResult GetComplaintFile(String ComplaintNumber)
    {
        HomeBLLC objHomeBLLC = new HomeBLLC();
        ReportClass rptH = objHomeBLLC .ConfigureReportClass(Server.MapPath("~/Views/Complaint/ComplaintReport.rpt"), new object[] { ComplaintNumber });
        return File( objHomeBLLC.GetPDFStream(rptH),"application/pdf" );
    }

Visual Studio のデザイン ビューでレポートのプレビューを表示できますが、実行時に例外が発生します

 Logon failed.

詳細: 28000:[Microsoft][ODBC SQL Server ドライバー][SQL Server]ユーザー 'user' のログインに失敗しました。ファイル C:\Windows\TEMP\ComplaintReport {5BDD522D-04DA-48CD-9F43-A9C648F195D9}.rpt のエラー: 接続できません: ログオン パラメータが正しくありません。CrystalDecisions.ReportAppServer.ConvertDotNetToErom.ThrowDotNetException(Exception e) で CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext) で CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext) で CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportOptions) F:\myapp\BLL\Home\HomeBLLC.CS:line 1082 の myapp.BLL.Home.HomeBLLC.GetPDFStream(ReportClass rptClass) で CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportFormatType formatType) で

F:\myapp\Controllers\ComplaintController.cs:line 709 の myapp.Controllers.ComplaintController.GetComplaintFile(String ComplaintNumber) F:\myapp\Controllers\ComplaintController.cs:line 76 の myapp.Controllers.ComplaintController.Complaint() lambda_method (ExecutionScope 、 ControllerBase 、 Object[] ) で System.Web.Mvc.ActionMethodDispatcher.Execute (ControllerBase コントローラー、Object[] パラメーター) で System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext、IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 パラメーター) で System. .Web.Mvc.ControllerActionInvoker.<>c_ DisplayClassd.b _a () で System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter フィルター、ActionExecutingContext preContext、Func1 continuation) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IListSystem.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) での 1 つのフィルター、ActionDescriptor actionDescriptor、IDictionary`2 パラメーター)

同じ DSN を使用している他のアプリケーションが Crystal レポートを正しく実行しているため、私の DSN は正しく構成されています。

前もって感謝します

4

1 に答える 1

0

基本的なことを見逃していました。関連する質問を調べた後、必要なCrystal Reportメソッドの構成で認証を与えるのを忘れていることがわかりました。修正したメソッドは次のとおりです

    public ReportClass ConfigureReportClass(string strReportPath, object[] objParameters)
    {
        ReportClass rptH = new ReportClass();
        rptH.FileName = strReportPath;
        int Count = 0;
        rptH.Load();
        rptH.SetDatabaseLogon("myusername", "mypassword");
        try
        {
            if (objParameters == null)
                return rptH;
            foreach (object obj in objParameters)
            {
                ParameterField param = rptH.ParameterFields[Count++];  // first param 
                param.AllowCustomValues = true;
                ParameterDiscreteValue Disparam = new ParameterDiscreteValue();
                Disparam.Value = obj;
                param.CurrentValues.Add(Disparam);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return rptH;
    }

私が追加した唯一のものは、 rptH.SetDatabaseLogon("myusername", "mypassword"); です。 私のコードとその動作に。DSN で既に認証を行っているため、再度認証を行う必要がある理由がわかりません。どんな提案でも大歓迎です。

于 2012-08-16T07:06:07.553 に答える