我正在使用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。<> 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报表。
提前致谢
答案 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中提供了身份验证。任何建议都是欢迎。