登录失败。详细信息:28000:[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]用户'用户'登录失败

时间:2012-08-14 09:59:24

标签: c# asp.net-mvc-2 crystal-reports

我正在使用visual studio 2008附带的Crystal报告,mvc 2。 我希望当用户点击链接时生成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(例外e)    在CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext)    在CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext)    在CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportOptions选项)    在CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportFormatType formatType)    at myapp.BLL.Home.HomeBLLC.GetPDFStream(ReportClass rptClass)在F:\ myapp \ BLL \ Home \ HomeBLLC.CS:第1082行

在F:\ myapp \ Controllers \ ComplaintController.cs中的myapp.Controllers.ComplaintController.GetComplaintFile(String ComplaintNumber):第709行    在F:\ myapp \ Controllers \ ComplaintController.cs中的myapp.Controllers.ComplaintController.Complaint():第76行    在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, IDictionary 2个参数)    在System.Web.Mvc.ControllerActionInvoker。&lt;&gt; c_ DisplayClassd.b _a()    在System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter过滤器,ActionExecutingContext preContext,Func 1 continuation) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList 1过滤器,ActionDescriptor actionDescriptor,IDictionary`2参数)    在System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)

我的DSN配置正确,因为使用相同DSN的其他应用程序正在正确运行Crystal报表。

提前致谢

1 个答案:

答案 0 :(得分:0)

我错过了基本的东西,在研究了相关的问题后,我才知道我忘了在我的配置水晶报告方法中进行认证,这是必要的 我修改过的方法如下

    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中提供了身份验证。任何建议都是欢迎。