0

Crystal Report のソースとしてストア プロシージャをパラメータ化しました。コード C# の背後からそれらを渡そうとしています。

多くのトピックを参照しましたが、まだ何かが欠けていて、エラーが発生しています:

Failed to open a rowset. Details: ADO Error Code: 0x Source: Microsoft SQL Native Client Description: Procedure 'SP_GetProductsbySales' expects parameter '@top', which was not supplied. SQL State: 42000 Native Error: Failed to open a rowset. Error in File C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\TopSelling_Report {B8B4EAE6-D01E-4D18-9003-23A047F9DD5B}.rpt: Failed to open a rowset

これが私のコードです:

 private void ConfigureCrystalReports()
{
    rpt = new ReportDocument();

    string reportPath = Server.MapPath("TopSelling_Report.rpt");

    CrystalReportViewer1.ParameterFieldInfo.Clear();
    ParameterFields param = CrystalReportViewer1.ParameterFieldInfo;
    ParameterField top = new ParameterField();
    top.Name = "@top";
    ParameterDiscreteValue top_val = new ParameterDiscreteValue();
    top_val.Value = 100;
    top.CurrentValues.Add(top_val);

    ParameterField all = new ParameterField();
    all.Name = "@all";
    ParameterDiscreteValue all_val = new ParameterDiscreteValue();
    all_val.Value = false;
    all.CurrentValues.Add(all_val);

    param.Add(top);
    param.Add(all);
    CrystalReportViewer1.ParameterFieldInfo = param;


    rpt.Load(reportPath);
    rpt.SetParameterValue(0, Convert.ToInt32(50));
    rpt.SetParameterValue(1, Convert.ToBoolean(false));


    ConnectionInfo connectionInfo = new ConnectionInfo();
    connectionInfo.ServerName = "xxxx";
    connectionInfo.DatabaseName = "xxxxx";
    connectionInfo.UserID = "xxx";
    connectionInfo.Password = "xxxx";
    SetDBLogonForReport(connectionInfo, rpt);
    CrystalReportViewer1.ReportSource = rpt;
}
private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument reportDocument)
{
    Tables tables = reportDocument.Database.Tables;
    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
    {
        TableLogOnInfo tableLogonInfo = table.LogOnInfo;
        tableLogonInfo.ConnectionInfo = connectionInfo;
        table.ApplyLogOnInfo(tableLogonInfo);
    }
}

ご覧のとおり、両方の方法でパラメーターを渡そうとしましたが、それでもエラーが発生します。SetDBLogonForReport()メソッドを削除すると、問題なく動作するという特定の問題が見つかりました。したがって、自動ログインを削除すると正常に動作しますが、そのままにしておくか、そのコードを変更すると、エラーが発生します。

コードを SetDatabaseLogon() メソッドに置き換えようとしましたが、予期しないログイン プロンプトが表示されます。

Visual Studio 2005 を使用しています。ご協力ありがとうございます。ありがとう。

4

0 に答える 0