【发布时间】:2020-08-25 13:41:47
【问题描述】:
我正在使用 Crystal Reports 在 Visual Studio 2019 中的 c# mvc Web 应用程序中创建报表。该报表有 6 个子报表,每个子报表都使用与主报表相同的参数 ['billId']。该报告在本地和我们的开发服务器上运行良好,两者都连接到相同的数据库服务器,如 .rpt 文件中所定义。但是,当我使用不同的数据库服务器部署到我们的测试环境时,它当然无法连接。我们正在使用集成安全性。
然后,我添加了代码来循环遍历所有表和子报表(及其关联的表),以编程方式为每个表指定数据库服务器和登录信息。当我单步执行代码时,这似乎有效,但最终在传递我们所有代码后的某个时间抛出“提示信息丢失”错误。
我在 SAP 支持网站上找到的唯一建议是“更新子报表链接”。这些链接看起来都很好,或者我只是不明白“更新子报表链接”的真正含义。
这是我们的代码块:
var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
var connectionInfo = new ConnectionInfo();
connectionInfo.ServerName = conn.DataSource;
connectionInfo.DatabaseName = "OurDatabaseName";
connectionInfo.IntegratedSecurity = true;
connectionInfo.Type = ConnectionInfoType.SQL;
if (Request.QueryString["billId"] != null)
{
var reportName = Request.QueryString["reportName"];
var billId = Int32.Parse(Request.QueryString["billId"]);
ReportDocument rd = new ReportDocument();
string path = Server.MapPath("~") + "Reports//" + reportName;
rd.Load(path);
rd.SetParameterValue("billId", billId);
TableLogOnInfo crTableLogOnInfo = new TableLogOnInfo();
Tables crTables = rd.Database.Tables;
foreach (Table crTable in crTables)
{
crTableLogOnInfo = crTable.LogOnInfo;
crTableLogOnInfo.ConnectionInfo = connectionInfo;
crTable.ApplyLogOnInfo(crTableLogOnInfo);
}
foreach (ReportDocument crSubReport in rd.Subreports)
{
foreach (Table crSubTable in crSubReport.Database.Tables)
{
TableLogOnInfo crSubTableLogOnInfo = crSubTable.LogOnInfo;
crSubTableLogOnInfo.ConnectionInfo = connectionInfo;
crSubTable.ApplyLogOnInfo(crSubTableLogOnInfo);
}
rd.SetParameterValue("billId", billId, crSubReport.Name.ToString());
}
}
CrystalReportViewer1.RefreshReport();
CrystalReportViewer1.ReportSource = rd;
CrystalReportViewer1.EnableDatabaseLogonPrompt = false;
生成的堆栈跟踪:
[COMException (0x80004005): Prompting information is missing.]
CrystalDecisions.ReportAppServer.Prompting.IPromptEngine.startPrompting(PromptingUnits units, CRPromptingInfoProvider infoProvider, PromptingOption option) +0
CrystalDecisions.ReportSource.EromReportSourceBase.DoParameterPrompting(PromptingRequestContext reqContext) +601
CrystalDecisions.CrystalReports.Engine.FormatEngine.DoParameterPrompting(PromptingRequestContext reqContext) +44
CrystalDecisions.ReportSource.LocalReportSourceBase.DoParameterPrompting(PromptingRequestContext reqContext) +155
CrystalDecisions.Web.ReportClosedExceptionHandlingReportSource.DoParameterPrompting(PromptingRequestContext reqContext) +41
CrystalDecisions.Web.ReportAgentBase.DoPrompting(PromptingHTMLRenderOption htmlOption) +105
CrystalDecisions.Web.Components.ParamComponent.ShowFullPrompt() +62
CrystalDecisions.Web.Components.ParamComponentBase.HandleException(Exception e) +58
CrystalDecisions.Web.CrystalReportViewer.HandleExceptionAndPromptIfNeeded(Exception x, EnumAspNetLifeCycleStage stage) +297
CrystalDecisions.Web.CrystalReportViewer.OnPreRender(EventArgs e) +106
System.Web.UI.Control.PreRenderRecursiveInternal() +166
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Control.PreRenderRecursiveInternal() +236
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4714
任何想法或其他已知有效的代码模式将不胜感激!谢了。
【问题讨论】:
标签: c# visual-studio model-view-controller crystal-reports