2013-07-26 34 views
0

我知道這有一個問題,因爲我發現很多關於此的線程,但沒有任何工作適合我,我越來越瘋狂!Crystal Reports在運行時更改登錄信息不起作用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 

現在好了,我卡住了,真的需要你的幫助!謝謝

回答

0

我意識到這是幾個月後,你可能已經解決了它。在將我們的Crystal Reports從2008年升級到2012年時,我注意到我們如何傳遞參數和登錄憑證存在問題。總的來說,一切都沒有按照我的希望工作。

我決定最好編寫一個在2008年和2012年都兼容的新功能,並且整體上更加靈活。它需要查看器,源代碼,報告路徑和參數來加載它。

我剛剛在2008年的Production環境中開始使用這個功能,可以獲得一些結果很好的報告。我建議你修改一下,如果它不能像你可能希望得到的可能或不可能來自不同的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; 
    }