簡體   English   中英

Crystal Reports在運行時更改登錄信息不起作用C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM