0

これについて多くのスレッドを見つけたので、これに問題があることは知っていますが、何もうまくいかず、夢中になっています!

レポートを生成するときにログオン情報を変更する必要があります。ただし、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

さて、私は立ち往生しており、本当にあなたの助けが必要です!! ありがとう

4

1 に答える 1

0

これは数か月後のことであり、解決した可能性があります。Crystal Reports を 2008 から 2012 にアップグレードする際に、パラメーターとログイン資格情報を渡す方法に問題があることに気付きました。全体として、すべてが期待どおりに機能していませんでした。

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;
    }
于 2013-09-18T16:05:42.997 に答える