c# - SSRS ReportExecutionServce.LoadReport 卡住
问题描述
考虑以下示例代码:
using System.Data.SqlClient;
namespace ReportLoadTest
{
class Program
{
static void Main(string[] args)
{
using (var con = new SqlConnection("...your connection string here..."))
{
con.Open();
var trans = con.BeginTransaction();
var cmd = con.CreateCommand();
cmd.Transaction = trans;
cmd.CommandText = @"insert SomeTable(...columns...) values (...); select scope_identity()";
var rows = cmd.ExecuteScalar();
var rs = new SSRS.ReportExecutionService();
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
rs.Url = "http://localhost/ReportServer/ReportExecution2005.asmx";
var ei = rs.LoadReport("/Folder/Folder/Some report", null);
}
}
}
}
在什么情况下这个程序会在调用时“卡住” ReportExecutionService.LoadReport
?
卡住是指 0 CPU、0 I/O - 调用程序、Reporting Services 或 SQL Server 根本没有任何进展。
解决方案
如果正在加载的报表包含用于填充参数可用值的数据集,并且该数据集基于从SomeTable
.
LoadReport 最终会超时,并且会留下零有用的信息来帮助您弄清楚发生了什么。
可能的解决方案:
- 更改报告以执行“脏读”
SomeTable
- 将数据库更改为快照隔离模式以避免锁定表。
我遇到了一个实际的生产问题,系统按计划运行报告,并且正在运行的报告是“计划报告历史”报告。
微妙之处在于 LoadReport 运行查询 - 回想起来,很明显它必须运行查询,因为参数的可用值包含在 LoadReport 返回的 ExecutionInfo 中。
推荐阅读
- json - 我可以像在配置中为 sublime 做文件夹一样排除文件吗?
- c# - Monogame 程序不断随机丢弃大量帧
- java - 如何使用 HtmlUnit 驱动程序验证代理?
- mysql - 使用子查询时的 MySQL 分组
- r - “找不到对象'mtcars1'”:olsrr 函数中的错误
- datetime - Flutter DateTime , 打开关闭 if
- oracle-apex - 在两个 Oracle Apex 页面之间传输 blob
- sql-server - 如何计算每月的数量,然后在同一个选择语句中取平均值
- python - 如何有效地计算二维点的三个向量之间的全角(2pi)
- typescript - How to change a bitmap drawn on a canvas with vue-nativescript on android?