C# Crystal Reports的ConnectionInfo和Parameters

4
我有一个C#应用程序,它会传递一些参数给Crystal报表,然后加载该报表。这一切都按预期工作,但现在我需要将该应用程序运行在不同于本地数据库的其他数据库上。
我已经添加了报表的连接信息,但是当加载报表时,它现在提示输入报表参数。如果我对本地数据库运行相同的代码(带有连接信息),则可以正确运行(无需参数提示)。以下是我的代码:
        public frmReport(ReportDocument cryRpt, DateTime dFromDate, DateTime dToDate,
        Int32 iEmployeeId, Int32 iRetentionDays, 
        Boolean bExTax, Boolean bShowDefinitions, DBase _oDbase, Log _oLog)
    {
        InitializeComponent();

        _oDBase = _oDbase;

        iEmployeeIdReport = iEmployeeId;

        TableLogOnInfos crtablelogoninfos = new TableLogOnInfos();
        TableLogOnInfo crtablelogoninfo = new TableLogOnInfo();
        ConnectionInfo crConnectionInfo = new ConnectionInfo();
        Tables CrTables;

        string sWowPath = Wow6432Path();

        crConnectionInfo.ServerName = Registry.LocalMachine.OpenSubKey(@"Software" + sWowPath + "\\ShortCuts\\Database\\ShortcutsPOS").GetValue("Server").ToString(); ;
        crConnectionInfo.DatabaseName = Registry.LocalMachine.OpenSubKey(@"Software" + sWowPath + "\\ShortCuts\\Database\\ShortcutsPOS").GetValue("Database").ToString(); ;
        crConnectionInfo.UserID = Properties.Settings.Default.Username.ToString();
        crConnectionInfo.Password = Properties.Settings.Default.Password.ToString();

        CrTables = cryRpt.Database.Tables;

        foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables)
        {
            crtablelogoninfo = CrTable.LogOnInfo;
            crtablelogoninfo.ConnectionInfo = crConnectionInfo;
            CrTable.ApplyLogOnInfo(crtablelogoninfo);
        }


        ParameterFields myParams = new ParameterFields();
        ParameterField paramFieldFrom = new ParameterField();
        ParameterField paramFieldTo = new ParameterField();
        ParameterField paramFieldEmployeeId = new ParameterField();
        ParameterField paramFieldRetentionDays = new ParameterField();
        ParameterField paramFieldExTax = new ParameterField();
        ParameterField paramFieldShowDefinitions = new ParameterField();

        ParameterDiscreteValue paramDiscreteValueFrom = new ParameterDiscreteValue();           
        ParameterDiscreteValue paramDiscreteValueTo = new ParameterDiscreteValue();
        ParameterDiscreteValue paramDiscreteEmployeeId = new ParameterDiscreteValue();
        ParameterDiscreteValue paramDiscreteValueRetentionDays = new ParameterDiscreteValue();
        ParameterDiscreteValue paramDiscreteValueEmployeeLevelList = new ParameterDiscreteValue();
        ParameterDiscreteValue paramDiscreteValueExTax = new ParameterDiscreteValue();
        ParameterDiscreteValue paramDiscreteValueShowDefinitions = new ParameterDiscreteValue();

        paramFieldFrom.Name = "FromDate";
        paramFieldTo.Name = "ToDate";
        paramFieldEmployeeId.Name = "EmployeeId";
        paramFieldRetentionDays.Name = "RetentionDays";
        paramFieldExTax.Name = "ExTax";
        paramFieldShowDefinitions.Name = "ShowDefinitions";

        paramDiscreteValueFrom.Value = dFromDate;                       
        paramDiscreteValueTo.Value = dToDate;
        paramDiscreteEmployeeId.Value = iEmployeeId;
        paramDiscreteValueRetentionDays.Value = iRetentionDays;
        paramDiscreteValueExTax.Value = bExTax;
        paramDiscreteValueShowDefinitions.Value = bShowDefinitions;

        paramFieldFrom.CurrentValues.Add(paramDiscreteValueFrom);
        paramFieldTo.CurrentValues.Add(paramDiscreteValueTo);
        paramFieldEmployeeId.CurrentValues.Add(paramDiscreteEmployeeId);
        paramFieldRetentionDays.CurrentValues.Add(paramDiscreteValueRetentionDays);
        paramFieldExTax.CurrentValues.Add(paramDiscreteValueExTax);
        paramFieldShowDefinitions.CurrentValues.Add(paramDiscreteValueShowDefinitions);

        myParams.Add(paramFieldFrom);
        myParams.Add(paramFieldTo);
        myParams.Add(paramFieldEmployeeId);
        myParams.Add(paramFieldRetentionDays);
        myParams.Add(paramFieldExTax);
        myParams.Add(paramFieldShowDefinitions);

        cryViewer.ParameterFieldInfo = myParams;

        cryViewer.Refresh();

        cryViewer.ReportSource = cryRpt;
    }

我会添加一些说明,报告位置是从另一个表单传递给此方法的,然后在返回时运行.Show()。
编辑:好的,我刚刚进行了更多测试,如果我的连接是machinename\dbinstance,它也不起作用,但是(local)\instancename可以工作。报告文件中的命令对象具有(local)\instancename的连接设置,这是问题吗?

你尝试过在设置ReportSource之后设置参数吗?(例如:cryViewer.ParameterFieldInfo["FromDate"].Add(paramDiscreteValueFrom) - jjj
我已经追踪到问题所在,原因是子报表有自己的命令对象。实际上,这个子报表并不需要作为子报表存在,所以我进行了更改,现在一切正常。 - Stuart1044
1个回答

0

在这种情况下,我的子报表有它自己的命令对象,这就是问题所在。我已经更改了报表,使得子报表不再存在(非常基本且实际上不需要分开),问题也随之停止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接