SSRS ReportExecutionServce.LoadReport 卡住了
SSRS ReportExecutionServce.LoadReport gets stuck
考虑以下示例代码:
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 服务器完全没有任何进展。
如果正在加载的报表包含用于填充参数可用值的数据集,并且该数据集基于从 SomeTable
.[=12 读取行的查询,则此程序将卡住=]
LoadReport 最终会超时,并且将留下零有用信息来帮助您弄清楚发生了什么。
可能的解决方案:
- 更改报告以在
SomeTable
上执行“脏读”
- 将数据库更改为快照隔离模式以避免锁定table。
我 运行 认为这是一个系统的实际生产问题,该系统 运行 按计划报告,报告 运行 是“计划报告历史记录”报告.
微妙之处在于 LoadReport 运行s 查询 - 回想起来,很明显它必须 运行 查询,因为参数的可用值包含在 LoadReport 返回的 ExecutionInfo 中。
考虑以下示例代码:
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 服务器完全没有任何进展。
如果正在加载的报表包含用于填充参数可用值的数据集,并且该数据集基于从 SomeTable
.[=12 读取行的查询,则此程序将卡住=]
LoadReport 最终会超时,并且将留下零有用信息来帮助您弄清楚发生了什么。
可能的解决方案:
- 更改报告以在
SomeTable
上执行“脏读”
- 将数据库更改为快照隔离模式以避免锁定table。
我 运行 认为这是一个系统的实际生产问题,该系统 运行 按计划报告,报告 运行 是“计划报告历史记录”报告.
微妙之处在于 LoadReport 运行s 查询 - 回想起来,很明显它必须 运行 查询,因为参数的可用值包含在 LoadReport 返回的 ExecutionInfo 中。