[英]Crystal Reports changing logon info at runtime doesn't work C#
我知道這是有問題的,因為我發現了很多與此相關的話題,但對我沒有任何幫助,我快瘋了!
生成報告時,我必須更改登錄信息。 但是ApplyLogOnInfo方法總是帶回不良數據。 我嘗試連接到ODBC MySQL數據庫。
這是我的代碼:
ReportDocument myReport = new ReportDocument();
myReport.Load("myReportPath");
ParameterField myParamFieldId = myReport.ParameterFields["param1"];
ParameterDiscreteValue param = new ParameterDiscreteValue();
param.Value = "param1";
myParamFieldId.CurrentValues.Add(param);
ParameterField myParamFieldNumRevision = myReport.ParameterFields["param2"];
ParameterDiscreteValue paramNumRevision = new ParameterDiscreteValue();
param.Value = "param2";
myParamFieldNumRevision.CurrentValues.Add(param);
ApplyLogOnInfo(myReport);
try
{
myReport.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, true, "Rapport");
myReport.Close();
}
catch (Exception ex)
{
throw ex;
}
finally
{
myReport.Dispose();
}
private void ApplyLogOnInfo(ReportDocument rpt)
{
ConnectionInfo connInfo = new ConnectionInfo();
connInfo.ServerName = "test";
connInfo.DatabaseName = "test";
connInfo.UserID = "test";
connInfo.Password = "test";
connInfo.Type = ConnectionInfoType.CRQE;
connInfo.IntegratedSecurity = false;
foreach (CrystalDecisions.CrystalReports.Engine.Table table in rpt.Database.Tables)
{
TableLogOnInfo logonInfo = table.LogOnInfo;
logonInfo.ConnectionInfo = connInfo;
table.ApplyLogOnInfo(logonInfo); // Here, old values are brought back
}
// Idem on Sub-reports
foreach (ReportDocument sousRpt in rpt.Subreports)
{
ReportDocument rptSub = rpt.OpenSubreport(sousRpt.Name);
foreach (CrystalDecisions.CrystalReports.Engine.Table table in rptSub.Database.Tables)
{
TableLogOnInfo logonInfo = table.LogOnInfo;
logonInfo.ConnectionInfo = connInfo;
table.ApplyLogOnInfo(logonInfo);
}
}
}
我看到這可能是由於子報表和參數所致。 沒有辦法使它起作用。
我也嘗試過:
rpt.DataSourceConnections[0].SetConnection("test", "test", "test", "test");
// But DataSourceConnections[0].Attributes and DataSourceConnections[0].LogonProperties still store values from the old connection, and doesn't work. I tried to clear it does'nt apply.
// I tried to pass parameters like this
myReport.SetParameterValue("param1", "test");
myReport.SetParameterValue("param1", "test");
// I tried with dataset and fill method
好吧,現在我被困住了,真的需要您的幫助! 謝謝
我知道這是幾個月后,您可能已經解決了。 從2008年到2012年升級Crystal Reports時,我注意到我們傳遞參數和登錄憑據的方式存在問題。 總的來說,一切都沒有我希望的那樣。
我認為最好編寫一個在2008年和2012年都兼容並且整體上更靈活的新功能。 它需要查看器,源,報告路徑和參數來全部加載。
我剛剛在2008年的生產環境中開始使用此功能,獲得了一些效果斐然的報告。 我建議您對其進行一些修改,如果它不能完全按照您期望的子報表(可能來自或可能不來自其他ODBC登錄憑據)的方式工作。
public void LoadCrystalReportViewer(CrystalReportViewer crystalReportViewer, CrystalReportSource crystalReportSource, string reportFilePath, Dictionary<string, object> parameters)
{
crystalReportSource.ReportDocument.FileName = reportFilePath;
crystalReportSource.ReportDocument.Load(reportFilePath);
crystalReportSource.ReportDocument.Database.Tables[0].LogOnInfo.ConnectionInfo.Password = "PASSWORD";
crystalReportSource.ReportDocument.Database.Tables[0].ApplyLogOnInfo(crystalReportSource.ReportDocument.Database.Tables[0].LogOnInfo);
foreach (KeyValuePair<string, object> parameter in parameters)
{
if (crystalReportSource.ReportDocument.ParameterFields[parameter.Key] != null)
{
crystalReportSource.ReportDocument.SetParameterValue(parameter.Key, parameter.Value);
}
}
crystalReportSource.EnableCaching = true;
crystalReportSource.CacheDuration = 300;
crystalReportViewer.ReportSource = crystalReportSource;
crystalReportViewer.ReuseParameterValuesOnRefresh = true;
crystalReportViewer.EnableParameterPrompt = false;
crystalReportViewer.LogOnInfo.Add(crystalReportSource.ReportDocument.Database.Tables[0].LogOnInfo);
foreach (ParameterField parameterField in crystalReportViewer.ParameterFieldInfo)
{
parameterField.DefaultValues = crystalReportSource.ReportDocument.ParameterFields[parameterField.Name].CurrentValues;
}
crystalReportViewer.Visible = true;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.