c# - 如何修复设置报表参数时出现的这个rdlc本地报表处理错误
问题描述
我想在不使用报告查看器的情况下保存 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);
解决方案
这是一条令人讨厌的错误消息,但只要您的 rdlc 运行时版本大于 2015,您就应该能够利用它的鲜为人知的改进:查看InnerException
,并将处理程序附加到ReportError 事件。
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;
}
将详细说明哪个参数是罪魁祸首以及它有什么问题。常见原因:拼写错误、类型不匹配、可空性不匹配。
推荐阅读
- java - 我的代码不允许我将图像放入我的 java 代码中
- mysql - SQL:我们可以选择一列中的内容作为新表中的新列吗?
- c# - Nuget.Core 下载所有 Nuget-Packages 身份验证失败
- image - 请告诉我如何从图像中创建切换?
- javascript - JavaScript/CSS - 查找具有特定表达式的文本并将 css 添加到它
- javascript - 在 React 中,根据先前和当前的 props 在哪里设置状态?
- ruby - 我的 if 语句 'if x + y = z' 有什么问题
- node.js - 在 Nodejs 集群的主代码内部或外部定义变量有什么区别?
- angular - 旧 Angular 2 项目 - 成功的生产构建有 javascript 运行时错误
- javascript - 如何将文件限制为仅在 Angular 文件上传中编码的 UTF-8?