【问题标题】:How to fix this rdlc local report processing error which occures when setting the report parameters如何修复设置报表参数时出现的这个rdlc本地报表处理错误
【发布时间】:2019-10-02 21:19:57
【问题描述】:

我想在不使用报告查看器的情况下保存 rdlc 报告,并且在没有报告参数的情况下我成功了,就像当我尝试将报告参数添加到报告时,我得到了“报告处理错误”。

我尝试在不带参数的情况下保存报告,它可以正常工作,但是一旦我添加参数,它就会生成此错误。

try
{
                using (IDbConnection db = new SQLiteConnection(ConfigurationManager.ConnectionStrings["cs"].ConnectionString))
                {
                    if (db.State == ConnectionState.Closed)
                    {
                        db.Open();
                    }
                    string getOrderItems = "Select * from OrderItems where OrderId = 20";
                    List<OrderItem> orderItems = db.Query<OrderItem>(getOrderItems, commandType: CommandType.Text).ToList();
                    OrderItemBindingSource.DataSource = orderItems;
                }
                LocalReport orderReceipt = new LocalReport();
                orderReceipt.ReportPath = @"D:\ADiTM\Products\ADiTmPoS\ADiTmPoS\Reports\OrderReceipt.rdlc";
                ReportDataSource rds = new ReportDataSource();
                rds.Name = "orderItem";
                rds.Value = this.OrderItemBindingSource;
                orderReceipt.DataSources.Add(rds);
                ReportParameter[] parameters = new ReportParameter[]
                {
                    new ReportParameter("CustomerName",orderDetail.CustomerName),
                    new ReportParameter("CustomerContactNumber",orderDetail.CustomerContactNumber),
                    new ReportParameter("CustomerAddress",orderDetail.CustomerAddress),
                    new ReportParameter("OrderId",orderDetail.Id.ToString()),
                    new ReportParameter("Date",orderDetail.Date.ToString("MM/DD/yyyy")),
                    new ReportParameter("Status",orderDetail.Status),
                    new ReportParameter("StaffName",orderDetail.StaffName),
                    new ReportParameter("StaffMobileNumber",orderDetail.StaffMobileNumber),
                    new ReportParameter("UserName",orderDetail.UserName)

                };
                orderReceipt.SetParameters(parameters);

                Byte[] mybytes = orderReceipt.Render("PDF");
                using (var fbd = new FolderBrowserDialog())
                {
                    DialogResult result = fbd.ShowDialog();
                    if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
                    {
                        using (FileStream fs = File.Create(fbd.SelectedPath + "OrderReceipt22.pdf"))
                        {
                            fs.Write(mybytes, 0, mybytes.Length);
                        }
                        MetroFramework.MetroMessageBox.Show(this, "Order Receipt Saved", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }
            }
            catch (Exception ex)
            {
                MetroFramework.MetroMessageBox.Show(this, ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

我使用断点,它给出了错误

orderReceipt.SetParameters(parameters);

【问题讨论】:

    标签: c# sqlite rdlc


    【解决方案1】:

    这是一条恼人的错误消息,但有一个鲜为人知的改进,只要您的 rdlc 运行时版本 > 2015,您就可以利用它:查看InnerException,并将处理程序附加到ReportError event.

    orderReceipt.ReportError += new EventHandler(orderReceipt_ReportError);
    

    private void orderReceipt_ReportError(object sender, ReportErrorEventArgs e)
    {
        MetroFramework.MetroMessageBox.Show(this, e.Exception.ToString(), "Failed!", MessageBoxButtons.OK, MessageBoxIcon.Information);
        e.Handled = true;
    }
    

    将详细说明哪个参数是罪魁祸首以及它有什么问题。常见原因:拼写错误、类型不匹配、可空性不匹配。

    【讨论】:

    • 我收集了内部异常,它说“报告的定义无效”
    • 您还需要ReportError 事件的处理程序。它将收到更多详细信息,包括第一个失败的参数的名称(如果它确实是参数问题,毕竟 - 我也遇到了 rdlc 文件版本和引擎版本之间的版本不匹配)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多